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

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

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

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

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

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

Выбор способа: СКД, табличный документ или программный запуск типового отчёта

Три основных способа отличаются гибкостью, трудоёмкостью и удобством сопровождения. Неверный выбор на старте — самая частая причина переделки отчёта с нуля.

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

Отчёт на СКД

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

Табличный документ + макет

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

Программный запуск готового отчёта

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

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

Создание отчёта на СКД: схема компоновки и запрос

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

В запросе используйте виртуальные таблицы регистров с параметрами периода: например, Продажи.Обороты(&НачалоПериода, &КонецПериода,,). Параметры автоматически появятся в настройках отчёта. На закладке «Настройки» задайте структуру по умолчанию: группировки, выбранные поля и порядок сортировки. Пользователь сможет менять их уже в режиме предприятия без доработки кода.

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

Программное формирование отчёта на СКД из кода

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

// Модуль обработки или команды

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

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

Параметры = Настройки.ПараметрыДанных;

Параметры.УстановитьЗначениеПараметра("НачалоПериода", НачалоМесяца(ТекущаяДатаСеанса()));

Параметры.УстановитьЗначениеПараметра("КонецПериода", КонецМесяца(ТекущаяДатаСеанса()));

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

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

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

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

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

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

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

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

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

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

Порядок действий
  1. 1
    Создайте отчёт и схему компоновки данных с запросом и параметрами периода
  2. 2
    В модуле получите схему через ПолучитьМакет и задайте значения параметров
  3. 3
    Выполните КомпоновщикМакета, затем инициализируйте ПроцессорКомпоновки
  4. 4
    Выведите результат в ТабличныйДокумент через ПроцессорВывода
  5. 5
    Проверьте отчёт на граничных датах и при отсутствии данных за период

Отчёт через табличный документ и макет с областями

Когда нужен строгий бланк — реестр, справка, свод с фиксированными колонками, — создайте макет типа «Табличный документ» у отчёта или обработки. В макете выделите именованные области: «Шапка», «Строка», «Подвал». В коде выборку из запроса обходите циклом и выводите области по очереди.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| РеализацияТоваровУслуг.Номер КАК Номер,

| РеализацияТоваровУслуг.Контрагент КАК Контрагент,

| РеализацияТоваровУслуг.СуммаДокумента КАК Сумма

|ИЗ

| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

|ГДЕ

| РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода

| И РеализацияТоваровУслуг.Проведен";

Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);

Запрос.УстановитьПараметр("КонецПериода", КонецПериода);

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

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

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

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

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

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

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

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

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

КонецЦикла;

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

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

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

Программный запуск типового отчёта с параметрами

Частая задача в типовых конфигурациях — сформировать существующий отчёт (например, «Оборотно-сальдовая ведомость» или «Анализ продаж») из своей обработки и сохранить результат в файл или отправить по почте. Для этого отчёт вызывается как объект, ему передаются настройки через компоновщик настроек.

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

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

Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода", НачалоДня(ТекущаяДатаСеанса()));

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

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

ОтчетОбъект.СкомпоноватьРезультат(ТабДок);

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

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

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

Проверка результата и производительность

После написания кода проверьте отчёт на контрольных данных: сверьте итоги с оборотами регистра через консоль запросов или стандартный отчёт. Особое внимание уделите границам периода — типовая ошибка, когда документы последней секунды дня не попадают в отчёт из-за сравнения дат без времени. Используйте КонецДня() или конструкцию МЕЖДУ &Начало И &Конец с правильно заданной границей.

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

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

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

Итоговые суммы отчёта
Норма

Совпадают с оборотами регистра за тот же период

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

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

Поведение при пустых данных
Норма

Выводится шапка и пустой подвал без ошибки

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

Исключение или битый табличный документ

Время формирования
Норма

Секунды на типовом объёме данных

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

Минуты — нужно оптимизировать запрос

Типичные ошибки и ограничения

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

Отдельно отметим ограничение прав: программное формирование отчёта выполняется под правами текущего пользователя. Если у пользователя нет права чтения регистра, запрос вернёт ошибку или пустой результат. Для регламентных заданий назначайте пользователя с достаточными правами, но не административными без необходимости.

FAQ

Можно ли сделать отчёт вообще без создания объекта «Отчёт» в конфигураторе?

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

Как передать в отчёт отбор по списку контрагентов, а не по одному?

Через параметр компоновки с установленным признаком доступности списка: передайте в УстановитьЗначениеПараметра объект СписокЗначений или массив, а в запросе используйте условие Контрагент В (&СписокКонтрагентов). В настройках СКД для такого параметра включите флаг «Доступен список значений».

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

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

Как сохранить сформированный отчёт в Excel или PDF программно?

У табличного документа вызовите метод Записать с указанием пути и типа файла: ТипФайлаТабличногоДокумента.XLSX для Excel или PDF для PDF. Учтите, что запись файла выполняется на той стороне, где выполняется код: на сервере — в каталог сервера, доступный агенту.

Чем внешний отчёт отличается от отчёта в составе конфигурации?

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

Как вывести в отчёт картинку или штрихкод?

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

Итог

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

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