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

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

Как заполнить табличный документ на форме в 1С

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

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

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

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

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

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

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

Подготовка макета с областями

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

В ячейках, куда должны подставляться данные, задайте параметры. Для этого в свойстве ячейки «Заполнение» выберите «Параметр», а в тексте ячейки укажите имя в квадратных скобках, например [Номенклатура] или [Сумма]. Если нужен шаблон с фиксированным текстом и вставками, используйте заполнение «Шаблон» и конструкцию вида Договор № [НомерДоговора] от [ДатаДоговора].

Проверьте макет до написания кода: имена областей и параметров чувствительны к регистру и опечаткам, а ошибка в имени проявится только в момент выполнения. Удобно выписать список параметров каждой области в комментарий рядом с кодом заполнения — это ускоряет поддержку.

Программное заполнение документа на форме

Основной код размещают в модуле формы, обычно в команде «Сформировать» или в обработчике ПриСозданииНаСервере, если документ должен строиться сразу при открытии. Сначала очистите реквизит, чтобы повторное формирование не дописывало данные в конец: РезультатДокумент.Очистить();. Затем получите макет и нужные области.

Типовой фрагмент заполнения выглядит так:

&НаСервере

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

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

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

ОбластьШапка = Макет.ПолучитьОбласть("Шапка");

ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");

ОбластьШапка.Параметры.ПериодОтчета = ПериодСтрокой;

РезультатДокумент.Вывести(ОбластьШапка);

ИтогоСумма = 0;

Для Каждого СтрокаТовара Из Товары Цикл

ОбластьСтрока.Параметры.Заполнить(СтрокаТовара);

РезультатДокумент.Вывести(ОбластьСтрока);

ИтогоСумма = ИтогоСумма + СтрокаТовара.Сумма;

КонецЦикла;

ОбластьПодвал.Параметры.ИтогоСумма = ИтогоСумма;

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

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

Метод Параметры.Заполнить(Источник) переносит значения по совпадающим именам, что удобно при работе со строками таблиц значений и выборок из запроса. Если имён много и они различаются, заполняйте параметры по одному. Помните, что параметры области сохраняются между вызовами Вывести() — если в очередной итерации параметр не заполнить, в строку попадёт значение из предыдущей.

Порядок действий
  1. 1
    Добавьте на форму реквизит типа «ТабличныйДокумент» и связанный элемент формы
  2. 2
    Создайте макет с именованными областями и параметрами в ячейках
  3. 3
    В коде очистите документ и получите макет через ПолучитьМакет()
  4. 4
    Получите области методом ПолучитьОбласть() и заполните их параметры
  5. 5
    Выведите области последовательно методом Вывести()
  6. 6
    Проверьте результат на форме и в режиме предварительного просмотра печати

Заполнение без макета: прямое обращение к ячейкам

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

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

РезультатДокумент.Область(1, 1).Текст = "Номенклатура";

РезультатДокумент.Область(1, 2).Текст = "Сумма";

НомерСтроки = 2;

Для Каждого СтрокаТовара Из Товары Цикл

РезультатДокумент.Область(НомерСтроки, 1).Текст = Строка(СтрокаТовара.Номенклатура);

РезультатДокумент.Область(НомерСтроки, 2).Текст = Формат(СтрокаТовара.Сумма, "ЧДЦ=2");

НомерСтроки = НомерСтроки + 1;

КонецЦикла;

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

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

Макет с областями

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

Прямое обращение к ячейкам

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

Построитель отчёта / СКД

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

Колонтитулы, масштаб и настройки печати

После заполнения содержимого настройте параметры вывода на бумагу прямо в коде. У табличного документа доступны свойства: АвтоМасштаб, ОриентацияСтраницы, ПолеСлева, ПолеСверху, ЧерноБелаяПечать и другие. Колонтитулы задаются через объекты ВерхнийКолонтитул и НижнийКолонтитул, где можно вывести номер страницы и название документа:

РезультатДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;

РезультатДокумент.АвтоМасштаб = Истина;

РезультатДокумент.НижнийКолонтитул.Выводить = Истина;

РезультатДокумент.НижнийКолонтитул.ТекстСправа = "Стр. [&НомерСтраницы] из [&ВсегоСтраниц]";

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

Если строки данных выводятся через ПроверитьВывод() с массивом областей строки и подвала, документ не будет разрывать итоговую строку на две страницы. Это особенно заметно на длинных печатных формах: без проверки подвал может «оторваться» от последней строки данных.
ПЗ
Практическое замечание

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

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

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

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

Содержимое документа
Норма

Все области выведены, параметры подставлены, итоги совпадают с источником

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

Пустые ячейки с текстом в квадратных скобках или нулевые итоги

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

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

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

Данные дописываются ниже предыдущих

Предпросмотр печати
Норма

Документ помещается в ширину страницы, подвал не оторван от данных

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

Колонки обрезаны, итоги на отдельном листе

Частая причина пустого документа — вызов ПолучитьМакет() в неподходящем контексте. На тонком клиенте метод доступен только на сервере, поэтому формирование должно выполняться в серверной процедуре. Другая распространённая ситуация — незаполненные параметры отображаются как пустые ячейки, а ячейки с шаблоном оставляют видимыми фрагменты вроде [НомерДоговора]: это признак того, что параметр не был присвоен или его имя не совпадает с именем в макете.

Типичные ошибки
01
Нет вызова Очистить() перед формированием — данные дублируются при повторном нажатии кнопки
02
Опечатка в имени области или параметра — ошибка выполнения или пустые ячейки
03
Параметры области не сбрасываются в цикле — в строки попадают значения предыдущей итерации
04
Формирование в клиентской процедуре — ПолучитьМакет() недоступен на тонком клиенте
05
Числа записаны через Текст без Формат() — в документе лишние дробные знаки и разделители

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

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

Да, через прямое обращение к ячейкам методом Область(строка, колонка) с установкой свойства Текст. Это удобно для динамических таблиц с переменным числом колонок, но всё оформление придётся задавать кодом, а числа форматировать вручную. Для печатных форм макет предпочтительнее.

Почему после формирования документ пустой, хотя код выполняется без ошибок?

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

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

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

Как сохранить заполненный табличный документ в файл?

Используйте метод Записать() с указанием пути и типа файла, например РезультатДокумент.Записать(Путь, ТипФайлаТабличногоДокумента.PDF). Доступны форматы MXL, PDF, XLSX, HTML и другие. На сервере файл создаётся в файловой системе сервера, поэтому для передачи пользователю используйте временное хранилище.

Почему в ячейках виден текст вида [ИмяПараметра]?

Это означает, что для ячейки с типом заполнения «Шаблон» или «Параметр» значение параметра не было присвоено в коде, либо имя параметра в коде не совпадает с именем в макете. Проверьте регистр букв и лишние пробелы в имени параметра в свойствах ячейки.

Можно ли дать пользователю редактировать документ на форме перед печатью?

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

Итог

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

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