К статье
Практический материал

Отчеты и Аналитика · 10 мин

Как программно создать отчет в 1С

Как программно создать отчет в 1С через СКД и компоновщик настроек: код, примеры, вывод в табличный документ, типичные ошибки и проверка результата.

Программное создание отчета в 1С нужно, когда отчет должен формироваться по расписанию, вызываться из кнопки на форме, отправляться по почте или сохраняться в файл без участия пользователя. В отличие от интерактивного запуска, здесь весь цикл — установка параметров, формирование, вывод — выполняется кодом на встроенном языке.

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

Ниже разобран полный цикл: от создания схемы компоновки до вывода результата, с рабочим кодом, типичными ошибками и способами проверки. Примеры ориентированы на управляемые формы и платформу 8.3, но общая логика применима и к обычным формам.

Выбор способа: СКД, запрос или построитель

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

Сравнение вариантов

СКД с программными настройками

Подходит для аналитических отчетов с группировками, отборами и вариантами. Требует больше кода, но дает гибкость.

Запрос + табличный документ

Оптимально для простых реестров и выгрузок. Полный контроль над макетом, но нет интерактивных настроек.

Построитель отчета

Компромисс для обычных форм: отборы и оформление без СКД. В управляемых приложениях используется редко.

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

Создание схемы компоновки данных

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

На закладке «Настройки» сформируйте вариант по умолчанию: группировки, выбранные поля, порядок. Этот вариант будет использоваться, если программно не задать другой. Параметры (период, организация, склад) объявляются в запросе через амперсанд — например, &НачалоПериода.

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

Программное формирование отчета: полный код

Типовой цикл программного формирования состоит из четырех шагов: получить схему, заполнить настройки, выполнить компоновку, вывести результат. Ниже пример для отчета, созданного в конфигурации.

// 1. Получаем схему компоновки данных

ОтчетОбъект = Отчеты.ПродажиЗаПериод.Создать();

СхемаКД = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

// 2. Берем настройки по умолчанию и задаем параметры

Настройки = СхемаКД.НастройкиПоУмолчанию;

ПараметрНачало = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(

Новый ПараметрКомпоновкиДанных("НачалоПериода"));

ПараметрНачало.Значение = НачалоМесяца(ТекущаяДатаСеанса());

ПараметрНачало.Использование = Истина;

// 3. Компоновка макета и формирование

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

МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКД, Настройки);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;

ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

ТабДок = Новый ТабличныйДокумент;

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;

ПроцессорВывода.УстановитьДокумент(ТабДок);

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

// 4. Показ или сохранение результата

ТабДок.Показать("Продажи за период");

Ключевой момент — установка параметров через НайтиЗначениеПараметра и флаг Использование = Истина. Без этого флага параметр считается отключенным, и СКД либо выдаст ошибку, либо сформирует отчет с пустым условием.

Порядок действий
  1. 1
    Создайте отчет и основную схему компоновки данных с запросом и параметрами
  2. 2
    Настройте вариант отчета по умолчанию в конструкторе настроек
  3. 3
    Напишите код: получение схемы, установка параметров и отборов
  4. 4
    Выполните компоновку макета и инициализируйте процессор компоновки
  5. 5
    Выведите результат в табличный документ и проверьте данные сверкой с запросом в консоли

Программная установка отборов и группировок

Отборы добавляются в коллекцию Настройки.Отбор.Элементы. Каждый элемент — это поле, вид сравнения и значение. Типовой код установки отбора по организации:

ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(

Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлементОтбора.ПравоеЗначение = ВыбраннаяОрганизация;

ЭлементОтбора.Использование = Истина;

Если нужно изменить состав группировок, обращайтесь к коллекции Настройки.Структура. Можно очистить её и построить заново: добавить группировку, указать поля группировки и выбранные поля. Это удобно, когда один и тот же отчет программно формируется в разных разрезах — например, по менеджерам и по номенклатуре.

Для загрузки сохраненного варианта вместо настроек по умолчанию используйте КомпоновщикНастроек.ЗагрузитьНастройки() с настройками нужного варианта из СхемаКД.ВариантыНастроек.

Вывод результата: экран, файл, почта

Табличный документ после формирования можно показать пользователю, сохранить в файл или приложить к письму. Для сохранения используется метод ТабДок.Записать() с указанием типа файла: ТипФайлаТабличногоДокумента.XLSX, PDF, MXL.

ТабДок.Записать("C:\Отчеты\Продажи.xlsx",

ТипФайлаТабличногоДокумента.XLSX);

При формировании в фоновом задании или регламентном задании метод Показать() недоступен — результат нужно сохранять в файл, помещать во временное хранилище или отправлять по почте через ИнтернетПочта. Учитывайте это при проектировании: код формирования лучше отделять от кода отображения.

Проверка результата и типичные ошибки

После формирования проверьте, что отчет содержит данные и они совпадают с эталоном. Самый надежный способ — выполнить тот же запрос в консоли запросов с теми же параметрами и сравнить итоги. Расхождение обычно означает разницу в отборах или неустановленный параметр.

Контрольные точки

Как проверить результат

Количество строк результата
Норма

Совпадает с результатом того же запроса в консоли

Тревожный признак

Пусто или строк меньше — проверьте параметры и флаг Использование

Итоги по группировкам
Норма

Итоги сходятся с контрольной суммой по регистру

Тревожный признак

Итоги завышены — возможно, дублирование из-за соединений в запросе

Отборы в сформированном отчете
Норма

В расшифровке видны только отобранные значения

Тревожный признак

Отбор не применился — проверьте имя поля компоновки

Типичные ошибки
01
Не установлен флаг Использование у параметра — отчет формируется без учета значения или падает с ошибкой
02
Обращение к параметру по имени строкой вместо объекта ПараметрКомпоновкиДанных — параметр не находится
03
Отбор добавлен по имени поля, которого нет в доступных полях настройки — ошибка компоновки
04
Формирование на клиенте без контекста сервера в управляемом приложении — недоступность менеджеров отчетов; код нужно выносить в серверную процедуру
05
Повторное использование одного компоновщика для нескольких формирований без сброса — накопление старых настроек

Альтернатива: отчет без СКД через запрос

Для простых выгрузок СКД избыточна. Запрос с обходом результата и выводом в табличный документ через макет дает полный контроль над каждой ячейкой. Создайте макет типа «Табличный документ» с областями «Шапка», «Строка», «Подвал», задайте в ячейках параметры и выводите области последовательно.

Запрос = Новый Запрос("ВЫБРАТЬ Номенклатура, Количество ИЗ ...");

Выборка = Запрос.Выполнить().Выбрать();

Макет = ПолучитьМакет("МакетОтчета");

ТабДок = Новый ТабличныйДокумент;

ТабДок.Вывести(Макет.ПолучитьОбласть("Шапка"));

Пока Выборка.Следующий() Цикл

ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

ОбластьСтрока.Параметры.Заполнить(Выборка);

ТабДок.Вывести(ОбластьСтрока);

КонецЦикла;

Этот подход проще отлаживать и он быстрее работает на больших выборках, поскольку нет накладных расходов компоновки. Ограничение очевидно: никаких интерактивных отборов и вариантов «из коробки» — всё придется программировать вручную.

При отладке программного формирования выгрузите настройки компоновщика в XML через ЗначениеВСтрокуВнутр или сохраните их из консоли СКД — так видно, какие именно настройки реально ушли в компоновку, а не какие вы предполагали.
ПЗ
Практическое замечание

FAQ

Можно ли программно сформировать отчет, не создавая объект отчета в конфигурации?

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

Почему отчет формируется пустым, хотя данные в базе есть?

Чаще всего не установлен флаг Использование у параметра или отбора, либо период задан в неверном часовом поясе/границе. Проверьте также, что параметр типа «Дата» для конца периода дополнен до конца дня — иначе записи за последний день могут не попасть в выборку.

Как сформировать отчет по расписанию без открытия 1С пользователем?

Создайте регламентное задание, в его модуле вызовите серверную процедуру формирования, а результат сохраните в файл или отправьте по почте. В файловой базе регламентные задания выполняются только при запущенном сеансе, в клиент-серверной — сервером 1С автоматически.

Как передать список значений в отбор СКД программно?

Создайте СписокЗначений, заполните его нужными элементами и установите в ПравоеЗначение элемента отбора с видом сравнения ВСписке. СКД корректно развернет список в условие запроса.

Чем отличается ПолучитьМакет от ПолучитьМакетОформления?

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

Итог

Что важно запомнить

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