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