Разработка и Конфигурация · 12 мин
Как вставить область в макет 1С
Как вставить область в макет 1С: именованные области, вставка через конфигуратор и программно, методы ПолучитьОбласть и ВставитьОбласть, типичные ошибки и проверка результата.
Макет табличного документа в 1С состоит из областей — именованных фрагментов, которые можно извлекать, заполнять параметрами и выводить в результирующий документ. Вставить область в макет можно двумя способами: создать её в конфигураторе при проектировании макета или программно добавить одну область в другую с помощью методов объекта ТабличныйДокумент. Оба подхода регулярно используются при разработке печатных форм и отчётов.
Ошибки при работе с областями — одна из самых частых причин «битых» печатных форм: съезжает форматирование, теряются параметры, документ выводится без нужных секций. Чтобы этого избежать, важно понимать, чем именованная область отличается от диапазона ячеек, как работают методы ПолучитьОбласть, Вывести и ВставитьОбласть, и какие ограничения есть у каждого подхода.
Материал ориентирован на платформу 1С:Предприятие 8.3. Примеры кода приведены на встроенном языке и работают как в толстом, так и в тонком клиенте, если не указано иное.
Что такое область в макете 1С и какие виды бывают
Область макета — это именованный или адресуемый диапазон ячеек табличного документа. По типу различают области «Строки», «Колонки» и «Прямоугольник». Строки и колонки создаются выделением целых строк или колонок, прямоугольная область — выделением произвольного диапазона ячеек с последующим заданием имени.
Именованные области нужны, чтобы программно обращаться к фрагменту макета по имени: макет.ПолучитьОбласть("Шапка"). Безымянные области доступны только по координатам (например, R1:R5 — строки с первой по пятую), что делает код хрупким при изменении макета. Поэтому для областей, которые выводятся из кода, всегда задавайте осмысленные имена: Шапка, СтрокаТовары, Подвал, Итоги.
Внутри области могут находиться параметры — ячейки с типом заполнения «Параметр» или «Шаблон». Параметр подставляет одно значение, шаблон позволяет встроить несколько параметров в текст ячейки через квадратные скобки, например: «Договор № [НомерДоговора] от [ДатаДоговора]». Имена параметров в шаблоне должны совпадать с именами, которые вы передаёте через коллекцию Параметры области.
Как создать именованную область в конфигураторе
Откройте макет (общий макет или макет объекта) в конфигураторе. Чтобы создать область из строк, выделите нужные строки, кликнув по номеру первой строки и протянув выделение до последней. Затем выполните команду меню «Таблица → Имена → Назначить имя» или нажмите Ctrl+Shift+N. В диалоге укажите имя области — оно должно начинаться с буквы и не содержать пробелов.
Для области из колонок действия аналогичны, но выделяются колонки по их заголовкам. Прямоугольную область создают выделением диапазона ячеек мышью, после чего имя задаётся той же командой. Платформа сама определит тип области по характеру выделения.
- 1Откройте макет табличного документа в конфигураторе
- 2Выделите строки, колонки или диапазон ячеек для будущей области
- 3Нажмите Ctrl+Shift+N или выберите Таблица → Имена → Назначить имя
- 4Введите имя области без пробелов и подтвердите
- 5Задайте параметры в ячейках области при необходимости
- 6Сохраните макет и обновите конфигурацию базы данных
Проверить, что область создана, можно через меню «Таблица → Имена → Именованные области»: в списке отобразятся все области макета с их типами и границами. Там же область можно переименовать или удалить. Учтите: переименование области ломает весь код, который обращается к ней по старому имени, поэтому после переименования выполните поиск вхождений имени по конфигурации.
Программное извлечение и вывод области
Базовый сценарий вывода печатной формы выглядит так: получить макет, извлечь из него области, заполнить параметры и последовательно вывести области в табличный документ-результат. Для этого используются методы ПолучитьМакет объекта или менеджера, ПолучитьОбласть у макета и Вывести у результирующего документа.
Макет = Документы.РеализацияТоваровУслуг.ПолучитьМакет("Печать");
ТабДок = Новый ТабличныйДокумент;
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.НомерДокумента = Ссылка.Номер;
ОбластьШапка.Параметры.ДатаДокумента = Формат(Ссылка.Дата, "ДЛФ=D");
ТабДок.Вывести(ОбластьШапка);
ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаТовары");
Для Каждого СтрокаТовара Из Ссылка.Товары Цикл
ОбластьСтрока.Параметры.Заполнить(СтрокаТовара);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
Метод Вывести добавляет область в конец документа — новые строки дописываются ниже уже выведенных. Метод ПолучитьОбласть без аргументов возвращает весь макет целиком, что удобно для простых одностраничных форм. Обратите внимание: одну и ту же область (например, строку табличной части) можно извлечь один раз и выводить многократно в цикле, каждый раз перезаполняя параметры — это стандартная практика, а не ошибка.
Метод Параметры.Заполнить() принимает структуру, выборку из запроса или строку табличной части и подставляет значения по совпадающим именам. Параметры, которым не нашлось значения, останутся пустыми — это не вызовет ошибку, но в печатной форме появятся пропуски. Обращение к несуществующему параметру напрямую (Область.Параметры.ТакогоНет = 1) вызовет исключение.
Вставка области в произвольное место документа
Когда область нужно добавить не в конец, а в середину уже сформированного документа, используется метод ВставитьОбласть. Он принимает область-приёмник (куда вставлять), область-источник (что вставлять) и необязательные параметры типа смещения и заполнения.
// Вставить блок подписей перед строкой 10
ОбластьПриемник = ТабДок.Область("R10");
ОбластьИсточник = Макет.ПолучитьОбласть("Подписи");
ТабДок.ВставитьОбласть(ОбластьПриемник, ОбластьИсточник,
ТипСмещенияТабличногоДокумента.ПоВертикали);
Тип смещения определяет, как раздвинется существующее содержимое: ПоВертикали сдвигает строки вниз, ПоГоризонтали — колонки вправо. Если области различаются по ширине (при вертикальной вставке) или по высоте (при горизонтальной), поведение зависит от параметра заполнения, поэтому на практике проще заранее проектировать области одинаковой ширины — тогда вставка проходит предсказуемо.
Альтернатива ВставитьОбласть — метод ВывестиГоризонтально, который добавляет область справа от текущего содержимого. Он удобен для многоколоночных форм, где блоки выводятся бок о бок. Для сложных документов с заранее неизвестной структурой иногда проще собирать итоговый документ из нескольких промежуточных табличных документов, а затем объединять их через ВставитьОбласть.
Группировки, повторяющиеся области и итоги
В макетах для отчётов часто нужны вложенные области: заголовок группы, строки детальных данных, итог по группе. Такие области создаются в конфигураторе как отдельные именованные области и выводятся в коде в нужном порядке. Для автоматического подсчёта уровней группировок используйте методы НачатьГруппуСтрок и ЗакончитьГруппуСтрок табличного документа — они добавляют визуальные группировки со сворачиванием.
Для повторения шапки таблицы на каждой странице при печати задайте свойство ПовторятьПриПечатиСтроки у табличного документа, указав область с заголовками колонок. Это избавляет от необходимости программно отслеживать разрывы страниц и вставлять шапку вручную.
Перед выводом области с итогами проверяйте методом ПроверитьВывод(), поместится ли она на текущей странице вместе со следующей строкой. Если нет — выводите горизонтальный разделитель страниц через ВывестиГоризонтальныйРазделительСтраниц(), чтобы итоги не отрывались от таблицы.
Типичные ошибки при работе с областями
Самая частая проблема — ошибка «Область не найдена». Причины: опечатка в имени (регистр букв значения не имеет, но лишние символы ломают поиск), область создана в другом макете, конфигурация базы данных не обновлена после изменения макета. Проверяйте имя через список именованных областей в конфигураторе.
Ещё одна ловушка — использование метода Вывести для области, полученной из другого табличного документа с отличающимися настройками. Стили, высоты строк и ширины колонок копируются вместе с областью, поэтому смешение макетов с разным оформлением даёт визуально неоднородный документ. Держите оформление в одном макете либо нормализуйте форматирование после вставки.
Как проверить результат
После формирования документа проверьте его программно и визуально. Программно — через свойство ВысотаТаблицы (количество заполненных строк должно соответствовать ожиданиям) и через чтение текста контрольных ячеек методом Область().Текст. Визуально — выведите документ на экран в тестовой базе и прокрутите до конца, проверив все секции.
Как проверить результат
Все параметры подставлены, нет текста в квадратных скобках
Видны фрагменты вида [ИмяПараметра] или пустые поля
Количество строк совпадает с данными документа, значения корректны
Строки дублируются, пропущены или содержат данные предыдущей итерации
Итоговые суммы сходятся с документом, подписи на своих местах
Итоги оторваны от таблицы или содержат неверные суммы
Шапка таблицы повторяется на каждой странице, разрывы логичны
Таблица обрывается посередине строки, шапка теряется
Для печатных форм, подключённых через механизм дополнительных печатных форм (БСП), дополнительно проверьте, что функция печати возвращает заполненный табличный документ, а не выводит его напрямую — иначе форма может отобразиться дважды или не отобразиться вовсе.
FAQ
Можно ли вставить область из одного макета в другой?
Да. Получите оба макета, извлеките область из первого методом ПолучитьОбласть и выведите её в табличный документ, сформированный на базе второго макета. Учтите, что оформление (шрифты, границы, цвета) копируется вместе с областью, поэтому стили макетов желательно согласовать заранее.
Почему возникает ошибка «Область не найдена», хотя область есть в макете?
Чаще всего конфигурация базы данных не обновлена после изменения макета — нажмите F7 в конфигураторе. Также проверьте, что код обращается именно к тому макету (общий макет и макет объекта с одинаковыми именами — разные объекты), и что в имени нет лишних пробелов или невидимых символов.
Как вывести область несколько раз с разными данными?
Извлеките область один раз до цикла, а внутри цикла перезаполняйте параметры через Параметры.Заполнить() и вызывайте Вывести. Каждый вызов Вывести копирует текущее состояние области в документ, поэтому данные предыдущих итераций не затираются.
Чем ВставитьОбласть отличается от Вывести?
Вывести добавляет область в конец документа, дописывая строки ниже существующих. ВставитьОбласть помещает область в произвольную позицию, раздвигая текущее содержимое вниз или вправо в зависимости от типа смещения. Для последовательного формирования документа сверху вниз достаточно Вывести.
Как сделать параметр необязательным, чтобы при отсутствии значения не было пустой строки?
Разбейте область на две: основную и дополнительную с необязательным блоком. В коде проверяйте условие и выводите дополнительную область только при наличии данных. Альтернатива — использовать шаблон и заранее формировать строку целиком, подставляя пустое значение при отсутствии данных.
Работают ли области макета в управляемых формах и на веб-клиенте?
Да, формирование табличного документа с областями выполняется на сервере и одинаково работает в тонком, толстом и веб-клиенте. Ограничения касаются лишь интерактивного редактирования табличного документа на клиенте — оно доступно не во всех режимах.
Что важно запомнить
Область создаётся в конфигураторе через Ctrl+Shift+N и должна иметь осмысленное имя. Программно область извлекается методом ПолучитьОбласть, заполняется через Параметры и добавляется в документ методом Вывести (в конец) или ВставитьОбласть (в произвольную позицию). После изменения макета обязательно обновляйте конфигурацию базы данных и проверяйте результат на тестовых данных.