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