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