От выбора способа до вывода на печать: делаем отчёт в 1С 8.3

· 10 мин

Содержание

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

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

Три способа создать отчёт и какой брать

Способы отличаются не «мощностью», а тем, сколько ручной работы вы берёте на себя и насколько гибкую настройку отдаёте пользователю.

СпособКогда подходитЧто делает система, а что вы
СКД90% задач: списки, итоги, группировки, пользовательские настройкиЗапрос и настройки — вы, вывод и оформление — система
Табличный документ по макетуПечатные формы, бланки строгого вида, нестандартная вёрсткаВсё вручную: области, параметры, порядок вывода
Программная компоновкаСКД, но результат нужен в коде (в таблицу значений, в рассылку, в фоновое задание)Запрос — СКД, запуск и обработка — код

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

Какой способ разработки выбрать?

Отчёт на системе компоновки данных пошагово

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

  1. Создайте объект отчёта. В конфигурации: ветка Отчеты → Добавить. Для разового или распространяемого отчёта — Файл → Новый → Внешний отчёт (файл с расширением .erf).
  2. Откройте схему компоновки. В окне редактирования отчёта нажмите кнопку «Открыть схему компоновки данных» у свойства «Основная схема компоновки данных» и подтвердите создание макета.
  3. Задайте набор данных. На закладке «Наборы данных» добавьте «Набор данных — запрос» и нажмите «Конструктор запроса».
  4. Соберите запрос. Выберите таблицы — чаще всего виртуальные: РегистрНакопления.<Имя>.Обороты, РегистрБухгалтерии.<Имя>.ОстаткиИОбороты или таблицы документов. Перетащите нужные поля в «Поля».
  5. Отметьте ресурсы. На закладке «Ресурсы» перенесите числовые поля (сумму, количество) и укажите функцию — обычно Сумма(). Ресурс — это то, что суммируется по группировкам.
  6. Соберите вариант на закладке «Настройки». Добавьте группировки (правой кнопкой на «Отчёт» → «Новая группировка»); пустая группировка — это детальные записи. В «Выбранных полях» укажите, какие колонки показывать.
  7. Проверьте запуском. У отчёта по умолчанию формируется управляемая форма с полем табличного документа и кнопкой Сформировать. Откройте отчёт в режиме 1С:Предприятие и нажмите её.

Текст запроса для оборотов по складам выглядит примерно так — его собирает конструктор, но полезно понимать, что внутри:

ВЫБРАТЬ
    ПродажиОбороты.Номенклатура    КАК Номенклатура,
    ПродажиОбороты.Склад           КАК Склад,
    ПродажиОбороты.КоличествоОборот КАК Количество,
    ПродажиОбороты.СуммаОборот      КАК Сумма
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ПродажиОбороты

Период передан в параметры виртуальной таблицы Обороты(...), а не в ГДЕ — система прочитает только нужный диапазон. Поля Количество и Сумма затем отмечают ресурсами, а Номенклатуру и Склад используют как группировки.

Поля, которые пользователь увидит как колонки, задаются именно в «Выбранных полях» настроек, а не в запросе. В запросе поле может быть, а в выводе — нет: так удобно держать служебные поля для отборов и оформления.

Группировки задают иерархию отчёта. Если в корень настроек добавить группировку по складу, а внутрь неё — по номенклатуре, система выведет итоги по каждому складу и расшифровку по товарам, а сверху — общий итог. Порядок группировок в дереве настроек = порядок вложенности в результате, поэтому собирать их стоит от крупного к мелкому.

Оформление строк (цвет, шрифт, выделение отрицательных сумм) задаётся на закладке «Условное оформление» в настройках — без единой строки кода. Туда же выносят форматирование чисел и дат через «Условное оформление → Оформление → Формат».

Параметры и отборы в отчёте

Параметр — это значение, которое отчёт запрашивает перед формированием: период, организация, склад. Отбор — ограничение строк по условию.

Параметры описываются на закладке «Параметры» схемы. Для периода не создавайте два отдельных параметра: добавьте один параметр типа «Стандартный период» или пару НачалоПериода / КонецПериода и свяжите их с полем периода виртуальной таблицы. В запросе период подставляют в параметры виртуальной таблицы, а не в секцию ГДЕ — это принципиально для скорости (об этом ниже).

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

Разница простая:

  • 🔧 Параметры — обязательные входные данные, без которых запрос не выполнить (период, организация).
  • 🔍 Отбор — сужение уже выбранных данных по значению поля (конкретный контрагент, группа номенклатуры).
  • 👤 Пользовательские настройки — то, что вынесено на форму и доступно без Конфигуратора.

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

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

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

Создайте в отчёте макет типа «Табличный документ» (Макеты → Добавить → Макет, тип «Табличный документ»). Разметьте в нём именованные области: выделяете строки, Таблица → Имена → Назначить имя. В ячейки с данными ставите параметры: ячейка → Свойства → Макет → Параметр, имя — например Контрагент.

Вывод собирают в коде:

ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");

ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.ДатаОтчета = ТекущаяДата();
ТабДок.Вывести(ОбластьШапка);

ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
    ОбластьСтрока.Параметры.Контрагент = СтрокаДанных.Контрагент;
    ОбластьСтрока.Параметры.Сумма     = СтрокаДанных.Сумма;
    ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

ТабДок.Показать();

Такой подход даёт полный контроль над вёрсткой: объединение ячеек, рамки, повторяющиеся шапки при печати, горизонтальные области для широких отчётов. Платите за это тем, что группировки, сортировку и итоги пишете сами.

Для широкого отчёта, где колонки не влезают по ширине, области выводят ещё и по горизонтали — методом ТабДок.ПрисоединитьВывод(Область). Сначала Вывести ставит область слева, затем ПрисоединитьВывод дописывает следующую справа от предыдущей. Так собирают, например, помесячную развёртку, где число колонок заранее неизвестно.

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

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

Программная компоновка данных в коде

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

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

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

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

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

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

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

Передать во внешние параметры запроса значение (период, организацию) до запуска компоновки удобно через Настройки:

ПараметрПериод = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(
    Новый ПараметрКомпоновкиДанных("Период"));
Если ПараметрПериод <> Неопределено Тогда
    ПараметрПериод.Значение = НужныйПериод;
КонецЕсли;

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

Как ускорить отчёт

Медленный отчёт — почти всегда медленный запрос. Оформление и вывод тормозят редко.

  • Условия периода — в параметры виртуальной таблицы. РегистрНакопления.Продажи.Обороты(&Начало, &Конец, ...) читает только нужный диапазон. Тот же отбор в секции ГДЕ заставит систему прочитать регистр целиком.
  • Индексируйте временные таблицы. Если строите отчёт на временных таблицах и соединяете их, добавляйте ИНДЕКСИРОВАТЬ ПО по полям соединения. Без индекса соединение больших таблиц идёт перебором.
  • Не обращайтесь к базе в цикле. Классическая ошибка — в цикле по строкам дёргать .Ссылка.Реквизит. Каждое обращение — отдельный запрос. Нужные реквизиты получайте одним запросом заранее.
  • Не тяните лишние поля. Каждое поле из ссылочного типа в выводе — это неявное соединение. Оставляйте только то, что показываете.
  • Итоги считайте ресурсами СКД, а не в коде. Система суммирует на уровне компоновки эффективнее, чем ручной обход результата.
  • Левые соединения с подзапросами — в последнюю очередь. Их часто можно заменить предварительным сбором данных во временную таблицу.

Если отчёт тормозит только у отдельных пользователей, проверьте RLS (ограничение доступа на уровне записей). При включённом RLS в запросе иногда помогает конструкция РАЗРЕШЕННЫЕ, но она меняет состав строк — применяйте осознанно.

Перед тем как отдать отчёт в работу
Выполнено: 0 / 5

Вывод на экран, печать и выгрузка в Excel

Готовый результат живёт в объекте ТабличныйДокумент. Дальше с ним делают что угодно.

Показать на форме. В управляемом приложении на экран отчёт выводит поле табличного документа на форме. У типового отчёта оно создаётся автоматически вместе с кнопкой Сформировать.

Напечатать. Методом ТабДок.Напечатать(РежимИспользованияМеханизмаПечатиБезПредпросмотра.НеИспользовать) открывается предпросмотр, откуда идёт печать. Поля, ориентацию и масштаб задают через ТабДок.ПараметрыСтраницы ещё до вывода. Строки, которые должны повторяться на каждой странице, помещают в ТабДок.ПовторятьПриПечатиСтроки.

Сохранить в файл. Метод Записать сохраняет документ в нужном формате:

ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX); // Excel
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);  // PDF

При выгрузке в Excel через .XLSX сохраняется разметка: объединённые ячейки, границы, формат чисел. Если нужен «плоский» файл без оформления под дальнейшую обработку, выгружают в .MXL или собирают данные в таблицу значений программной компоновкой.

Защитить отчёт от правки получателем помогает свойство ТабДок.Защита = Истина — ячейки станут доступны только для чтения.

Частые вопросы

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