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

Разработка и Конфигурация · 10 мин

Как вывести макет на экран в 1С

Как вывести макет на экран в 1С: табличный документ через Показать(), поле табличного документа на форме, печать без диалога. Примеры кода и типичные ошибки.

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

Выбор способа зависит от контекста. Если документ нужно просто показать и, возможно, отправить на печать, достаточно метода Показать(). Если данные должны жить внутри формы обработки или документа — потребуется реквизит формы типа «ТабличныйДокумент» и элемент «ПолеТабличногоДокумента». Ниже разобраны оба сценария с рабочим кодом, проверкой результата и типичными ошибками.

Что такое макет и табличный документ в 1С

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

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

Быстрый способ: метод Показать()

Самый простой вариант — сформировать табличный документ и открыть его в отдельном окне. Метод Показать() принимает заголовок окна и, при необходимости, имя файла для сохранения. Документ открывается в режиме просмотра, из которого доступны печать и сохранение в файл.

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

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

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

Если документ должен отображаться внутри формы, добавьте в форму реквизит типа «ТабличныйДокумент» (например, РезультатДокумент) и перетащите его в дерево элементов — платформа создаст поле табличного документа. После этого заполнение реквизита автоматически отображается на экране.

Типичная ошибка — заполнять реквизит в серверной процедуре через Новый ТабличныйДокумент с последующим присваиванием. Правильнее работать с самим реквизитом: РезультатДокумент.Очистить(); и далее РезультатДокумент.Вывести(Область);. Присваивание РезультатДокумент = ТабДок; на сервере вызовет ошибку, потому что типы реквизита формы и объекта различаются.

Порядок действий для вывода на форму
  1. 1
    Добавьте реквизит формы с типом ТабличныйДокумент
  2. 2
    Перетащите реквизит в элементы формы — появится ПолеТабличногоДокумента
  3. 3
    В коде очистите реквизит: РезультатДокумент.Очистить()
  4. 4
    Получите макет и выводите области в реквизит методом Вывести()
  5. 5
    Установите свойства отображения: ТолькоПросмотр, ОтображатьСетку, Защита
  6. 6
    Обновите форму и проверьте результат в пользовательском режиме

Настройка отображения табличного документа

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

Для многостраничных документов настройте разбиение: АвтоМасштаб, МасштабПечати, ЧерноБелаяПечать, а также повторение шапки через ТабДок.ПовторятьПриПечатиСтроки. Эти свойства влияют и на предварительный просмотр, который пользователь открывает из окна табличного документа.

Макет получен, но экран пустойОбласти не выведены или выведены в другой объект

Проверьте, что Вывести() вызывается именно для того табличного документа, который показывается

Ошибка «Метод не обнаружен: Показать»Вызов в серверном или фоновом контексте

Перенесите показ в клиентскую процедуру

Параметры не подставляютсяИмя параметра в коде не совпадает с макетом

Сверьте имена параметров в свойствах ячеек макета

Вывод печатной формы из документа

В типовых конфигурациях печатные формы подключаются через подсистему «Управление печатью» БСП: в модуле менеджера объекта описывается процедура ДобавитьКомандыПечати, а формирование выполняется в процедуре Печать, которая заполняет табличный документ. Платформа сама открывает стандартную форму «Печать документов», поэтому вызывать Показать() не требуется.

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

Сравнение способов вывода

Показать()

Быстрый просмотр в отдельном окне. Не работает на сервере и в фоновых заданиях

Поле табличного документа на форме

Документ встроен в интерфейс, можно реагировать на события ячеек. Требует реквизита формы

Напечатать() с диалогом

Сразу отправка на печать без отдельного окна просмотра. Не подходит, если пользователь должен сначала проверить документ

Временное хранилище + открытие формы

Передача с сервера на клиент для толстого/тонкого клиента. Больше кода, но универсально

Типичные ошибки и как их избежать

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

Вторая группа ошибок связана с именами: область макета не найдена (ПолучитьОбласть вернул ошибку), параметр не заполнился из-за опечатки, макет не найден по имени. Имена областей чувствительны к регистру написания в макете, а у макета типа «Табличный документ» области задаются выделением строк и присвоением имени в свойствах.

Типичные ошибки
01
Вызов Показать() в серверной процедуре — ошибка выполнения, перенесите показ на клиент
02
Присваивание Новый ТабличныйДокумент реквизиту формы — несовпадение типов, работайте с реквизитом напрямую
03
Опечатка в имени области или параметра — область не выводится, параметр остаётся пустым
04
Вывод областей в локальную переменную, а показ другого объекта — пустое окно
05
Отсутствие Очистить() перед повторным формированием — данные дублируются при каждом нажатии кнопки

Проверка результата и отладка

Отлаживайте формирование по шагам: поставьте точку останова после каждого Вывести() и смотрите высоту табличного документа (ТабДок.ВысотаТаблицы) — она должна расти. Если высота не меняется, область не вывелась. Для проверки параметров выведите их значения в сообщение или смотрите в табло.

Полезный приём — временно сохранить документ в файл: ТабДок.Записать(ПолучитьИмяВременногоФайла(\"mxl\")); и открыть его в конфигураторе. Так видно итоговый результат независимо от механизма показа, что помогает отделить проблемы формирования от проблем отображения.

Контрольные точки

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

ВысотаТаблицы после Вывести()
Норма

Значение увеличивается на высоту области

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

Не меняется — область не выведена или пустая

Окно табличного документа
Норма

Открывается с заданным заголовком и заполненными данными

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

Пустое окно или ошибка при открытии

Параметры в ячейках
Норма

Подставлены реальные значения

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

Видны угловые скобки или пустые места

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

Документ пересоздаётся без дублей

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

Строки добавляются к предыдущему результату

Итог

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

Макет — это шаблон, на экран выводится табличный документ: ПолучитьМакет() → ПолучитьОбласть() → Вывести() → Показать(). Для формы используйте реквизит типа ТабличныйДокумент, а Показать() вызывайте только на клиенте.

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

Можно ли вывести макет на экран без программирования?

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

Почему Показать() выдаёт ошибку в регламентном задании?

Фоновые и регламентные задания выполняются на сервере без пользовательского интерфейса, поэтому интерактивные методы там запрещены. В таких сценариях табличный документ сохраняют в файл, отправляют по почте или складывают во временное хранилище для последующего открытия пользователем.

Как вывести макет горизонтально, присоединяя колонки?

Используйте метод Присоединить() вместо Вывести() — он добавляет область справа от уже выведенных. Так строят отчёты с динамическим числом колонок, например обороты по месяцам. Комбинация Вывести() для строк и Присоединить() для колонок покрывает большинство матричных отчётов.

Чем отличается макет табличного документа от макета СКД?

Макет табличного документа заполняется вручную по областям и даёт полный контроль над результатом. Макет СКД описывает структуру отчёта для компоновщика, а табличный документ формирует платформа по схеме компоновки. Для экранного вывода результата СКД используется программное формирование через ПроцессорКомпоновкиДанных и вывод в табличный документ.

Как запретить пользователю редактировать показанный документ?

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

Можно ли открыть табличный документ из файла MXL?

Да. Создайте табличный документ, выполните ТабДок.Прочитать(ИмяФайла); и затем вызовите Показать(). Это удобно для просмотра ранее сохранённых печатных форм и для отладки: файл формируется на сервере, а открывается на клиенте.