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

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

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

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

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

Выбор подхода зависит от задачи. Если нужно сформировать простую таблицу с переменным числом строк — удобнее прямая запись в ячейки. Если требуется типовая печатная форма с шапкой, подвалом, рамками и фирменным оформлением — правильнее создать макет с именованными областями и выводить их последовательно. Смешивать оба подхода в одном документе можно, но делать это нужно осознанно, чтобы не сбить нумерацию строк.

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

Создание объекта табличного документа

Табличный документ создаётся конструктором Новый ТабличныйДокумент. После создания объект пуст: в нём нет ни строк, ни ячеек, и любые обращения к областям нужно выполнять только после записи данных или вывода областей макета.

ТабДок = Новый ТабличныйДокумент;

Объект существует в памяти на сервере или на клиенте в зависимости от того, где выполняется код. Для формирования печатных форм и отчётов стандартная практика — создавать и заполнять документ на сервере, а на клиент передавать уже готовый результат для показа или сохранения. Это снижает объём передаваемых данных и упрощает диагностику ошибок.

Перед заполнением полезно сразу задать ключевые свойства документа: АвтоМасштаб, ОриентацияСтраницы, Защита, ТолькоПросмотр. Например, для печатной формы, которую пользователь не должен редактировать, устанавливают ТабДок.ТолькоПросмотр = Истина — это исключает случайное изменение данных перед печатью.

Способ 1. Прямая запись в ячейки

Простейший способ записать значение — обратиться к ячейке по координатам через метод Область() и присвоить текст. Координаты задаются либо числовыми индексами строки и колонки, либо адресом в стиле «R1C1».

ТабДок = Новый ТабличныйДокумент;

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

ТабДок.Область("R1C2").Текст = "Количество";

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

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

ТабДок.Область("R" + НомерСтроки + "C1").Текст = СтрокаТовара.Наименование;

ТабДок.Область("R" + НомерСтроки + "C2").Текст = СтрокаТовара.Количество;

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

КонецЦикла;

Такой подход удобен для служебных выгрузок, простых таблиц и случаев, когда структура формируется динамически и макет заранее создать нельзя. Через ту же область доступны свойства оформления: Шрифт, ЦветФона, Границы, ГоризонтальноеПоложение. Это позволяет программно выделить итоговые строки или подсветить ячейки с отклонениями.

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

Способ 2. Вывод областей из макета

Основной приём для печатных форм — макет типа «Табличный документ», добавленный в дерево конфигурации или в дополнительные макеты обработки. В макете заранее рисуют шапку, строку данных и подвал, а в ячейках размещают параметры вида [Номенклатура] или шаблоны. Каждой логической части присваивают именованную область.

В коде области получают методом Макет.ПолучитьОбласть("ИмяОбласти"), заполняют параметры через Область.Параметры.ИмяПараметра = Значение и выводят в документ методом Вывести():

ТабДок = Новый ТабличныйДокумент;

Макет = ПолучитьМакет("МакетНакладной");

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

ОбластьШапка.Параметры.НомерДокумента = НомерДок;

ОбластьШапка.Параметры.Контрагент = Контрагент;

ТабДок.Вывести(ОбластьШапка);

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

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

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

ТабДок.Вывести(ОбластьСтрока);

КонецЦикла;

Метод Параметры.Заполнить() удобен, когда имена параметров в макете совпадают с именами полей источника данных: все совпадающие параметры заполнятся одной строкой кода. Несовпадающие параметры при этом остаются пустыми, поэтому важно контролировать имена при изменении макета.

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

Порядок действий при выводе через макет
  1. 1
    Создайте макет типа «Табличный документ» и нарисуйте области: шапку, строку, подвал
  2. 2
    Выделите нужные строки и задайте имена областей через свойства
  3. 3
    В ячейках укажите параметры в квадратных скобках, например [Номенклатура]
  4. 4
    В коде получите макет и нужную область методом ПолучитьОбласть()
  5. 5
    Заполните параметры области значениями из источника данных
  6. 6
    Выведите область методом Вывести() или Присоединить()
  7. 7
    Проверьте результат: откройте документ и убедитесь, что все параметры заменены и строки идут в нужном порядке

Работа с параметрами, шаблонами и форматированием

В макете ячейка может содержать не только параметр, но и шаблон — текст с вставками вида Товар: [Номенклатура], количество: [Количество]. Тип заполнения ячейки задаётся в свойствах: «Текст», «Параметр» или «Шаблон». Если тип указан неверно, параметр не подставится и на печать выйдет буквальная строка в квадратных скобках — это один из самых заметных дефектов при проверке.

Числа и даты лучше форматировать явно через функцию Формат() перед передачей в параметр, если требуется строгое представление: Формат(СуммаДокумента, "ЧДЦ=2"). Иначе представление зависит от региональных настроек сеанса, и у разных пользователей одна и та же форма может выглядеть по-разному.

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

Если после вывода в документе видны строки вида [ИмяПараметра], причина почти всегда одна из трёх: тип ячейки в макете не «Параметр», имя параметра в коде не совпадает с именем в макете (регистр не важен, но опечатки — да), либо параметр просто не заполнен перед Вывести().
ПЗ
Практическое замечание

Проверка результата и разрывы страниц

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

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

Сохранение в файл выполняется методом Записать() с указанием типа файла: ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX). Поддерживаются форматы MXL, XLS, XLSX, ODS, PDF, HTML и другие. Учтите, что при записи в Excel часть оформления (некоторые границы, объединения) может переноситься с отличиями — стоит проверять результат на реальных формах, а не на упрощённых примерах.

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

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

Содержимое параметров
Норма

Все значения подставлены, квадратных скобок в тексте нет

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

Видны строки вида [ИмяПараметра] — параметр не заполнен или тип ячейки неверный

Направление вывода
Норма

Строки идут сверху вниз, колонки — слева направо

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

Данные уходят вправо вместо вниз — перепутаны Вывести() и Присоединить()

Разбивка на страницы
Норма

Шапка и строки не разрываются, итоги на своей странице

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

Шапка на одной странице, данные на другой — нет ПроверитьВывод()

Типичные ошибки и ограничения

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

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

Наконец, не стоит путать табличный документ с таблицей значений. Таблица значений — структура данных для обработки, табличный документ — представление для показа и печати. Записывать данные «для хранения» в табличный документ не нужно: после закрытия сеанса его содержимое не сохраняется, если вы явно не записали его в файл или хранилище.

Типичные ошибки
01
Перепутаны Вывести() и Присоединить() — строки уходят вправо, форма «расползается» по ширине
02
Получение области макета внутри цикла — формирование большой формы занимает в разы больше времени
03
Тип ячейки «Текст» вместо «Параметр» — на печать выводится буквальная строка [ИмяПараметра]
04
Формирование макета на тонком клиенте — ошибка вызова серверных методов получения макета
05
Отсутствие ПроверитьВывод() — шапка отрывается от данных при разбивке на страницы

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

Прямая запись в ячейки

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

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

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

СКД (схема компоновки данных)

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

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

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

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

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

Отдельной команды «заполнить из таблицы значений» нет. Стандартный приём — цикл по строкам таблицы значений с выводом области-строки и заполнением параметров через Параметры.Заполнить(СтрокаТЗ). Чтобы это работало, имена колонок таблицы значений должны совпадать с именами параметров макета.

Как объединить ячейки программно?

Получите диапазон через метод Область() с указанием начальной и конечной ячеек, например Область("R1C1:R1C3"), и вызовите у него метод Объединить(). Разъединение выполняется методом Разъединить(). Учтите, что после объединения текст диапазона хранится в левой верхней ячейке.

Почему при записи в Excel теряется часть оформления?

Форматы XLS и XLSX поддерживают не все возможности оформления табличного документа 1С: некоторые виды границ, автоотступ и специфические настройки масштаба переносятся с отличиями. Если критична точная передача внешнего вида, сохраняйте в PDF или MXL, а Excel используйте только для передачи данных.

Как сделать, чтобы шапка таблицы повторялась на каждой странице при печати?

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

Чем вывод через Присоединить() отличается от Вывести()?

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

Итог

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

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