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