Как программно вывести результат СКД в таблицу значений и избежать пустого результата

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

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

Выясняем причину: почему макет компоновки оказывается пустым

Проанализируем типичную ситуацию. Программист создает объект СхемаКомпоновкиДанных, наполняет её наборами данных и запросами, а затем пытается сразу передать её в КомпоновщикМакета. В этот момент и кроется главная ошибка. Для СКД сама схема — это лишь чертеж, инструкция о том, откуда можно взять данные. Но система не знает, какие именно поля и в какой иерархии вы хотите видеть в конечном итоге, пока вы не укажете это в Настройках компоновки.

Разберем по шагам: если в НастройкиКомпоновкиДанных не определены Выбранные поля и не задана Структура (хотя бы детальные записи), то при генерации макета 1С просто не понимает, какие части запроса нужно исполнять. В результате получается пустой макет, который не возвращает строк.

Полная цепочка программного вывода в таблицу значений

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

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

Реализация решения: программное заполнение настроек

Рассмотрим пример кода, который решает проблему отсутствия данных. Важно помнить, что даже если в самой схеме (в конфигураторе) заданы настройки по умолчанию, при полностью программном создании схемы их нужно инициализировать или скопировать.


// 1. Получаем или создаем схему
Схема = ПолучитьСхемуКомпоновкиДанных(); 

// 2. Инициализируем компоновщик настроек
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));

// Важный момент: загружаем стандартные настройки из схемы, если они там есть
Настройки = КомпоновщикНастроек.Настройки;

// Если мы создаем все с нуля программно, обязательно добавляем структуру!
// Добавим группировку "Детальные записи"
Группировка = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
Группировка.Использование = Истина;

// И обязательно добавляем выбранные поля, иначе запрос не вернет колонок
ВыбранноеПоле = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Номенклатура");
ВыбранноеПоле.Использование = Истина;

ВыбранноеПоле = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Количество");
ВыбранноеПоле.Использование = Истина;

Генерация макета и выполнение компоновки

Теперь, когда настройки содержат структуру и поля, мы можем приступить к генерации макета. Рассмотрим подробнее параметры метода Выполнить компоновщика макета. Для вывода в таблицу значений критически важно использовать правильный тип генератора.


// Создаем компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

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

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

// Создаем таблицу значений для результата
РезультатТЗ = Новый ТаблицаЗначений;

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

// Выводим результат
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

Почему стоит использовать СКД вместо обычного запроса?

Часто возникает вопрос: зачем использовать такую сложную конструкцию, если можно написать Запрос.Выполнить().Выгрузить()? Разберем преимущества программного использования СКД:

Тонкости настройки и оптимизации

Проанализируем еще несколько важных моментов, которые помогут сделать работу стабильнее:

Параметры получения макета: При вызове КомпоновщикМакета.Выполнить() использование типа Объектный не только гарантирует корректную работу с коллекциями значений, но и экономит память, так как система не тратит ресурсы на оформление (цвета, шрифты, рамки), характерное для табличного документа.

Обработка пустых настроек: Если вы берете настройки из XML или другого источника, всегда проверяйте количество элементов в Настройки.Выбор.Элементы. Если их там нет, результат выполнения всегда будет пустым, даже если сам запрос в схеме абсолютно корректен.

Таким образом, мы выяснили, что ключевым звеном в программном выводе СКД в таблицу значений является правильное заполнение структуры и выбранных полей в объекте настроек. Соблюдение приведенной выше последовательности объектов гарантирует получение корректных и типизированных данных для вашей дальнейшей программной обработки.

← На главную