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