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