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

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

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

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

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

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

Материал ориентирован на разработчиков и внедренцев, работающих с управляемыми и обычными формами. Примеры кода приведены на встроенном языке 1С и применимы к платформе 8.3; в более ранних версиях синтаксис методов тот же, но могут отличаться свойства макетов.

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

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

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

Базовый пример: получить область и вывести её

Минимальный рабочий код вывода печатной формы состоит из четырёх шагов: создание табличного документа, получение макета, получение области и её вывод. Ниже пример для макета с областями «Шапка» и «Строка».

bsl
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МакетНакладной");

ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.НомерДокумента = Номер;
ОбластьШапка.Параметры.ДатаДокумента = Формат(Дата, "ДЛФ=D");
ТабДок.Вывести(ОбластьШапка);

ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Для Каждого СтрокаТовара Из Товары Цикл
    ОбластьСтрока.Параметры.Заполнить(СтрокаТовара);
    ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

Обратите внимание на метод Параметры.Заполнить(): он переносит в область все параметры, имена которых совпадают с именами свойств источника (например, колонок строки табличной части). Это удобнее, чем присваивать каждый параметр вручную, но требует, чтобы имена в макете точно совпадали с именами колонок.

После заполнения документ показывают пользователю методом ТабДок.Показать() либо отправляют на печать через ТабДок.Напечатать(). Для управляемых форм чаще используют Показать() с режимом или передают документ в стандартную команду печати БСП.

Порядок вывода области
  1. 1
    Создайте объект: ТабДок = Новый ТабличныйДокумент
  2. 2
    Получите макет: Макет = ПолучитьМакет("ИмяМакета") или ЭтотОбъект.ПолучитьМакет() в модуле объекта
  3. 3
    Получите область: Область = Макет.ПолучитьОбласть("ИмяОбласти")
  4. 4
    Заполните параметры области данными
  5. 5
    Выведите область: ТабДок.Вывести(Область)
  6. 6
    Покажите результат: ТабДок.Показать() или отправьте на печать

Способы указания области в ПолучитьОбласть

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

СпособСинтаксисКогда применять
Именованная областьПолучитьОбласть("Шапка")Стандартный вариант, область создана дизайнером макетов
Диапазон строкПолучитьОбласть("R5:R10")Область не именована, строки известны
Координаты ячеекПолучитьОбласть("R2C1:R5C4")Прямоугольный фрагмент без имени
Область внутри областиОбласть.Область("Имя")Обращение к вложенной области уже полученного фрагмента

На практике именованные области предпочтительнее: адресация по координатам ломается при любом редактировании макета (добавили строку — сместились все R-ссылки). Имена же сохраняются при вставке и удалении строк, если сама область не затронута.

Вывести или Присоединить: вертикальный и горизонтальный вывод

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

Вывести против Присоединить

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

Добавляет область снизу. Подходит для строк таблицы, шапок, подвалов. Не подходит для горизонтального наращивания колонок.

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

Добавляет область справа от последнего выведенного столбца. Подходит для отчётов с динамическим числом колонок. Требует контроля ширины, иначе документ расползётся.

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

Проверка поместится ли область: ВывестиГоризонтально и ПроверитьВывод

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

bsl
МассивОбластей = Новый Массив;
МассивОбластей.Добавить(ОбластьСтрока);
МассивОбластей.Добавить(ОбластьПодвал);

Если Не ТабДок.ПроверитьВывод(МассивОбластей) Тогда
    ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ТабДок.Вывести(ОбластьСтрока);

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

Типичные ошибки и их диагностика

Большинство проблем при выводе областей сводится к нескольким повторяющимся причинам. Их легко распознать по тексту ошибки или по внешнему виду результата.

Типичные ошибки
01
Ошибка «Область не найдена» — имя в ПолучитьОбласть не совпадает с именем в макете, включая регистр и пробелы; проверьте имя в конфигураторе
02
Пустые ячейки вместо данных — параметры области не заполнены или имена параметров в макете не совпадают с именами в коде
03
Значение «<Объект>» в ячейке — в параметр передана ссылка или составной объект вместо строкового представления; используйте Строка(Ссылка) или нужный реквизит
04
Съехавшие строки при Присоединить — высота присоединяемой области отличается от высоты уже выведенного блока
05
Дублирование данных в строках — область получена один раз, но параметры не очищаются между итерациями; получайте область заново или явно перезаполняйте все параметры

Отдельного внимания заслуживает последняя ошибка: область — это объект, и её параметры сохраняют значения между вызовами Вывести(). Если в цикле заполняются не все параметры, в следующей строке «всплывут» значения предыдущей. Надёжная практика — получать область заново внутри цикла или явно присваивать каждый параметр на каждой итерации.

Проверка результата и ограничения механизма

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

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

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

Имена областей и параметров
Норма

Код выполняется без исключений, все ячейки заполнены

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

Ошибка «область не найдена» или пустые ячейки

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

Подвал и последняя строка на одной странице, нет пустых листов

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

Подвал на отдельном листе, разрывы посередине таблицы

Данные в строках
Норма

Каждая строка содержит свои значения

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

Повторяются данные предыдущей строки

Ширина при присоединении
Норма

Колонки выровнены, текст не обрезан

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

Строки смещены, часть колонок за пределами печати

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

Итог

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

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

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

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

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

Чем отличается параметр от шаблона в макете?

Параметр — это ячейка, целиком заменяемая значением из кода (свойство ячейки «Заполнение» = Параметр). Шаблон — текст с подстановками в квадратных скобках, например «от [ДатаДокумента]», где заменяется только часть строки. Шаблоны удобны для составных надписей, параметры — для отдельных значений.

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

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

Почему вместо значения выводится текст «<Объект>» или пусто?

В параметр передано значение, которое не приводится к строке автоматически (например, ссылка на объект в некоторых контекстах или значение неопределённого типа). Передайте строковое представление явно: Строка(Значение), Формат(Дата, "ДЛФ=D") или конкретный реквизит ссылки.

Как вывести область только при выполнении условия?

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

Работает ли этот механизм на тонком клиенте и в веб-клиенте?

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