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