Как работать с вложенными именованными областями в макетах 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Постановка задачи: вложенность против декомпозиции

Рассмотрим типичную ситуацию: у нас есть область Шапка, внутри которой должны выводиться разные данные в зависимости от типа документа (например, договор поставки или договор комиссии). Мы можем создать внутри области Шапка две вложенные подобласти: ШапкаПоставка и ШапкаКомиссия. Проанализируем, как платформа позволяет с ними взаимодействовать.

Вариант 1. Прямое обращение к вложенным областям

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

Проанализируем пример кода:


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

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

Вариант 2. Разделение макета на независимые части

Как показывает практика и обсуждения опытных разработчиков, наиболее надежным и «прозрачным» способом является разбиение одной сложной области на три последовательные части:

  1. ОбластьШапка_Начало (общие данные до вариативной части).
  2. ОбластьШапка_Вариант (конкретная реализация для типа договора).
  3. ОбластьШапка_Конец (общие данные после вариативной части).

Рассмотрим преимущества этого метода: код становится линейным, его легко отлаживать, а макет в конфигураторе выглядит наглядно. Вы последовательно вызываете метод Вывести() для каждой части, формируя итоговый документ как конструктор.

Вариант 3. Динамическое управление видимостью вложенных строк

Если мы хотим использовать возможности именно вложенности, мы можем применить управление свойством Видимость. Это более современный и гибкий подход, чем физическое удаление областей. Проанализируем алгоритм действий:

  1. Получаем всю родительскую область Шапка целиком.
  2. Внутри полученного объекта (который является типом ТабличныйДокумент) находим строки, принадлежащие ненужной нам вложенной области.
  3. Устанавливаем свойство Видимость в значение Ложь для этих строк.

Пример реализации:


ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
Если ТипДоговора = Перечисления.ТипыДоговоров.Поставка Тогда
    // Скрываем область комиссии внутри полученной шапки
    ОбластьШапка.Область("ШапкаКомиссия").Видимость = Ложь;
КонецЕсли;
ТабДок.Вывести(ОбластьШапка);

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

Вариант 4. Метод ВставитьОбласть для динамического расширения

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

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

Работа с квалифицированными именами (обращение через точку)

Выясним причину, по которой 1С поддерживает вложенность на уровне имен. Если ваш макет очень большой и содержит много логических блоков (например, несколько разделов отчета), вы можете столкнуться с дублированием имен. Вложенность позволяет использовать конструкции вида Макет.ПолучитьОбласть("Раздел1.Заголовок") и Макет.ПолучитьОбласть("Раздел2.Заголовок"). Это гарантирует, что вы получите именно тот фрагмент, который находится внутри нужного родительского контейнера.

Геометрическая логика и автоматическая группировка

Рассмотрим еще один аспект: зачем 1С физически позволяет рисовать одну область внутри другой в редакторе макетов? Это сделано для автоматизации иерархических отчетов. Если вы выводите области последовательно, и они имеют вложенную структуру координат, платформа может автоматически создавать «плюсики» (группировки) в левой части документа. Для этого при выводе данных используется настройка уровней группировки. Это значительно упрощает визуальное восприятие больших документов, позволяя пользователю сворачивать и разворачивать детальные подразделы внутри заголовков.

Выводы и рекомендации

Проанализировав все способы, можно сделать следующие выводы:

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

← На главную