Профессия — 1С

Рукопашный бой Карташ

Категории

Схема компоновки данных и компоновщик настроек

рубрики: СКД | Дата: 15 Ноябрь, 2016
Скачать обработку с примерами из статьи: SKD+DCSC.epf
Платформа: 8.3; Тип формы: управляемая.

В этой статье рассмотрим как можно связать между собой схему компоновки данных с
компоновщиком настроек компоновки данных. Как обычно рассмотрим это на простейшем
практическом примере.




Допустим, что у нас есть два справочника: Склады
и Товары. В справочнике товаров есть табличная часть ПереченьСкладов
в которой указывается на каких складах может храниться товар и его максимальное
количество для каждого склада.

Допустим нам потребовалась групповая обработка для записи максимального количества
товаров на складах. Табличная часть у нас будет в виде дерева значений, плюс заполнение
ее надо реализовать с возможностью отборов как по складам, так и по товару.




Реализовывать ее будем на управляемых формах. В общем вот так должен выглядеть итоговый вариант
обработки в режиме 1С:Предприятия после установки отборов и заполнения табличной части.

А теперь подумаем как можно это реализовать.
Поскольку нам необходимы отборы, то сразу напрашивается использование схемы
компоновки данных. Поэтому создаем обработку и добавляем макет с типом
Схема компоновки данных и форму.

В схему компоновки данных вставляем вот такой запрос:



ВЫБРАТЬ
    ТоварыПереченьСкладов.Ссылка КАК Товар,
    ТоварыПереченьСкладов.Склад,
    ТоварыПереченьСкладов.МаксимальноеКоличество КАК Количество
ИЗ
    Справочник.Товары.ПереченьСкладов КАК ТоварыПереченьСкладов

и настраиваем ее следующим образом

Переходим к проектированию формы.
Первым делом попробуем реализовать отбор. Добавляем реквизит формы и смотрим доступные
типы для него. Видим, что кроме типа КомпоновщикНастроекКомпоновкиДанных
у нас нет ничего более подходящего, чтобы реализовать отбор.

После выбора этого типа видим, что у него есть три подчиненных элемента. Нас
интересуют Настройки с типом НастройкиКомпоновкиДанных.
Раскрываем Настройки, находим в них Отбор, и перетаскиваем его
на форму.
Далее добавляем реквизит с типом ДеревоЗначений и создаем колонки согласно
схеме компоновки данных. Создание и заполнение дерева значений уже рассматривалось
в статье про дерево значений на форме.
В результате этих манипуляций получаем следующую картину

Теперь нам предстоит программно заполнить отбор из настроек компоновщика настроек
на основании отбора схемы компоновки данных. И потом реализовать заполнение дерева
значений с учетом этого отбора. Приведу сразу итоговый код, а потом уже его
прокомментирую.



&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
    ФормаОбъект	= РеквизитФормыВЗначение("Объект");
    СхемаКД	= ФормаОбъект.ПолучитьМакет("СКД_ТоварыСклады");

    ВременноеХранилищеСКД = ПоместитьВоВременноеХранилище(СхемаКД, УникальныйИдентификатор);

    КомпоновщикНастроекКД.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(ВременноеХранилищеСКД));
    КомпоновщикНастроекКД.ЗагрузитьНастройки(СхемаКД.НастройкиПоУмолчанию);
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьДеревоНаСервере()
	
    ФормаОбъект	= РеквизитФормыВЗначение("Объект");
    СхемаКД	= ФормаОбъект.ПолучитьМакет("СКД_ТоварыСклады");

    НастройкиКД = КомпоновщикНастроекКД.Настройки;

    КомпоновщикМакетаКД	= Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКД		= КомпоновщикМакетаКД.Выполнить(СхемаКД, НастройкиКД,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

    ПроцессорКД = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКД.Инициализировать(МакетКД);

    ДеревоСкладТовар	= Новый ДеревоЗначений;
    ПроцессорВывода	= Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    ПроцессорВывода.УстановитьОбъект(ДеревоСкладТовар);
    ПроцессорВывода.Вывести(ПроцессорКД);

    ЗначениеВРеквизитФормы(ДеревоСкладТовар, "ДеревоСкладыТовары");	
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьДерево(Команда)
    ЗаполнитьДеревоНаСервере();
КонецПроцедуры

В процедуре ПриСозданииНаСервере() у нас реализовано заполнение отбора
компоновщика настроек. В статье Вывод отчета СКД программно
тоже использовался компоновщик настроек. Но там все было гораздо проще, т.к. там
я рассматривал внешний отчет. И компоновщик настроек там присутствует по умолчанию.
А здесь мы имеем дело с обработкой. И здесь при инициализации компоновщика настроек
из схемы компоновки данных сталкиваемся с неочевидным моментом. Дело в том, что
схему компоновки данных надо предварительно поместить во временное хранилище с
помощью метода ПоместитьВоВременноеХранилище()
После установки нужных нам отборов, заполняем табличную часть с деревом значений.
Здесь стоит сказать пару слов про формирование макета компоновки данных. Вот про
эти три строчки кода



НастройкиКД = КомпоновщикНастроекКД.Настройки;

КомпоновщикМакетаКД	= Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКД		= КомпоновщикМакетаКД.Выполнить(СхемаКД, НастройкиКД,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

Как известно макет формируется на основании схемы компоновки данных и настроек
компоновки данных. Но поскольку отбор на форме у нас принадлежит не схеме компоновки,
а компоновщику настроек, то и настройки берем из компоновщика настроек, которые
впрочем как мы помним заполнялись ПриСозданииНаСервере() из настроек схемы компоновки.
Поэтому по структуре они идентичны, за исключением значений отбора. И последнее, что
хочется отметить, в методе Выполнить() при генерации макета необходимо
указать в качестве параметра Тип(«ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений»)

Один комментарий на «“Схема компоновки данных и компоновщик настроек”»

  1. Andrey:

    Макет компоновки данных представляет собой уже готовое описание того, как должен быть сформирован отчет. В нем соединяется схема компоновки и настройки компоновки. Фактически макет компоновки данных представляет собой результат применения конкретных настроек к схеме компоновки и является готовым заданием процессору компоновки на формирование отчета нужной структуры с учетом конкретных настроек.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

   

2018г. Профессия — 1С. Обмен опытом по программированию в 1С