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

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

1С: макет с вложенными областями — как правильно вывести

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

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

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

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

Что такое вложенные области в макете 1С

Область макета — это именованный диапазон ячеек. Области бывают горизонтальными (по строкам), вертикальными (по столбцам) и прямоугольными. Когда одна область полностью охватывает другую по строкам, возникает вложенность: например, область «ГруппаТовары» включает в себя области «СтрокаТовара» и «ИтогГруппы».

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

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

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

Откройте макет (общий макет или макет объекта) типа «Табличный документ». Чтобы создать область, выделите нужные строки целиком (клик по заголовкам строк слева) и выполните Таблица → Имена → Назначить имя (Ctrl+Shift+N). Имя должно быть допустимым идентификатором: без пробелов, не начинаться с цифры.

Создание вложенных областей
  1. 1
    Создайте макет типа «Табличный документ» и оформите шапку, строки и подвал
  2. 2
    Выделите строки внутренней области (например, строку товара) и назначьте имя «Строка»
  3. 3
    Выделите более широкий диапазон строк, включающий «Строку» и итоги, назначьте имя «Группа»
  4. 4
    Проверьте структуру: Таблица → Имена — вложенные области отображаются иерархически
  5. 5
    Сохраните макет и обновите конфигурацию базы данных

Для параметров внутри ячеек используется шаблон: текст вида [Номенклатура] в свойстве «Текст» ячейки с типом заполнения «Параметр» или «Шаблон». Параметр подставляется целиком, шаблон позволяет смешивать текст и значения, например: Итого по группе [Группа]: [СуммаИтог].

Типичная структура макета печатной формы с вложенностью: «Шапка» → «ГруппаШапка» (содержит вложенные «Строка» и «ГруппаПодвал») → «Подвал». Имена давайте осмысленные — через месяц сопровождения «Область1» ничего не скажет ни вам, ни коллегам.

Вывод областей: ПолучитьОбласть, Вывести, Присоединить

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

bsl
Макет = Документы.РеализацияТоваровУслуг.ПолучитьМакет("Печать");
ТабДок = Новый ТабличныйДокумент;

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

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

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

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

Вывод вложенных областей по выборке с группировками

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

bsl
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Склад КАК Склад,
| Товары.Номенклатура КАК Номенклатура,
| СУММА(Товары.Сумма) КАК Сумма
|ИЗ Документ.Реализация.Товары КАК Товары
|СГРУППИРОВАТЬ ПО Товары.Склад, Товары.Номенклатура
|ИТОГИ СУММА(Сумма) ПО Склад";

ВыборкаГрупп = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаГрупп.Следующий() Цикл
    ОбластьГруппа = Макет.ПолучитьОбласть("ГруппаШапка");
    ОбластьГруппа.Параметры.Заполнить(ВыборкаГрупп);
    ТабДок.Вывести(ОбластьГруппа);

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

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

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

Вывод родительской области целиком и когда это нужно

Если вызвать Макет.ПолучитьОбласть("Группа"), где «Группа» — родительская область, вы получите все её строки, включая вложенные области, одним фрагментом. Это удобно, когда структура фрагмента фиксирована и не зависит от данных: например, блок «Подписи» с несколькими строками, оформленный как одна родительская область.

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

Два подхода к выводу

Родительская область целиком

Подходит для фиксированных блоков: шапка, подписи, реквизиты. Быстро и просто, но без построчной гибкости.

Вложенные области по отдельности

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

Схема компоновки данных вместо макета

Для сложных отчётов с произвольными группировками СКД обычно удобнее ручного вывода областей.

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

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

Типичные ошибки
01
Получение области внутри цикла — лишние обращения к макету и замедление на больших документах
02
Имя области не совпадает с именем в коде — исключение «Область не найдена» при выводе
03
Параметр в макете назван иначе, чем в коде — ячейка выводится с текстом шаблона или пустой
04
Обход выборки без указания ПоГруппировкам — вместо групп выводятся детальные строки с NULL в группе
05
Вывод строк без проверки УместитьНаСтранице — разрыв таблицы в неподходящем месте при печати

Вторая группа проблем — «молчаливые»: параметр не заполнился, потому что в макете он называется «Сумма», а в коде присваивается «СуммаИтог». Исключения не будет — просто пустая ячейка. Проверяйте соответствие имён параметров в макете и коде, особенно после переименований.

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

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

Структура областей в макете
Норма

В окне имён видна иерархия: родительская область содержит вложенные

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

Области идут плоским списком или пересекаются частично

Вывод печатной формы
Норма

Шапка один раз, строки по числу записей, итоги по каждой группе

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

Дубли шапки, пустые строки, итоги не на своих местах

Параметры
Норма

Все ячейки с параметрами заполнены данными

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

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

Ограничения и альтернативы

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

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

Удобный приём: получайте все нужные области в переменные в начале процедуры и давайте переменным те же имена, что у областей макета. Тогда код вывода читается как структура печатной формы, а ошибку в имени видно сразу.
ПЗ
Практическое замечание

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

Можно ли получить вложенную область, не обращаясь к родительской?

Да. Метод ПолучитьОбласть работает с любой именованной областью макета независимо от уровня вложенности. Вложенность влияет только на то, какие строки попадут в родительскую область при её получении целиком.

Почему при выводе родительской области параметры вложенных областей не заполняются?

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

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

Используйте метод Присоединить вместо Вывести — он добавляет область справа от текущей позиции. Области для присоединения обычно создают по столбцам. Сочетание Вывести и Присоединить позволяет строить матричные формы.

Что делать, если строки не помещаются на страницу при печати?

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

Чем вывод через макет отличается от СКД?

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

Почему после изменения макета печатная форма выводится по-старому?

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

Итог

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

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