При разработке обработок часто возникает задача программного выполнения схемы компоновки данных (СКД) с учетом пользовательских отборов, установленных на форме, и последующей выгрузки полученных данных в табличную часть. Рассмотрим подробно, как правильно организовать этот процесс, чтобы избежать пустых результатов и ошибок при передаче данных между клиентом и сервером.
Основная проблема при работе с КомпоновщикНастроек в контексте управляемой формы заключается в том, что попытка использовать объект Компоновщик, полученный напрямую через РеквизитФормыВЗначение("Объект"), часто приводит к потере связи с метаданными схемы. В результате МакетКомпоновки оказывается пустым или некорректным, а ПроцессорВывода не заполняет таблицу значений данными.
Для корректного выполнения компоновки на сервере необходимо инициализировать новый компоновщик настроек, загрузить в него схему и настройки, а затем выполнить процедуру формирования макета.
КомпоновщикНастроекКомпоновкиДанных и привяжем его к источнику настроек из схемы.СКД.КомпоновщикМакетаКомпоновкиДанных с указанием генератора для коллекции значений.ПроцессорКомпоновкиДанных и ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений.Ниже представлен проверенный алгоритм действий, который позволит вам успешно загрузить данные в табличную часть:
&НаСервере
Процедура ПрочитатьНаСервере()
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
Обработка = РеквизитФормыВЗначение("Объект");
СхемаКомпоновкиДанных = Обработка.ПолучитьМакет("СКД");
// Создаем новый компоновщик для корректной инициализации
Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
Компоновщик.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
// Установка параметров
Компоновщик.Настройки.ПараметрыДанных.Элементы[0].Значение = КонецДня(Обработка.ДатаОкончания);
Компоновщик.Настройки.ПараметрыДанных.Элементы[0].Использование = Истина;
Компоновщик.Настройки.ПараметрыДанных.Элементы[1].Значение = Обработка.ДатаНачала;
Компоновщик.Настройки.ПараметрыДанных.Элементы[1].Использование = Истина;
// Подготовка вывода
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Компоновщик.Настройки, ДанныеРасшифровки, , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ТЗ = ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
// Загрузка в табличную часть
Обработка.ВыбранныеДокументы.Загрузить(ТЗ);
ЗначениеВРеквизитФормы(Обработка, "Объект");
КонецПроцедуры
ЗначениеВРеквизитФормы: После того как вы загрузили данные в объект Обработка на сервере, не забудьте вызвать метод ЗначениеВРеквизитФормы(Обработка, "Объект"), иначе визуальное отображение табличной части на форме не обновится.Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений") при вызове КомпоновщикМакета.Выполнить, в противном случае СКД будет пытаться построить табличный документ, что приведет к пустым результатам при попытке выгрузки в ТаблицаЗначений.ПроцессорВывода не сможет сформировать колонки и строки итоговой таблицы.Применяя этот подход, вы обеспечите стабильную работу своих отчетов и обработок, использующих мощный механизм СКД для произвольных выборок данных.