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