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

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

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

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

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

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

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

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

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

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

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

Способ 1. Вывод строки из макета методом Вывести()

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

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

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

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

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

ОбластьСтрока.Параметры.Номенклатура = СтрокаТовара.Номенклатура;

ОбластьСтрока.Параметры.Количество = СтрокаТовара.Количество;

ОбластьСтрока.Параметры.Сумма = СтрокаТовара.Сумма;

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

КонецЦикла;

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

Порядок добавления строки через макет
  1. 1
    Создайте в макете именованную область-строку и разметьте в ячейках параметры
  2. 2
    В коде получите макет и область через ПолучитьОбласть()
  3. 3
    В цикле по данным заполните параметры области
  4. 4
    Выведите область методом ТабДок.Вывести()
  5. 5
    Проверьте результат, открыв табличный документ на просмотр

Способ 2. Копирование строки внутри документа методом ВставитьОбласть()

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

// Копируем строку 5 и вставляем её перед строкой 8

ОбластьИсточник = ТабДок.ПолучитьОбласть("R5");

ОбластьПриемник = ТабДок.Область("R8");

ТабДок.ВставитьОбласть(ОбластьИсточник.Область(), ОбластьПриемник,

ТипСмещенияТабличногоДокумента.ПоВертикали);

Тип смещения определяет, куда сдвинутся существующие ячейки: ПоВертикали — строки вниз, ПоГоризонтали — колонки вправо, БезСмещения — вставка поверх существующих данных с их перезаписью. Для добавления строки почти всегда нужен вертикальный сдвиг.

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

Способ 3. Запись значений напрямую в ячейки без макета

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

НомерСтроки = ТабДок.ВысотаТаблицы + 1;

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

ТабДок.Область(НомерСтроки, 2).Текст = 10;

ТабДок.Область(НомерСтроки, 3).Текст = 1500;

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

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

Сравнение способов добавления строки

Вывести() из макета

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

ВставитьОбласть()

Подходит для копирования и вставки строк внутри готового документа. Неудобен для первичного формирования из данных.

Запись в ячейки напрямую

Подходит для служебных выгрузок и отладки без макета. Всё оформление приходится задавать кодом.

Присоединение колонок методом Присоединить()

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

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

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

ОбластьШапкаСклад.Параметры.ИмяСклада = Склад.Наименование;

ТабДок.Присоединить(ОбластьШапкаСклад);

КонецЦикла;

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

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

После формирования документ проверяют визуально и программно. Программно полезны свойства ВысотаТаблицы и ШиринаТаблицы — они показывают фактические размеры заполненной области. Если после вывода десяти строк высота таблицы не изменилась, значит, вывод не выполнялся: например, цикл по данным оказался пустым.

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

Ещё одна типичная ситуация — обращение к несуществующей области макета. Метод ПолучитьОбласть("Строка") вызовет ошибку, если именованной области с таким именем нет или имя написано с опечаткой. Имя области в макете задаётся через выделение строк и ввод имени в поле имени области.

Типичные ошибки
01
Область получена из макета, но параметры не заполнены — в документе пустые ячейки или необработанные шаблоны
02
Опечатка в имени области — ПолучитьОбласть() вызывает исключение и печать прерывается
03
Использование Присоединить() вместо Вывести() — строки накладываются друг на друга по вертикали
04
Вставка области с типом смещения БезСмещения — существующие строки затираются вставленными
05
Перепутаны табличный документ и табличная часть — вызов Вывести() у табличной части невозможен

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

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

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

Высота таблицы после цикла
Норма

ВысотаТаблицы увеличилась на число выведенных строк

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

Высота не изменилась — цикл пустой или вывод не выполнялся

Содержимое ячеек
Норма

В ячейках реальные значения из данных

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

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

Структура колонок
Норма

Все строки выровнены по одним колонкам

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

Строки сдвинуты — применялся Присоединить вместо Вывести

Ограничения и нюансы производительности

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

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

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

Удобный приём: в макете рядом с областью «Строка» держите область «СтрокаГруппа» с другим оформлением для строк-группировок. В цикле выбирайте нужную область по типу записи — так печатная форма получает иерархию без усложнения кода.
ПЗ
Практическое замечание

FAQ по добавлению строк в табличный документ

Как добавить строку в середину уже сформированного документа?

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

Чем отличается добавление строки в табличный документ от добавления в табличную часть?

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

Почему после Вывести() в документе пустая строка?

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

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

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

Как вывести строки с разрывом страниц и повторением шапки?

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

Как удалить строку из табличного документа?

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

Итог

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

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