Почему СКД выдает пустой результат при выводе в Дерево Значений и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При программной работе с Системой Компоновки Данных (СКД) разработчики часто сталкиваются с ситуацией: стандартный вывод результата в ТабличныйДокумент работает корректно, данные формируются и отображаются. Однако при перенастройке вывода в ДеревоЗначений на выходе получается пустой результат. Давайте подробно разберем по шагам, почему это происходит, проанализируем ограничения платформы 1С и рассмотрим рабочие способы решения этой задачи.

Пример кода для вывода СКД в Дерево значений

Рассмотрим классический пример программного формирования отчета, когда результат СКД выгружается в коллекцию значений. Код, как правило, размещается в модуле объекта (в обработчике ПриКомпоновкеРезультата) или выполняется строго в серверном контексте:


ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ТЗОбеспечения", Результат);

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

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

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

Если после выполнения этого кода дерево остается пустым или не отображается на форме, выясним причину и проверим настройки.

Ограничения вывода результата СКД в коллекции значений

При использовании ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений платформа накладывает ряд жестких ограничений. Проанализируем ситуацию: если настройки вашей схемы нарушают хотя бы одно из правил ниже, результат не сформируется корректно.

  1. Запрет на использование структуры "Таблица". СКД не умеет выводить в дерево перекрестные настройки вида "Таблица" (где заданы и строки, и колонки). Допускаются только линейные и иерархические "Группировки", а также "Детальные записи".
  2. Не поддерживаются диаграммы и вложенные схемы. В настройках вывода эти элементы будут проигнорированы или вызовут ошибку.
  3. Игнорирование оформления. Условное оформление и пользовательские макеты оформления (заданные на вкладке "Макеты") при выводе в дерево значений не применяются.
  4. Ограничения параметров вывода. Из всех настроек на вкладке "Параметры вывода" платформа учитывает только расположение общих итогов по вертикали, тип заголовка полей и ограничения на количество записей.
  5. Игнорируются папки в выбранных полях. Если вы группируете выбранные поля в папки, структура не будет перенесена в дерево.

Неочевидные причины пустых колонок и результатов

Если структура настроек корректна, но данные все равно не выводятся, обратите внимание на следующие нюансы:

1. Настройка "Авто позиция ресурсов"
Если в параметрах вывода настройка "Авто позиция ресурсов" установлена в значение "Не использовать", ресурсы и пользовательские вычисляемые поля не попадут в коллекцию значений и останутся пустыми. Рекомендуется оставлять значение по умолчанию ("После всех полей").

2. Значения NULL в ресурсах
Иногда колонки с числовыми ресурсами остаются полностью пустыми. Это часто связано с тем, что в исходном запросе проскакивают значения NULL, которые СКД не может корректно агрегировать для коллекции. Используйте функцию ЕСТЬNULL(Поле, 0) внутри запроса для всех числовых полей.

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

Альтернативные способы получения иерархии

Если специфика отчета или сложные настройки СКД не позволяют напрямую выгрузить данные в Дерево значений, рассмотрим альтернативные обходные пути:

  1. Парсинг Табличного документа. Выведите СКД стандартным образом в программно созданный (скрытый) ТабличныйДокумент. Затем напишите алгоритм, который построчно обойдет этот документ, считывая уровни группировок, и на их основе заполнит дерево на форме. Это сохранит сложную структуру.
  2. Использование итогов в запросе. Если вам нужна только иерархия данных для интерактивной обработки (без специфических возможностей СКД), проще использовать обычный запрос. Конструкция Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией) автоматически сформирует готовое Дерево значений со всеми итогами.
  3. Выгрузка в плоскую Таблицу значений. Вывод СКД в линейную ТаблицуЗначений работает стабильнее. Добавьте в настройки уникальные идентификаторы и поля родителей, выгрузите плоский результат, а затем рекурсивной функцией постройте из таблицы структуру дерева.
← На главную