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

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

Как вывести СКД на форму в 1С

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

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

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

Материал ориентирован на управляемые формы (режим «Такси» или совместимости). В обычных формах механика аналогична, но код компоновки выполняется в модуле формы без разделения контекстов клиент/сервер.

Какой способ вывода СКД на форму выбрать

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

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

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

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

Полный контроль, подходит для печати и панелей показателей; нет интерактивных настроек из коробки

Типовой отчёт на форме

Встроенные кнопки «Сформировать» и «Настройки»; требует аккуратной привязки реквизитов Отчет и РезультатДок

Вывод в таблицу значений

Данные доступны для обработки кодом; нет оформления и группировочных ресурсов как в отчёте

Подготовка: реквизиты и элементы формы

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

Перетащите реквизит «РезультатДок» в дерево элементов формы. Платформа создаст элемент «Поле табличного документа». Установите свойства: «ТолькоПросмотр» — Истина, если редактирование не нужно; «ОтображениеСетки» и «ОтображениеЗаголовков» — по вкусу. Для растягивания на всю форму задайте «РастягиватьПоГоризонтали» и «РастягиватьПоВертикали».

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

Программная компоновка: код формирования отчёта

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

&НаСервере

Процедура СформироватьНаСервере()

РезультатДок.Очистить();

ОтчетОбъект = РеквизитФормыВЗначение("Отчет");

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

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

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

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

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

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

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

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

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

КонецПроцедуры

Если форма принадлежит внешней обработке, схему получают через ЭтотОбъект.ПолучитьМакет() в модуле объекта или через ПолучитьМакетОбработки в управляемой форме — для этого сначала преобразуйте реквизит формы в объект. Для отчёта в составе конфигурации достаточно Отчеты.ИмяОтчета.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных").

Обратите внимание на параметр Истина в методе Вывести — он включает проверку возможности вывода (ограничение по количеству записей). Без него при больших выборках форма может зависнуть.

Вывод типового отчёта на форму обработки

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

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

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

Проверка результата и типичные ошибки

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

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

Типичные ошибки
01
Компоновка в клиентской процедуре — код падает, перенесите формирование в &НаСервере
02
Отсутствует РезультатДок.Очистить() — при повторном формировании данные дублируются
03
Параметр установлен без Использование = Истина — отбор не применяется, отчёт показывает всё
04
Поиск параметра без проверки на Неопределено — ошибка при обращении к свойству Значение
05
Хранение схемы СКД в реквизите формы — замедление работы формы при каждом вызове
Контрольные точки

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

Формирование отчёта
Норма

Табличный документ заполнен, итоги соответствуют данным

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

Пустой документ или ошибка компоновки

Повторное формирование
Норма

Документ очищается и заполняется заново

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

Строки дублируются под прежним результатом

Применение отборов
Норма

Изменение отбора меняет состав данных в отчёте

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

Отчёт одинаков при любых отборах

Производительность
Норма

Форма открывается и формируется без заметных пауз

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

Зависание при открытии — вероятно, отчёт формируется в ПриСозданииНаСервере без необходимости

Ограничения и когда стоит привлечь специалиста

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

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

Итог

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

Вывод СКД на форму сводится к цепочке: схема → настройки → компоновщик макета → процессор компоновки → процессор вывода → табличный документ. Компоновку выполняйте на сервере, очищайте результат перед формированием, проверяйте найденные параметры на Неопределено и не храните схему в реквизитах формы.

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

Можно ли вывести СКД на форму без создания отчёта в конфигурации?

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

Почему отчёт формируется в конфигураторе, но пустой в режиме предприятия?

Чаще всего дело в правах доступа: пользователь не видит часть данных из-за RLS или отсутствия прав на регистры. Проверьте формирование под полными правами и сравните результат. Вторая причина — отборы по умолчанию, которые в реальных данных отсекают всё.

Как сделать расшифровку при программной компоновке?

При создании макета передайте в КомпоновщикМакета.Выполнить третьим параметром объект ДанныеРасшифровки, а результат сохраните в реквизит формы типа ДанныеРасшифровкиКомпоновкиДанных. Затем обработайте событие ОбработкаРасшифровки у поля табличного документа через ОбработкаРасшифровкиКомпоновкиДанных.

Как вывести результат СКД в таблицу значений, а не в табличный документ?

Используйте ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений вместо процессора вывода в табличный документ. Метод Вывести заполнит переданную таблицу значений, которую можно поместить в реквизит формы и отобразить элементом «Таблица формы».

Можно ли формировать отчёт автоматически при открытии формы?

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

Работает ли этот подход в тонком и веб-клиенте?

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