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