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

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

Как выполнить отчет программно в 1С

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

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

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

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

Когда нужно программное формирование отчета

Интерактивная форма отчета закрывает задачи пользователя, но не подходит для автоматизации. Программный вызов применяют в нескольких типовых случаях: ежедневная рассылка отчета руководству по электронной почте, сохранение отчета в файл при проведении документа, интеграция с внешними системами, где данные отчета передаются через HTTP-сервис, пакетное формирование нескольких вариантов отчета одной кнопкой.

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

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

Маршрут решения

Как выбрать способ

Отчет на СКД, нужен табличный документИспользуйте КомпоновщикМакетаКомпоновкиДанных и ПроцессорВыводаРезультата
Отчет на СКД, нужны данные для обработкиВыводите результат в коллекцию значений (таблицу или дерево) через ПроцессорВыводаРезультатаВКоллекциюЗначений
Отчет построен кодом без СКДВызовите экспортную процедуру формирования из модуля объекта отчета
Отчет формируется дольше пары секундЗапускайте в фоне через ДлительныеОперации или регламентное задание

Получение объекта отчета и его настроек

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

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

ОтчетОбъект = Отчеты.ПродажиПоМесяцам.Создать();

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

Настройки = ОтчетОбъект.КомпоновщикНастроек.ПолучитьНастройки();

Если нужен конкретный вариант отчета из списка пользовательских вариантов, настройки загружают через ХранилищеВариантовОтчетов либо ищут нужный вариант в СхемаКД.ВариантыНастроек и берут его настройки. Это частая причина расхождений: программно взяли настройки по умолчанию, а пользователь работал с сохраненным вариантом.

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

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

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

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

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

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

Отборы добавляются в коллекцию Настройки.Отбор.Элементы. Для каждого элемента указывают поле компоновки, вид сравнения и правое значение. Имя поля должно совпадать с именем поля в наборе данных схемы — проверить его можно в конфигураторе на закладке «Настройки» схемы компоновки.

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

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

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

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

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

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

Формирование отчета на СКД и вывод результата

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

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

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

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

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

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

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

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

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

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

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

Порядок программного формирования
  1. 1
    Создайте объект отчета через Отчеты.ИмяОтчета.Создать()
  2. 2
    Получите схему компоновки и настройки (или нужный вариант настроек)
  3. 3
    Установите параметры с флагом Использование = Истина
  4. 4
    Добавьте отборы, проверив имена полей в схеме
  5. 5
    Скомпонуйте макет, выполните процессор компоновки
  6. 6
    Выведите результат в табличный документ или коллекцию значений
  7. 7
    Проверьте результат: документ не пуст, итоги совпадают с интерактивным формированием

Фоновое выполнение и формирование по расписанию

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

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

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

Особенности типовых конфигураций

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

Некоторые типовые отчеты переопределяют поведение в модуле объекта через события ПриКомпоновкеРезультата и ПередЗагрузкойНастроекВКомпоновщик. Если отчет ведет себя «не по схеме» — например, игнорирует установленный вами отбор, — загляните в эти обработчики: возможно, там программно корректируются настройки.

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

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

Проверка результата и ограничения

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

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

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

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

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

Итоговые суммы и количество строк
Норма

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

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

Расхождения — проверяйте вариант настроек и отборы

Период отчета
Норма

В шапке отчета указан заданный период

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

Период пустой или по умолчанию — не установлено Использование у параметра

Состав данных по правам
Норма

Видны только данные, доступные пользователю задания

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

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

Время выполнения
Норма

Отчет формируется за приемлемое время без блокировок

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

Минуты ожидания — нет отбора по периоду или избыточная детализация

FAQ: частые вопросы о программном формировании отчетов

Можно ли программно сформировать отчет, построенный без СКД?

Да. Такие отчеты обычно имеют в модуле объекта экспортную процедуру формирования (например, СформироватьОтчет). Создайте объект отчета, заполните его реквизиты-параметры и вызовите эту процедуру, передав табличный документ для вывода. Если процедура не экспортная, внешний вызов невозможен — потребуется доработка модуля или копирование логики в свою обработку.

Почему программно сформированный отчет пустой, а интерактивно данные есть?

Чаще всего не установлен флаг Использование у параметров периода или взяты настройки по умолчанию вместо пользовательского варианта. Также проверьте, что отборы добавлены в правильную коллекцию (Настройки.Отбор, а не отбор вложенной группировки) и что имена полей совпадают со схемой.

Как сохранить отчет в Excel или PDF без показа пользователю?

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

Как получить из отчета таблицу значений для дальнейшей обработки?

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

Безопасно ли формировать отчеты регламентным заданием ночью?

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

Чем отличается программный вызов отчета в файловой и клиент-серверной базе?

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

Итог

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

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