Для чего может применяться СКД?
Устоявшееся мнение – для отчетов.
На самом деле возможности СКД выходят за рамки построения универсальных отчетов.
И сегодня мы покажем, как с помощью СКД пользователь сможет настраивать гибкий отбор данных. Далее этот отбор будет использоваться при получении и обработке данных.
Для каких задач это будет полезно?
Приведем примеры из типовых конфигураций:
- Обработка «Выгрузка данных на сайт»
- Формирование прайс-листа
- Выгрузка данных в ТСД (терминал сбора данных)
- Сегментирование товаров, партнеров
- Формирование заказов (клиентов, поставщикам) по потребностям
- Планирование ремонтов в 1C:ERP.
То есть инструмент полезен везде, где нужно предоставить пользователю широкие возможности отбора.
Что важно – есть возможность сохранить в ИБ настроенные отборы для дальнейшего использования. Так, например, можно зафиксировать сегменты партнеров.
Создание произвольного отбора в управляемой форме с использованием СКД
В уроке рассмотрена работа с компоновщиком настроек схемы компоновки данных:
- Вывод отбора на форму
- Программная связь компоновщика настроек и схемы компоновки
- Создание отборов по умолчанию в СКД.
Получение данных из базы с фильтрацией по отбору СКД
В видео показано, как можно выбрать данные с помощью ранее установленного отбора в компоновщике настроек.
Используется “страшный” объект – ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений.
На самом деле, не все так сложно – за 8 минут мы решаем поставленную задачу.
Хранение отборов СКД в информационной базе
В уроке рассмотрим сохранение настроек компоновщика СКД с помощью Хранилища значений.
Разбираемся, как решить эту задачу в конфигурации “1С:Управление производственным предприятием 1.3”.
Приятного просмотра! :)
Вообще, СКД предоставляет массу возможностей.
Вот несколько “фишечек”, которые мы даже не успели описать на странице курса.
Если нужно собрать данные из разных источников, есть три варианта.
Можно пытаться составлять один “универсальный” запрос для всех данных (долго), можно в цикле выводить данные нескольких запросов (жесткая, негибкая структура) – а можно просто задействовать СКД и соединение наборов данных вместо одного запроса.
При этом важно получить корректные итоги – в этом есть особенности, если источников несколько
При помощи СКД можно просто получить срез последних на каждую дату в отчете.
Или, для наглядности, – получить цену товара на каждую дату продажи.
С помощью СКД можно организовать вывод в отчет всех дат за период, а не только тех, на которые были данные в отчете (дополнение дат без программирования, только возможностями СКД)
С помощью СКД можно организовать вложенные группировки с дополнением периодов (год/квартал/месяц и т.д.)
Произвольно оформить отчет, например, вывести заголовок колонки вертикально, а данные в этой колонке – горизонтально.
Дать пользователю самому выбирать периодичность, с которой данные будут выводиться в отчет (по годам, по кварталам, по месяцам) – исключительно настройками, без редактирования модуля отчета.
Как в отчете соединить несколько условий по ИЛИ? Такой возможности, например, в построителе отчета нет – но есть в СКД
Если Вы выводите сводные данные в виде диаграммы, нужно уметь точно управлять внешним ее видом: видимостью маркеров для серии, чередованием цветов серий графика, отделять на графике вертикальной линией прошлые данные от будущих и т.п.
Безусловно, здесь есть и нюансы, на которые нужно обращать внимание
При создании отчета разработчик отладил текст запроса, но при использовании этого запроса в отчете на СКД система выдает неверный результат.
Поэтому важно уметь получить запрос, который на самом деле выполняет система для получения данных из базы, и отладить такой запрос.
При добавлении в отчет детализации до документа-регистратора система иногда выдает “некорректные” начальные и конечные остатки.
Поэтому важно корректно настроить поля в отчете на СКД, чтобы остатки выводились корректно и с детализацией до документа, и без нее.
Результат отчета может измениться в зависимости от того, где настроен отбор по значению ресурса – на уровне отчета и на уровне отдельной группировки, за этим нужно следить.
Если Вы хотите профессионально освоить СКД и ежедневно применять в своей работе, записывайтесь на курс:
«Профессиональная разработка отчетов в 1С 8.3 на Системе Компоновки Данных (СКД)»
Поддержка – 2 месяца. Объем курса – 34 учебных часа.
Не откладывайте свое обучение!
Добрый день!
Можно ли удалить (скрыть) отдельные элементы из “доступныеполяотбора “?
Спасибо.
Добрый день!
Можно только настроить ограничение по использованию условий для поля набора данных или его вложенных полей:
С этим сложно. Вопрос касается ЗУП 3.1. Запрос СКД формируется с помощью программного интерфейса. ” ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета(СтруктураОбъект, СоответствиеПолей);”
В результате этого в “доступныеполяотбора” попадают элементы, которые пользователь не хочет видеть при нажатии кнопки “Добавить условие” в отборе. Что можете посоветовать?
Спасибо.
Можно попробовать программно изменить получившийся набор данных – снять в нем ограничения условий для ряда полей, например, переопределить этот метод при помощи расширения.
Добрый день. Спасибо за предоставленный материал. Возникла проблема с подбором групп в отбор. Если установть вид отбора “в группе”, то открывается форма справочника с возможностью выбора групы. Если установить вид отбора “в группе из списка”, то открывается форма списка, в который нужно добавить группы. Из формы этого списка открывается форма справочника без возможности выбора групп. Только элементы. Как решить данную проблему? Спасибо.
Разобрался сам. По логике платформы все правильно. При значении отбора “в группе” нужно открывать форму выбора группы. При значении отбора “в группе из списка” нужно открывать форму списка. Разработчики конфигурации не предусмотрели возможность выбора группы из списка.
Добрый день!
Отлично, что разобрались! Интересного обучения!
Здравствуйте, м.б. не в тему, но как мне, например, программно (не нажимая на пиктограмму корня) развернуть/свернуть дерево динамического списка, которое группируется при помощи компоновщика настроек?
Добрый день!
В БСП в общем модуле СтандартныеПодсистемыКлиент есть готовая процедура РазвернутьУзлыДерева, которая разворачивает узлы дерева на форме.
В процедуре используется метод Развернуть таблицы формы. По аналогии можно использовать метод Свернуть для сворачивания дерева.
Василий, благодарю, но не работает…
Пишу:
СтандартныеПодсистемыКлиент.РазвернутьУзлыДерева(ЭтаФорма, “Список”, “*” , Истина);
Ошибка:
{ОбщийМодуль.СтандартныеПодсистемыКлиент.Модуль(861)}: Метод объекта не обнаружен (ПолучитьЭлементы)
Узлы = Форма[ИмяЭлементаФормы].ПолучитьЭлементы();
Предполагаю, что дело в типах данных. В комментарии перед процедурой есть комментарий:
ИмяЭлементаФормы – Строка – имя элемента с таблицей формы (деревом значений) и связанного с ней реквизита формы (должны совпадать).
А в Вашем случае получается, что Список – это не дерево значений. Поэтому данный метод и не работает.
Значит, идентификатором строки динамического списка будет ссылка справочника, который является основной таблицей списка.
Можно попробовать выбрать программно все значения группировок и передать их в метод Развернуть:
Для Каждого ТекущаяГруппа Из МассивГрупп Цикл
Элементы.Список.Развернуть(ТекущаяГруппа, Истина);
КонецЦикла;
Т.е. программно выполняем действия по последовательному разворачиванию всех групп из справочника.
Все не так (жаль, невозможно присоединить снимок), постараюсь описать на словах.
Есть форма справочника “Файлы”. Справочник – не иерархический.
На форме есть элемент, он же – реквизит – “Список”. У реквизита “Список”, тип – Динамический список. У элемента “Список”, отображение – Дерево.
Так же есть реквизит – “Файл”, тип – СправочникСсылка.Файлы.
В этом динамическом списке – “Список”, отображены UNC-пути к файлам.
Этот список можно настраивать стандартным интерфейсным механизмом – Настройка списков.
Список имеет многоуровневую группировку.
Задача: необходимо кнопкой сворачивать/разворачивать многоуровневую группировку.
У меня это получается при помощи кода:
ВершинаДерева = Элементы.Список.ТекущаяСтрока;
Если Элементы.Список.Развернут(ВершинаДерева) Тогда
Элементы.Список.Свернуть(ВершинаДерева);
Иначе
Элементы.Список.Развернуть(ВершинаДерева, Истина);
КонецЕсли;
Но вся проблема состоит в том, что это работает, когда находишься на какой-то конкретной строке (ТекущаяСтрока), а требуется, чтобы независимо на какой строке находишься, по нажатию кнопки, группировка сворачивалась/разворачивалась.
Используемая конфигурация: 1С:PM Управление проектами.
В целом у Вас получился такой же код, как и в моем предыдущем комментарии.
Существует один метод Развернуть, который разворачивает ветвь дерева. Нужно этому методу передать правильные параметры – вызвать его для тех строк, которые требуется развернуть.
Для этого нужно определить список всех идентификаторов строк, которые должны быть развернуты. В моем примере это группы справочника (ссылки, т.к. основной таблицей динамического списка является справочник Номенклатура), в Вашем случае будут определяться по другой логике. Вот эту логику и необходимо реализовать – определить, какие именно строки дерева должны развораиваться, затем программно их развернуть.
Также важно, что ТекущаяСтрока для динамического списка содержит значение, идентифицирующее строку (это может быть как порядковый номер, так и ссылка в зависимости от того, есть ли основная таблица у динамического списка). Со ссылками в общем случае будет удобнее работать, удобнее идентифицировать строки списка.
Или еще вариант – вместо динамического списка сделать дерево на форме, тогда можно будет использовать метод СтандартныеПодсистемыКлиент.РазвернутьУзлыДерева.
Вот таким образом я представляю себе решение задачи.
Не совсем понятно, зачем помещать во временное хранилище схему, в одном и том же серверном вызове ?, вроде как КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СКД)) норм отрабатывает… и второй вопрос получения макета для встроенных объектах, лучше получать через статический метод менеджера объекта: Обработка.МояОбработка.ПолучитьМакет(«СКД») ? чем РеквизитФормыВЗначение, чтобы не трать время на конвертацию и получения объекта.
Добрый день!
1. Разработчики платформы рекомендуют для управляемых форм применять такой способ – поместить схему во временное хранилище и инициализировать источник доступных настроек полученным адресом:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СКД = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");
АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(СКД, УникальныйИдентификатор);
ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресВоВременномХранилище);
КомпоновщикНастроек.Инициализировать(ИсточникНастроек);
КомпоновщикНастроек.ЗагрузитьНастройки(СКД.НастройкиПоУмолчанию);
КонецПроцедуры
В противном случае может возникать непонятное поведение системы, например, в пользовательском режиме список доступных полей отбора окажется пустым.
Тут дело в том, что в управляемом приложении на клиенте схема компоновки данных отсутствует. Подробнее в статье на сайте ИТС – Редактирование настроек для не основной схемы компоновки данных.
2. Для объектов из основной конфигурации можно использовать указанный фрагмент кода, чтобы не получать сам объект:
В типовых конфигурациях в большинстве случаев так и делается.
Но если мы создаем внешнюю обработку, то так сделать не получится, поэтому выполняем конвертацию реквизита формы в значение:
В моем пониманию временное хранилище это переменная на сервере доступная по адресу и предназначена для хранения объектов доступных только на сервере или данных которых нет смысла гонять сервера на клиент туда-сюда, чтобы не нагружать канал и используется временное хранилище именно для межсерверных вызовов. В одном серверном вызове мы туда поместили данные, на клиент передали адрес и во втором серверном вызове по адресу используем. А так получается в одном контексте условно – переменная А = 1, мы эту переменную помещаем в хранилище и по адресу получаем значение 1, если это значение и так доступно нам, что и вызывает недоумение. Я извиняюсь за дотошность, но либо я чего-то недопонимаю по работе временного хранилище, либо это просто надо запомнить как аксиому для Компоновщика ?
Да, это нужно запомнить. В управляемых формах нужно использовать создание источника доступных настроек именно для адреса схемы компоновки данных.
Как этот нюанс объясняют разработчики платформы?
Лейбович Максим (1С, Москва)
Источник на основании схемы нельзя использовать в управляемом приложении, т.к. на клиенте схема компоновки данных отсутствует.
https://partners.v8.1c.ru/forum/t/1245259/m/1246544
Действительно, работа пользователя с компоновщиком настроек происходит на клиенте (например, настройка структуры отчета, отборов и т.д.). На клиенте схема компоновки данных недоступна. В Синтакс-помощнике смотрим доступность: сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Поэтому чтобы на клиенте корректно отображались доступные поля используется именно адрес во временном хранилище.
А вот для обычной формы можно создавать источник доступных настроек для схемы компоновки данных. И это будет работать, поскольку в толстом клиенте схема компоновки данных доступна.
Можно ли в одном компоновщике объединить отборы по несвязанным таблицам, без умножения таблиц?
Раньше работала схема.
ВЫБРАТЬ
Контрагенты.Ссылка КАК Контрагент,
NULL КАК Номенклатура
ИЗ
Справочник.Контрагенты КАК Контрагенты
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
NULL,
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
Но после повышения режима совместимости конфигурации до 8.3.14 – комбинация из двух отборов работать перестала, по отдельности можно указать отборы и они работают, но при указании обоих отборов – процессор возвращает пустую таблицу значений.
Добрый день!
В таком случае нужно в наборе данных – запросе снять галочку Автозаполнение, в тексте запроса при помощи фигурных скобок явно сказать системе, какие выбранные поля будут в запросе, как именно следует обрабатывать отборы:
Контрагенты.Ссылка КАК Контрагент,
NULL КАК Товар
{ВЫБРАТЬ
Контрагент.*,
Товар.*}
ИЗ
Справочник.Контрагенты КАК Контрагенты
{ГДЕ
Контрагенты.Ссылка.* КАК Контрагент}
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
NULL,
Товары.Ссылка
ИЗ
Справочник.Товары КАК Товары
{ГДЕ
Товары.Ссылка.* КАК Товар}
Это значит, что отбор на поле Контрагент будет устанавливаться только в первом запросе объединения, а отбор на поле Товар – только во втором.
Добрый день!
На форме есть Таблица с типом значения “КомпоновщикНастроек.Настройки.Отбор”.
Мне в эту таблицу нужны дополнительные колонки с моими данными.
Возможно ли это реализовать?
Колонки таблицы создать могу, но мне их надо связать с данными.
В реквизите КомпоновщикНастроек новых колонок добавить не могу.
Добрый день!
Это стандартный объект платформы, добавить в него свои дополнительные колонки не получится.
Поэтому надо придумывать обход. Например, на форму добавляем свою собственную таблицу значений с нужными колонками. Пользователь редактирует эту таблицу, по ней затем программно заполняем отбор компоновщика.
Спасибо
Пожалуйста!
Интересного обучения!
Спасибо за видео, очень помогло, не могла понять почему не отрабатывает корректно на клиенте, оказалось нужно URL использовать)
Пожалуйста!
2 видео посвящены управляемым формам, в третьем видео рассмотрено сохранение настроек в обычном приложении УПП 1.3. Как провести сохранение настроек в управляемых формах ?
Добрый день!
Логика будет такая же. В реквизите справочника с типом ХранилищеЗначения можно записать настройки компоновки. При открытии формы обращаться к этому реквизиту, получать сохраненные настройки компоновки, отображать отборы на форме.
А что насчёт сохранения параметров внешней обработки? А именно отбора компоновщика вынесенного на форму?
Добрый день!
В таком случае для реквизита формы (КомпоновщикНастроек.Настройки.Отбор) можно установить галочку сохранения данных в настройках:
Здравствуйте!
Подскажите пожалуйста, возможно ли реализовать такой отбор в табличной части? т.е. что бы пользователь добавлял строки и для каждой из них мог настроить свой отбор, открывая настройку отбора по кнопке с тремя точками в одной из колонок?
Добрый день!
Создаю на форме реквизит с типом ТаблицаЗначений. Для колонки таблицы можно использовать различные типы, связанные с компоновкой данных:
Попробуйте при помощи этих типов данных организовать на форме нужное поведение системы.
Спасибо за ответ! реализовал через тип ОтборКомпоновкиДанных, в этом очень помогло видео с разбором упп
Пожалуйста!
Обращайтесь:)
Обнаружил один нюанс, на клиенте все отрабатывает отлично, но когда делаю обход тч на сервере, то свойство ДоступныеПоляОтбора принимает значение Неопределено и это очень портит настроение (. Так же заметил и обратную связь, если на сервере инициализировать компоновщик настроек и передать отбор на клиент так же пропадают ДоступныеПоляОтбора.
Добрый день!
Разработчики платформы рекомендуют для управляемых форм применять именно способ, который показывается в видеоуроках, – поместить схему во временное хранилище и инициализировать источник доступных настроек его адресом. В противном случае может возникать непонятное поведение системы, например, в пользовательском режиме список доступных полей отбора окажется пустой.
Это связано с тем, что в управляемом приложении на клиенте схема компоновки данных отсутствует.
Предполагаю, что ваша ситуация связана с этими же особенностями системы.
Подробности есть в статье на сайте ИТС – Редактирование настроек для не основной схемы компоновки данных.
Скажите, а возможно ли посмотреть подходит ли конкретный элемент под условия? Например, я получил элемент справочника номенклатура и у меня есть отборы настроены при помощи системы компановки. Можно ли проверить, подходит ли мой элемент под эти отборы без выполнения запроса?
Добрый день!
В общем случае – нет. В зависимости от отборов в настройках компоновки будет изменяться текст запроса. Поэтому только после выполнения запроса, можно будет узнать, есть ли в результате искомый элемент.
Спасибо большое за ответ!
Жалко, что не показали, как выводить результат отбора при помощи СКД в отдельную таблицу. Все таки пользователи любят, когда они видят результат отбора и могут его редактировать.
Согласен, удобство работы пользователей – это очень важно. В программном коде мы получили таблицу значений, осталось ее визуализировать, здесь потребуется небольшая доработка.
и программно менять обработку выбора (у таких визуализированных отборов), чтобы например, открывать в определенной группе и не давать возможности переходить в другие группы – когда отбор выставляется не на равенство, а на входящий список значений.
Добрый день, Владимир!
Счет на оплату отправлен на Ваш E-mail. Реквизиты стандартно сохраняются в профиле. Возможно, причина в том, что Вы сохраняли реквизиты под другой учетной записью (у Вас их в интернет-магазине три).
По Первому видео.
Метод Инициализировать()
Доступность:
Сервер, толстый клиент, внешнее соединение.
Как можно использовать данные метод на тонком клиенте?
На сервере все прекрасно отрабатывает в таком варианте:
СКД = РеквизитФормыВЗначение(“Объект”).ПолучитьМакет(“Макет”);
ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СКД);
КомпановщикНастроек.Инициализировать(ИсточникНастроек);
КомпановщикНастроек.ЗагрузитьНастройки(СКД.НастройкиПоУмолчанию);
Добрый день!
В первом видео как раз используем метод Инициализировать() в процедуре ПриСозданииНаСервере(), т.е используется он на сервере.
По второму вопросы разработчики платформы рекомендуют для управляемых форм применять именно изложенный способ – поместить схему во временное хранилище и инициализировать источник доступных настроек его адресом. В противном случае может возникать непонятное поведение системы, например, в пользовательском режиме список доступных полей отбора окажется пустой.
Тут дело в том, что в управляемом приложении на клиенте схема компоновки данных отсутствует. Подробнее в статье на сайте ИТС – Редактирование настроек для не основной схемы компоновки данных.
Благодарю за ответ. У меня список доступных полей был пустым в обоих случаях, а выбранные поля отбора были помечены как удаленные. В чем может быть проблема?
Если с инициализацией источника доступных настроек все в порядке, то можно проверить права доступа и функциональные опции.
Василий прав, при таком подходе пишут(на сайте итс) что быстрее работает.
Добрый день!
Подскажите, пожалуйста, в курсе освещены отличия СКД в управляемом и неуправляемом приложениях?
Добрый день!
В курсе отмечаем некоторые особенности при работе с пользовательскими настройками, свойствами полей компоновки. Основной акцент делается на управляемое приложение. Остальные вопросы можем рассмотреть в рамках мастер-группы.
Ок, спасибо
Скажите, а где лучше посмотреть информацию о том, как использовать по максимуму на уровне пользователя возможности отчетов, выполненных с помощью СКД?
Отдельного курса на эту тему не делали.
Обычно во всех наших курсах по типовым конфигурациям есть уроки по настройке отчетов на СКД.
А текущем курсе по СКД мы уделили этому вопросу пристальное внимание – этому посвящено отдельное занятие.
Рассматриваем настройку отчетов на примере типовых – УТ 11, ЗУП 3.0, УНФ 1.6.
Мне, как не программисту, был бы интересен именно данный урок. Покупать целый курс из-за одного этого урока нецелесообразно.
Прошел не так давно Ваш курс по ЕРП – Производство, Подготовка к Профу и Спецу. Нигде не встретил описания настройки СКД.
Ок, возможно в будущем выделим в отдельный мини-курс пользовательскую настройку отчетов на СКД.
Здравствуйте, подскажите, не появился ли у вас курс по настройке СКД в пользовательском режиме
Добрый день, Маргарита! Нет, но в курсе Профессиональная разработка отчетов в 1С 8.3 на Системе Компоновки Данных (СКД) есть занятие, посвященное настройке отчетов в пользовательском режиме.
СКД вообще странно ведет себя с ФУ – недавно делал отчет в УТ11.2 где в самодельный макет выводиться “РасчетныйПараметр”=”Что_То”+”Остаток_по_регистру_РасчетыПоЭквайрингу”. Так вот если эквайринг выключен – “РасчетныйПараметр” становиться NULL даже при проверке на NULL при расчете “Остаток_по_регистру_РасчетыПоЭквайрингу”.
СКД не дружит с функциональными опциями: Выполнить(Схема, Настройки, ДанныеРасшифровки, МакетОформления, ТипГенератора, ПроверятьДоступностьПолей, ПараметрыФункциональныхОпций) ПараметрыФункциональныхОпций – игнорируется. Ни в одной типовой и БСП не нашел использования этого параметра.
Добрый день!
Также не встречал в типовых конфигурациях использования этого параметра метода. Предлагаю остановиться на этом вопросе в рамках мастер-группы.
Ок, обсудим в мастер-группе)
Хрусталева. Разработка сложных отчетов. Страница 119. Вроде как дружит все-таки.
В общем случае функциональные опции работают и используются. В курсе рассматриваются примеры работы с функциональными опциями.
Непонятное поведение системы в каждом конкретном случае нужно рассматривать отдельно, на примере.