Отчеты и Аналитика · 10 мин
Как программно сформировать отчет СКД в 1С
Как программно сформировать отчет на СКД в 1С: код на встроенном языке, работа с настройками, вывод в табличный документ, типичные ошибки и проверка результата.
Система компоновки данных (СКД) позволяет формировать отчет не только интерактивно через форму, но и полностью программно — из кода на встроенном языке 1С. Это нужно для регламентных заданий, рассылки отчетов по почте, выгрузки данных в файлы, печати без участия пользователя и интеграции с другими подсистемами.
Программное формирование строится на трех объектах: СхемаКомпоновкиДанных (источник структуры отчета), КомпоновщикМакетаКомпоновкиДанных (преобразует настройки в макет) и ПроцессорКомпоновкиДанных (выполняет запрос и формирует результат). Понимание этой цепочки снимает большинство вопросов, которые возникают при первых попытках.
Ниже разобраны готовые фрагменты кода для типовых сценариев: формирование в табличный документ, передача параметров и отборов, вывод в дерево значений, а также отличия для управляемых и обычных форм.
Общая схема программного формирования отчета СКД
Любой программный вызов СКД состоит из четырех этапов. Сначала получают схему компоновки — из макета отчета, внешнего отчета или общего макета. Затем берут настройки: либо настройки по умолчанию из схемы, либо загруженные из хранилища вариантов, либо сформированные вручную в коде.
Далее компоновщик макета на основе схемы и настроек строит макет компоновки — промежуточное описание, где уже развернуты запросы, вычисляемые поля и ресурсы. Последний шаг — процессор компоновки выполняет макет, получает данные, а процессор вывода превращает результат в табличный документ, дерево значений или таблицу значений.
Минимальный рабочий код для отчета, созданного как объект конфигурации:
Схема = Отчеты.ПродажиПоМенеджерам.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = Схема.НастройкиПоУмолчанию;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ТабДок = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
После выполнения переменная ТабДок содержит готовый отчет, который можно показать пользователю, сохранить в файл или отправить по почте.
Передача параметров и отборов в настройки
Чаще всего программное формирование требуется именно ради управляемых параметров: период, организация, склад. Параметры устанавливаются через коллекцию Настройки.ПараметрыДанных.
ПараметрПериод = Настройки.ПараметрыДанных.Элементы.Найти("НачалоПериода");
ПараметрПериод.Значение = НачалоМесяца(ТекущаяДатаСеанса());
ПараметрПериод.Использование = Истина;
Отборы добавляются в коллекцию Настройки.Отбор.Элементы. Для каждого элемента указывают поле (через Новый ПолеКомпоновкиДанных), вид сравнения и правое значение. Не забудьте установить Использование = Истина — по умолчанию новый элемент отбора может быть отключен.
ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = ОрганизацияСсылка;
ЭлементОтбора.Использование = Истина;
Формирование с внешними наборами данных
Когда данных запроса недостаточно, в СКД передают внешние наборы — например, таблицу значений, собранную из других источников. Для этого в схеме должен быть описан источник данных типа «Объект» с указанным именем, а при инициализации процессора компоновки передается соответствие: имя набора — таблица значений.
ВнешниеНаборы = Новый Структура;
ВнешниеНаборы.Вставить("ТаблицаПланов", ТаблицаПланов);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборы);
Колонки таблицы значений должны совпадать по именам с полями набора данных в схеме, а типы колонок желательно задавать явно через ОписаниеТипов. Нетипизированная таблица часто приводит к ошибкам сравнения типов на этапе компоновки макета.
Вывод результата: табличный документ, таблица и дерево значений
Выбор процессора вывода определяет форму результата. Для показа пользователю и печати используется ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент. Если данные нужны для дальнейшей обработки в коде, подойдут процессоры вывода в коллекцию значений — таблицу или дерево.
Варианты вывода результата
Для показа пользователю, печати, сохранения в Excel или PDF. Сохраняет оформление, группировки и итоги.
Для программной обработки плоских данных: выгрузка, обмен, проверки. Оформление теряется.
Когда нужна иерархия группировок — например, для вывода в элемент формы «Дерево» или обхода итогов по уровням.
Пример вывода в дерево значений:
Дерево = Новый ДеревоЗначений;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(Дерево);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Учтите ограничение: при выводе в коллекцию значений СКД не применяет оформление и некоторые возможности макетов, а иерархия в дереве появляется только если в настройках есть группировки. Для выгрузки «как на экране» надежнее формировать табличный документ и сохранять его методом Записать().
Формирование отчета из формы и в фоне
В управляемых формах типовых конфигураций отчеты обычно построены на БСП (библиотека стандартных подсистем), и для перезаполнения достаточно изменить настройки в реквизите Отчет.КомпоновщикНастроек и вызвать СкомпоноватьРезультат(). Ручная цепочка с процессорами в этом случае не нужна — она уже реализована внутри механизма отчета.
Для длительных отчетов в клиент-серверном режиме формирование стоит выносить в фоновое задание через ФоновыеЗадания.Выполнить() или механизм длительных операций БСП. Табличный документ или его двоичные данные возвращаются через временное хранилище (ПоместитьВоВременноеХранилище), поскольку сами объекты между сеансами напрямую не передаются.
Типичные ошибки и как их найти
Самая частая проблема — пустой результат при корректном коде. Причины: не установлено Использование у параметра или отбора, параметр периода задан неверным типом, отбор наложен по полю, которого нет в выбранных полях запроса. Проверяйте настройки через отладчик до вызова компоновщика макета.
Вторая группа ошибок — «Ошибка получения данных» на этапе процессора компоновки. Обычно это несовпадение имен полей внешнего набора со схемой или нетипизированные колонки таблицы значений. Текст запроса, который реально выполняет СКД, можно посмотреть в макете компоновки через отладчик — это сильно ускоряет поиск причины.
Как проверить результат
Совпадает с результатом интерактивного формирования с теми же настройками
Строк нет или их заметно больше — проверяйте отборы и параметры
Установлены нужные значения, Использование = Истина
Параметр не найден по имени или отключен
Итоги сходятся с контрольными данными из базы
Итоги задвоены — вероятна лишняя группировка или связь наборов
FAQ
Можно ли сформировать отчет СКД без создания формы отчета?
Да. Достаточно получить схему из макета и выполнить полную цепочку: компоновщик макета, процессор компоновки, процессор вывода. Форма нужна только для интерактивной работы пользователя.
Как программно выбрать вариант отчета?
Варианты хранятся в Схема.ВариантыНастроек. Найдите нужный вариант по имени и используйте его настройки: Настройки = Схема.ВариантыНастроек.Найти("Основной").Настройки. В типовых конфигурациях варианты могут храниться в хранилище вариантов отчетов.
Почему параметр периода не применяется?
Чаще всего параметр имеет тип «СтандартныйПериод», а ему присваивают дату, либо не установлено свойство Использование. Проверьте тип параметра в схеме и передавайте значение соответствующего типа.
Как сохранить сформированный отчет в файл Excel?
После вывода в табличный документ вызовите ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX). Форматы PDF, HTML и ODS поддерживаются аналогично через соответствующее значение типа файла.
Можно ли сформировать отчет на сервере из регламентного задания?
Да, весь описанный код серверный и работает в фоновом задании. Ограничение: в фоне нельзя показать табличный документ пользователю — результат сохраняют в файл, отправляют по почте или кладут во временное хранилище.
Чем отличается программное формирование от метода СкомпоноватьРезультат()?
Метод СкомпоноватьРезультат() доступен в модуле объекта отчета и выполняет ту же цепочку автоматически, используя встроенный компоновщик настроек. Ручная цепочка нужна, когда отчет формируется вне контекста объекта отчета или требуется полный контроль над процессом.
Что важно запомнить
Программное формирование отчета СКД — это цепочка «схема → настройки → макет → процессор компоновки → процессор вывода». Контролируйте свойство Использование у параметров и отборов, типизируйте внешние наборы данных, а тяжелые отчеты выполняйте в фоновых заданиях.