рубрики: СКД | Дата: 15 ноября, 2016
Скачать обработку с примерами из статьи: SKD+DCSC.epf
Платформа: 8.3; Тип формы: управляемая.
В этой статье рассмотрим как можно связать между собой схему компоновки данных с
компоновщиком настроек компоновки данных. Как обычно рассмотрим это на простейшем
практическом примере.
Допустим, что у нас есть два справочника: Склады
и Товары. В справочнике товаров есть табличная часть ПереченьСкладов
в которой указывается на каких складах может храниться товар и его максимальное
количество для каждого склада.
Допустим нам потребовалась групповая обработка для записи максимального количества
товаров на складах. Табличная часть у нас будет в виде дерева значений, плюс заполнение
ее надо реализовать с возможностью отборов как по складам, так и по товару.
Реализовывать ее будем на управляемых формах. В общем вот так должен выглядеть итоговый вариант
обработки в режиме 1С:Предприятия после установки отборов и заполнения табличной части.
А теперь подумаем как можно это реализовать.
Поскольку нам необходимы отборы, то сразу напрашивается использование схемы
компоновки данных. Поэтому создаем обработку и добавляем макет с типом
Схема компоновки данных и форму.
В схему компоновки данных вставляем вот такой запрос:
ВЫБРАТЬ
ТоварыПереченьСкладов.Ссылка КАК Товар,
ТоварыПереченьСкладов.Склад,
ТоварыПереченьСкладов.МаксимальноеКоличество КАК Количество
ИЗ
Справочник.Товары.ПереченьСкладов КАК ТоварыПереченьСкладов
и настраиваем ее следующим образом
Переходим к проектированию формы.
Первым делом попробуем реализовать отбор. Добавляем реквизит формы и смотрим доступные
типы для него. Видим, что кроме типа КомпоновщикНастроекКомпоновкиДанных
у нас нет ничего более подходящего, чтобы реализовать отбор.
После выбора этого типа видим, что у него есть три подчиненных элемента. Нас
интересуют Настройки с типом НастройкиКомпоновкиДанных.
Раскрываем Настройки, находим в них Отбор, и перетаскиваем его
на форму.
Далее добавляем реквизит с типом ДеревоЗначений и создаем колонки согласно
схеме компоновки данных. Создание и заполнение дерева значений уже рассматривалось
в статье про дерево значений на форме.
В результате этих манипуляций получаем следующую картину
Теперь нам предстоит программно заполнить отбор из настроек компоновщика настроек
на основании отбора схемы компоновки данных. И потом реализовать заполнение дерева
значений с учетом этого отбора. Приведу сразу итоговый код, а потом уже его
прокомментирую.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ФормаОбъект = РеквизитФормыВЗначение("Объект");
СхемаКД = ФормаОбъект.ПолучитьМакет("СКД_ТоварыСклады");
ВременноеХранилищеСКД = ПоместитьВоВременноеХранилище(СхемаКД, УникальныйИдентификатор);
КомпоновщикНастроекКД.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(ВременноеХранилищеСКД));
КомпоновщикНастроекКД.ЗагрузитьНастройки(СхемаКД.НастройкиПоУмолчанию);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьДеревоНаСервере()
ФормаОбъект = РеквизитФормыВЗначение("Объект");
СхемаКД = ФормаОбъект.ПолучитьМакет("СКД_ТоварыСклады");
НастройкиКД = КомпоновщикНастроекКД.Настройки;
КомпоновщикМакетаКД = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКД = КомпоновщикМакетаКД.Выполнить(СхемаКД, НастройкиКД,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКД = Новый ПроцессорКомпоновкиДанных;
ПроцессорКД.Инициализировать(МакетКД);
ДеревоСкладТовар = Новый ДеревоЗначений;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ДеревоСкладТовар);
ПроцессорВывода.Вывести(ПроцессорКД);
ЗначениеВРеквизитФормы(ДеревоСкладТовар, "ДеревоСкладыТовары");
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьДерево(Команда)
ЗаполнитьДеревоНаСервере();
КонецПроцедуры
В процедуре ПриСозданииНаСервере() у нас реализовано заполнение отбора
компоновщика настроек. В статье Вывод отчета СКД программно
тоже использовался компоновщик настроек. Но там все было гораздо проще, т.к. там
я рассматривал внешний отчет. И компоновщик настроек там присутствует по умолчанию.
А здесь мы имеем дело с обработкой. И здесь при инициализации компоновщика настроек
из схемы компоновки данных сталкиваемся с неочевидным моментом. Дело в том, что
схему компоновки данных надо предварительно поместить во временное хранилище с
помощью метода ПоместитьВоВременноеХранилище()
После установки нужных нам отборов, заполняем табличную часть с деревом значений.
Здесь стоит сказать пару слов про формирование макета компоновки данных. Вот про
эти три строчки кода
НастройкиКД = КомпоновщикНастроекКД.Настройки;
КомпоновщикМакетаКД = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКД = КомпоновщикМакетаКД.Выполнить(СхемаКД, НастройкиКД,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
Как известно макет формируется на основании схемы компоновки данных и настроек
компоновки данных. Но поскольку отбор на форме у нас принадлежит не схеме компоновки,
а компоновщику настроек, то и настройки берем из компоновщика настроек, которые
впрочем как мы помним заполнялись ПриСозданииНаСервере() из настроек схемы компоновки.
Поэтому по структуре они идентичны, за исключением значений отбора. И последнее, что
хочется отметить, в методе Выполнить() при генерации макета необходимо
указать в качестве параметра Тип(«ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений»)
Макет компоновки данных представляет собой уже готовое описание того, как должен быть сформирован отчет. В нем соединяется схема компоновки и настройки компоновки. Фактически макет компоновки данных представляет собой результат применения конкретных настроек к схеме компоновки и является готовым заданием процессору компоновки на формирование отчета нужной структуры с учетом конкретных настроек.