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

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

Как программно сформировать отчет в 1С: пошаговое руководство

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

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

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

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

Какие способы программного формирования отчета существуют

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

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

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

СКД через компоновщик макета

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

Открытие формы отчета с параметрами

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

Готовые процедуры конфигурации

Минимум кода, но зависит от конкретной конфигурации и может отсутствовать.

Получение схемы компоновки и настроек отчета

Отчет на СКД хранит схему в макете «ОсновнаяСхемаКомпоновкиДанных». Получить её можно через менеджер отчетов: Отчеты.МойОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"). Если отчет создан как внешний, схема берется так же — через объект внешнего отчета после его инициализации.

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

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

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

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

Компоновщик.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию);

Если отчет использует варианты (несколько предопределенных настроек), нужный вариант можно найти по ключу в Схема.ВариантыНастроек и загрузить его настройки вместо настроек по умолчанию.

Установка параметров и отборов программно

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

Настройки = Компоновщик.Настройки;

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

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

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

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

Отборы добавляются в коллекцию Настройки.Отбор.Элементы. Для каждого элемента указывается левое значение (поле компоновки), вид сравнения и правое значение. Частая ошибка — забыть установить Использование = Истина, из-за чего отбор молча игнорируется и отчет строится по всем данным.

Формирование результата: компоновщик макета и процессор

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

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

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

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

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

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

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

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

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

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

Порядок действий
  1. 1
    Получите схему компоновки данных через ПолучитьМакет
  2. 2
    Создайте компоновщик настроек и загрузите настройки по умолчанию
  3. 3
    Установите параметры периода и отборы с флагом Использование
  4. 4
    Выполните компоновщик макета и инициализируйте процессор компоновки
  5. 5
    Выведите результат в табличный документ и проверьте его содержимое
  6. 6
    Сохраните или покажите документ пользователю

Вывод результата в файл и отправка по расписанию

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

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

Формирование отчета без СКД и альтернативные сценарии

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

Если нужно не показать отчет, а получить данные для обработки, вместо процессора вывода в табличный документ используют ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений — результат попадает в таблицу значений или дерево, удобные для дальнейших вычислений, выгрузки в другие системы или проверки условий.

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

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

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

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

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

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

Высота табличного документа
Норма

Больше нуля, строки данных присутствуют

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

Нулевая высота — неверные отборы или период

Итоги в отчете
Норма

Совпадают с интерактивным формированием того же варианта

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

Расходятся — загружен другой вариант настроек

Сохраненный файл
Норма

Открывается, содержит шапку и данные

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

Пустой или поврежденный файл — ошибка на этапе вывода

Частые вопросы

Как программно сформировать отчет и сразу сохранить его в Excel?

После вывода результата в табличный документ вызовите метод Записать с указанием пути и типа файла: ТабличныйДокумент.Записать("C:\Отчеты\Продажи.xlsx", ТипФайлаТабличногоДокумента.XLSX). На сервере используйте временный каталог и не забудьте удалить файл после использования.

Можно ли сформировать отчет без открытия формы?

Да, именно так работает описанная схема через компоновщик макета и процессор компоновки. Форма отчета не требуется: достаточно схемы компоновки и настроек. Это стандартный подход для регламентных заданий и фоновых выгрузок.

Почему программно установленный отбор не срабатывает?

Чаще всего не установлено свойство Использование = Истина у элемента отбора. Также проверьте, что поле отбора указано как объект ПолеКомпоновкиДанных с точным именем поля из схемы, а вид сравнения соответствует типу данных.

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

Создайте объект СписокЗначений, заполните его нужными элементами и присвойте параметру данных, установив Использование = Истина. В отборе для списка используйте вид сравнения ВСписке, иначе сравнение выполнится некорректно.

Как получить данные отчета в таблицу значений, а не в табличный документ?

Замените процессор вывода на ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений, создайте пустую таблицу значений и передайте её методом УстановитьОбъект. После вызова Вывести таблица будет заполнена строками результата компоновки.

Отчет формируется в фоне, но регламентное задание падает с ошибкой. Что проверить?

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

Итог

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

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