Отчеты и Аналитика · 11 мин
Как вывести СКД на форму в 1С
Как вывести отчёт на СКД на форму 1С: реквизит РезультатДок, программная компоновка, настройки варианта, типичные ошибки и проверка результата.
Вывод отчёта, построенного на системе компоновки данных (СКД), на управляемую форму — типовая задача при разработке в 1С. Она возникает, когда нужно показать результат отчёта внутри документа, обработки или рабочего места, а не в отдельной форме отчёта. Ниже разобраны два основных подхода: через реквизит формы типа «ТабличныйДокумент» с программной компоновкой и через типовой механизм отчёта, встроенного в форму.
Оба способа рабочие, но различаются по объёму кода и гибкости. Первый даёт полный контроль над процессом формирования, второй использует стандартные команды «Сформировать» и настройки варианта. Выбор зависит от того, нужен ли пользователю интерактивный отбор и перестройка отчёта прямо на форме.
Материал ориентирован на управляемые формы (режим «Такси» или совместимости). В обычных формах механика аналогична, но код компоновки выполняется в модуле формы без разделения контекстов клиент/сервер.
Какой способ вывода СКД на форму выбрать
Существует три практических сценария. Первый — программная компоновка в табличный документ: подходит для панелей показателей, печатных форм и случаев, когда пользователь не должен менять настройки. Второй — встроенный отчёт на форме обработки: пользователь получает кнопки «Сформировать» и «Настройки», весь интерактив уже реализован платформой. Третий — вывод в реквизит типа «ДеревоЗначений» или «ТаблицаЗначений» через вывод в коллекцию, когда нужна дальнейшая обработка данных.
Критерии выбора простые. Если результат нужен только для просмотра и печати — берите табличный документ. Если пользователь должен сам менять отборы и группировки — используйте типовой отчёт или программно создавайте настройки компоновщика. Если данные дальше обрабатываются кодом — выводите в таблицу значений через ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений.
Сравнение вариантов
Полный контроль, подходит для печати и панелей показателей; нет интерактивных настроек из коробки
Встроенные кнопки «Сформировать» и «Настройки»; требует аккуратной привязки реквизитов Отчет и РезультатДок
Данные доступны для обработки кодом; нет оформления и группировочных ресурсов как в отчёте
Подготовка: реквизиты и элементы формы
Откройте форму в конфигураторе и добавьте реквизит формы с именем, например, «РезультатДок» и типом «ТабличныйДокумент». Если планируете программную компоновку, также удобно добавить реквизит «СхемаКомпоновки» типа «Строка» или хранить схему в макете объекта — второй вариант предпочтительнее, потому что не хранит большой объект в данных формы.
Перетащите реквизит «РезультатДок» в дерево элементов формы. Платформа создаст элемент «Поле табличного документа». Установите свойства: «ТолькоПросмотр» — Истина, если редактирование не нужно; «ОтображениеСетки» и «ОтображениеЗаголовков» — по вкусу. Для растягивания на всю форму задайте «РастягиватьПоГоризонтали» и «РастягиватьПоВертикали».
Добавьте команду формы «Сформировать» и кнопку в командную панель. Команду обработайте на клиенте с вызовом серверной процедуры — сама компоновка должна выполняться на сервере, потому что запросы и макеты доступны только там.
Программная компоновка: код формирования отчёта
Базовый шаблон серверной процедуры выглядит так: получить схему, создать настройки, скомпоновать макет, выполнить вывод. Ниже пример для отчёта, у которого схема хранится в основном макете.
&НаСервере
Процедура СформироватьНаСервере()
РезультатДок.Очистить();
ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
СхемаКД = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = СхемаКД.НастройкиПоУмолчанию;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКД, Настройки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(РезультатДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
КонецПроцедуры
Если форма принадлежит внешней обработке, схему получают через ЭтотОбъект.ПолучитьМакет() в модуле объекта или через ПолучитьМакетОбработки в управляемой форме — для этого сначала преобразуйте реквизит формы в объект. Для отчёта в составе конфигурации достаточно Отчеты.ИмяОтчета.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных").
Обратите внимание на параметр Истина в методе Вывести — он включает проверку возможности вывода (ограничение по количеству записей). Без него при больших выборках форма может зависнуть.
Вывод типового отчёта на форму обработки
Когда нужен полноценный отчёт с настройками, проще всего создать объект «Отчёт» в конфигурации и открывать его штатную форму. Но если отчёт должен жить внутри обработки, добавьте в форму обработки реквизит «Отчет» типа «ОтчетОбъект.ИмяОтчета» и реквизит «РезультатДок». Затем вызовите типовую компоновку через метод объекта отчёта СкомпоноватьРезультат.
Такой подход даёт расшифровку, автоформирование и стандартную панель настроек практически бесплатно. Ограничение: форма становится тяжелее, а встраивание отчёта внутрь формы документа требует аккуратной работы с контекстом — отчёт не должен перекрывать обязательные реквизиты документа.
Если отчёт на форме нужен только для просмотра, отключите у поля табличного документа контекстное меню и редактирование — это убережёт от случайного изменения ячеек и лишних вопросов пользователей.
Проверка результата и типичные ошибки
После внедрения проверьте формирование на реальных данных: откройте форму, нажмите «Сформировать», убедитесь, что табличный документ заполнен, группировки разворачиваются, а расшифровка (если включена) открывает связанные объекты. Проверьте повторное формирование — документ должен очищаться, а не дополняться.
Самая частая ошибка — пустой результат при корректном запросе. Причины: не установлено «Использование» у параметра, отбор отсекает все данные, либо в схеме у поля нет ресурса. Вторая типичная проблема — ошибка «Поле не найдено»: в настройках используется поле, которого нет в наборе данных. Третья — формирование на клиенте: код компоновки выполняется только на сервере, в клиентской процедуре он упадёт.
Как проверить результат
Табличный документ заполнен, итоги соответствуют данным
Пустой документ или ошибка компоновки
Документ очищается и заполняется заново
Строки дублируются под прежним результатом
Изменение отбора меняет состав данных в отчёте
Отчёт одинаков при любых отборах
Форма открывается и формируется без заметных пауз
Зависание при открытии — вероятно, отчёт формируется в ПриСозданииНаСервере без необходимости
Ограничения и когда стоит привлечь специалиста
Программная компоновка — безопасная операция: она не меняет данные информационной базы, только читает их. Рисков для данных нет, но есть риски для производительности: отчёт по большой таблице без отборов может надолго заблокировать сеанс пользователя. Всегда задавайте разумные отборы по умолчанию и проверяйте отчёт на копии базы с реальным объёмом данных.
Обратитесь к разработчику, если нужна расшифровка с произвольными действиями, вывод нескольких схем рядом, интеграция с БСП (подсистема «Варианты отчётов») или доработка типовой конфигурации на поддержке — там ошибки обходятся дороже, чем время специалиста.
Что важно запомнить
Вывод СКД на форму сводится к цепочке: схема → настройки → компоновщик макета → процессор компоновки → процессор вывода → табличный документ. Компоновку выполняйте на сервере, очищайте результат перед формированием, проверяйте найденные параметры на Неопределено и не храните схему в реквизитах формы.
Частые вопросы
Можно ли вывести СКД на форму без создания отчёта в конфигурации?
Да. Схему компоновки можно хранить в макете обработки или даже построить программно через объект СхемаКомпоновкиДанных. Достаточно получить схему любым способом и передать её компоновщику макета — наличие объекта метаданных «Отчёт» не обязательно.
Почему отчёт формируется в конфигураторе, но пустой в режиме предприятия?
Чаще всего дело в правах доступа: пользователь не видит часть данных из-за RLS или отсутствия прав на регистры. Проверьте формирование под полными правами и сравните результат. Вторая причина — отборы по умолчанию, которые в реальных данных отсекают всё.
Как сделать расшифровку при программной компоновке?
При создании макета передайте в КомпоновщикМакета.Выполнить третьим параметром объект ДанныеРасшифровки, а результат сохраните в реквизит формы типа ДанныеРасшифровкиКомпоновкиДанных. Затем обработайте событие ОбработкаРасшифровки у поля табличного документа через ОбработкаРасшифровкиКомпоновкиДанных.
Как вывести результат СКД в таблицу значений, а не в табличный документ?
Используйте ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений вместо процессора вывода в табличный документ. Метод Вывести заполнит переданную таблицу значений, которую можно поместить в реквизит формы и отобразить элементом «Таблица формы».
Можно ли формировать отчёт автоматически при открытии формы?
Да, вызовите серверную процедуру формирования из обработчика ПриОткрытии на клиенте. Но делайте это только для быстрых отчётов: тяжёлая компоновка при открытии заставит пользователя ждать. Лучше показать форму сразу, а формирование запустить через ПодключитьОбработчикОжидания с минимальной задержкой.
Работает ли этот подход в тонком и веб-клиенте?
Да, табличный документ и вся цепочка компоновки поддерживаются в тонком и веб-клиенте. Ограничения касаются только интерактивных возможностей вроде редактирования табличного документа, которые для отчёта обычно не нужны.