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