Содержание:
1. Получение данных динамического списка
2. Хранение, изменение и получение настройки СКД для внешних объектов метаданных
Система компоновки данных дает нам возможность получать данные не только для построения отчетов, но и для других целей. Рассмотрим примеры использования системы компоновки данных (далее по тексту СКД) не для отчетов.
1. Получение данных динамического списка
С задачами такого рода программисты сталкиваются постоянно с момента появления динамических списков в 1С. Для решения этой задачи необходимо получить СКД данных динамического списка, выполнить схему и присвоить результат переменной для дальнейшей обработки. Пример:
&НаКлиенте
Процедура ОбработкаСКД()
Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
РезультатСКД = РезультатСКДДинамическогоСписка(Схема , Настройки);
КонецПроцедуры
&НаСервере
Функция РезультатСКДДинамическогоСписка(Схема, Настройки)
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема,Настройки,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Возврат Результат;
КонецФункции
Опишем наши действия:
· В процедуре «Обработка СКД»:
- Получаем схему компоновки данных, соответствующую данным, которые отображаются в динамическом списке;
- Получаем настройки компоновки данных, соответствующие данным в динамическом списке. При этом учитывается видимость колонок и установленное значение поиска. Вторым шагом является вызов функции «РезультатСКДДинамическогоСписка» с передачей полученной настройки.
· В функции «РезультатСКДДинамическогоСписка»:
- Первым шагом мы создаем объект макета компоновки данных;
- Вторым шагом производим инициализацию созданного объекта макета компоновки данных переданной настройкой компоновки списка;
- Третьим шагом создаем объект, выполняющий компоновку данных;
- Четвертым шагом инициализируем объект, выполняющий компоновку данных объектом макета компоновки данных;
- Пятым шагом является создание объекта для вывода результата компоновки в таблицу или дерево значений;
- Шестым шагом выводим весь результат в объект для вывода результата компоновки. При этом автоматически исполняется метод НачатьВывод, перебираются все элементы процессора компоновки и выводятся в результат. После чего исполняется метод ЗакончитьВывод, результат которого возвращается данным методом компоновки.
- Седьмым шагом передаем полученный результат из функции в точку вызова.
2. Хранение, изменение и получение настройки СКД для внешних объектов метаданных
Допустим есть следующая задача: нам необходимо получить данные динамического списка с использованием предопределённых настроек СКД.
Для решения этой задачи мы будем использовать такой объект метаданных как «Константа».
На первом шаге создадим константу «НастройкиОтбораСКД». Вторым шагом создадим общую форму редактирования констант «НастройкиОтборовСКД» и добавим на форму реквизит «КомпоновщикСхемы» как показано на рисунке 1.
Рисунок 1. Общая форма редактирования констант
Для корректной работы компоновщика необходимо:
· Произвести его начальную инициализацию;
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СхемаКомпоновки = ОбъектМетаданных.ПолучитьМакет("СхемаИнциализации");
АдресСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновки, ЭтаФорма.УникальныйИдентификатор);
КомпоновщикСхемы.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
Настройки = Константы.НастройкиОтбораСКД.Получить().Получить();
Если Настройки <> Неопределено Тогда
Компоновщик.ЗагрузитьНастройки(Настройки);
Иначе
Компоновщик.ЗагрузитьНастройки(СхемаКомпоновки.НастройкиПоУмолчанию);
КонецЕсли;
КонецПроцедуры
В процедуре «ПриСозданииНаСервере» в строке: СхемаКомпоновки = ОбъектМетаданных.ПолучитьМакет("СхемаИнциализации");
Необходимо заменить «ОбъектМетаданных» на конкретный объект метаданных, для которого определена система компоновки данных «СхемаИнциализации». Например «РегистрСведений. Штрихкоды».
· Загрузить предыдущие настройки СКД с учетом их наличия.
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
НастройкиХранилище = Новый ХранилищеЗначения(КомпоновщикСхемы.ПолучитьНастройки());
Константы.НастройкиОтбораСКД.Установить(НастройкиХранилище);
КонецПроцедуры
И в заключении как использовать внешний механизм настройки СДК. Например, в регистре сведений «Штрихкоды» перед очередной записью нам необходимо производить некоторые проверки с использованием сложной схемы получения данных, которую реализовать средствами запроса 1С корректно не получится. Для этого в процедуре «ПередЗаписью» модуля формы записи регистра сведений в 1С выполним следующие действия:
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
ПередЗаписьюНаСервере(Отказ, Запись);
КонецПроцедуры
Процедура ПередЗаписьюНаСервере (Отказ, Знач Запись)
// Таблица результатов проверки
РезультатПроверки = Новый ТаблицаЗначений;
Настройки = Константы.НастройкиОтбораСКД.Получить().Получить();
Если Настройки = Неопределено Тогда
Возврат;
КонецЕсли;
// Устанавливаем отбор по текущему элементу
ЭлементыОтбора = Настройки.Отбор.Элементы;
ЭлементОтбора = ЭлементыОтбора.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Штрихкод");
ЭлементОтбора.ПравоЗначение = Запись.Штрихкод;
// Программно делаем вывод результата в таблицу значений
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
СхемаКомпоновкиДанных = РегистрыСведений. Штрихкоды.ПолучитьМакет("СхемаИнциализации");
МакетКомпоновки = КомпоновщикМакета.Выполнить(
СхемаКомпоновкиДанных,
Настройки,,,
Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")
);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(РезультатПроверки);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Если РезультатПроверки.Количеств() = 0 Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Кратко опишем что получилось – в форме записи регистра сведений 1С «Штрихкоды» мы вызываем процедуру обработки записи «ПередЗаписьюНаСервере». В этой процедуре первым шагом инициализирует настройки СКД для схемы «СхемаИнициализации», затем получаем результат выполнения СКД и обрабатываем результат выполнения СКД.
Заключение: система компоновки данных предоставляет нам широкий набор инструментов обработки данных, который можно использовать не только для построения отчетов, но и для решения вполне конкретных задач.
Спасибо за внимание уважаемые коллеги.
Специалист компании «Кодерлайн»
Дмитрий Гречушкин