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