Области макета в 1С: создание, вывод и настройка

· 9 мин

Содержание

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

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

Что такое область и какие типы бывают

Макет табличного документа — это таблица из ячеек, похожая на лист Excel. Сам по себе макет на экран не выводится: из него по частям собирается готовый документ. Эти части и есть области.

По способу выделения различают три типа:

  • 📏 Горизонтальная область — одна или несколько целых строк. Самый частый случай: шапка, строка таблицы, подвал.
  • 📐 Вертикальная область — один или несколько целых столбцов. Нужна, когда колонки наращиваются по горизонтали (например, по месяцам).
  • ▦ Область-пересечение — прямоугольник на стыке именованных строк и столбцов. Используется в матричных отчётах, где и строки, и колонки заранее неизвестны.

Отдельно стоит именованная область: это любой из трёх вариантов выше, которому вы дали имя. Именно по имени к ней обращается код. Можно работать и без имён — по координатам в формате R1C1:R5C3, — но именованные области читаются понятнее и не ломаются при вставке строк.

Имя области видно на полях конструктора: горизонтальные — слева от строк, вертикальные — сверху над столбцами. Если имени нет, поле пустое.

Чтобы быстро определиться с типом:

Какой тип области вам нужен?

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

Макет лежит внутри объекта: обработки, отчёта, документа — или в ветке Общие → Общие макеты для форм, которые нужны в разных местах.

Области существуют только у табличного макета. У макета бывают и другие типы — текстовый, HTML-документ, двоичные данные, — но разметка на именованные блоки есть именно в табличном документе. Поэтому при создании макета под печатную форму выбирайте тип Табличный документ.

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

После этого имя появится на полях макета. Повторите для каждого блока: обычно это Шапка, Строка, Итого, Подвал.

Имя области и имя параметра — разные вещи. Область — это кусок макета, параметр — переменная внутри ячейки. Не путайте их: ПолучитьОбласть принимает имя области, Параметры.ХХХ обращается к параметру.

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

Параметры, границы и форматирование ячеек

Чтобы в ячейку попадало значение из кода, ячейку делают параметром. Откройте свойства ячейки (двойной щелчок или Alt+Enter) и на закладке со свойством Заполнение выберите один из вариантов:

  • Текст — в ячейке печатается ровно то, что набрано. Значение из кода не подставляется.
  • Параметр — содержимое ячейки трактуется как имя параметра; реальное значение подставляется из кода.
  • Шаблон — смесь текста и параметров: параметры заключаются в квадратные скобки, например Документ №[Номер] от [Дата].

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

Форматирование настраивается в тех же свойствах ячейки:

Что настраиваемГде в свойствах ячейки
Границы и их толщинусвойство Границы (можно выбрать стороны отдельно)
Шрифт, размер, жирностьсвойства шрифта
Выравнивание и перенос по словамгоризонтальное/вертикальное положение, Расположение
Числовой формат, разделителиФорматнаяСтрока (например, ЧЦ=15; ЧДЦ=2)
Автоподбор высоты строкисвойство АвтоОтступ / высота строки

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

Соседние ячейки часто объединяют в одну — например, под длинное наименование или заголовок на всю ширину таблицы. Выделите ячейки и выберите Объединить в панели таблицы. Объединённая ячейка ведёт себя как одна: у неё своё заполнение, свой параметр и свои границы. Злоупотреблять объединением не стоит — оно замедляет отрисовку и мешает автоподбору ширины колонок.

Отдельно настраивается высота строки с длинным текстом. Чтобы текст не обрезался, включите перенос по словам в расположении ячейки и разрешите автоподбор высоты — тогда строка растянется под содержимое при выводе.

Вывод области из кода

Базовый сценарий печати: создаём табличный документ, получаем макет, достаём из него области и выводим одну за другой.

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

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

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

ТабДок.Показать();

Разберём ключевые методы:

  • ПолучитьОбщийМакет("Имя") — берёт макет из общих макетов. Для макета внутри объекта используют ПолучитьМакет("Имя") у самого объекта (документа, обработки, отчёта).
  • ПолучитьОбласть("Шапка") — возвращает область по имени. Можно и по координатам: ПолучитьОбласть("R1C1:R3C5").
  • Вывести(Область) — добавляет область снизу, под уже выведенным.
  • Присоединить(Область) — добавляет область справа от последнего вывода. Так наращивают колонки.

Горизонтальный вывод (например, колонки по периодам) собирается через Присоединить:

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

Область-пересечение берут, указывая имя строки и имя столбца через вертикальную черту: Макет.ПолучитьОбласть("СтрокаДанные|КолонкаСумма"). Это основа матричных отчётов.

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

Группировки (сворачиваемые строки с плюсиком) делаются парой НачатьАвтогруппировкуСтрок() и ЗакончитьАвтогруппировкуСтрок() вокруг вывода, либо передачей уровня в метод Вывести.

Расшифровка строк печатной формы

Часто от печатной формы хотят, чтобы по двойному щелчку на строке открывался исходный объект — товар, документ, контрагент. Это и есть расшифровка. В свойствах ячейки для свойства Расшифровка выберите заполнение параметром и задайте имя, например РасшифровкаСтроки. В коде подставьте ссылку:

ОбластьСтрока.Параметры.Наименование = СтрокаТЧ.Номенклатура.Наименование;
ОбластьСтрока.Параметры.РасшифровкаСтроки = СтрокаТЧ.Номенклатура;
ТабДок.Вывести(ОбластьСтрока);

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

Области в системе компоновки данных

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

Откройте схему компоновки данных и перейдите на закладку Макеты. Здесь добавляются макеты оформления для конкретных элементов. При добавлении выбирается, что именно оформляется:

  • Поле или Заголовок поля — ячейка значения или шапка колонки.
  • Группировка или Заголовок группировки — строки по группировке и их заголовок.
  • Ресурс — итоговые числовые ячейки.

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

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

Частые ошибки при работе с областями

Большинство проблем с макетами — это несовпадение имён и неверный тип заполнения ячейки.

Диагностика: выберите симптом

Ещё одна типичная ситуация: имя области пересекается с именем параметра. 1С это допускает, но запутывает чтение кода. Давайте областям и параметрам разные, говорящие имена.

Ускорение печати больших документов

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

  • ♻️ Получайте область до цикла. ПолучитьОбласть создаёт объект заново при каждом вызове. Один вызов до цикла и переиспользование внутри экономят и время, и память.
  • 🧮 Готовьте данные одним запросом. Собирайте всё, что уйдёт в печать, запросом или выборкой заранее, а в цикле только подставляйте значения. Обращения к базе внутри цикла вывода — главная причина тормозов.
  • 🗜️ Не плодите лишние области. Чем меньше разных областей и объединённых ячеек, тем быстрее рендерится документ. Матричные отчёты с тысячами колонок тяжелы по определению.
  • 🖨️ Отключайте ненужное оформление. Сетку (ОтображатьСетку) и заголовки на экране можно убрать — на печать это не влияет, а отрисовку ускоряет.
  • 📑 Задавайте повтор шапки через ПовторятьПриПечатиСтроки, а не копируйте шапку в цикле на каждую страницу вручную.

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

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

Можно ли обойтись без имён и брать область по координатам?
Да: Макет.ПолучитьОбласть("R1C1:R5C3") вернёт прямоугольник по номерам строк и столбцов. Но при вставке строк в макет координаты сдвинутся, и код сломается. Именованные области надёжнее.
Чем отличается «Вывести» от «Присоединить»?
Вывести ставит область снизу, под предыдущей. Присоединить — справа от последней выведенной. Строки таблицы выводят, колонки присоединяют.
Как вывести область на стыке строки и колонки?
Назовите и строку, и столбец, затем получите пересечение через вертикальную черту: ПолучитьОбласть("СтрокаДанные|КолонкаСумма"). Так строят матричные отчёты.
Где хранить макет, если он нужен в нескольких местах?
В ветке Общие → Общие макеты. Доступ из кода — функцией ПолучитьОбщийМакет("Имя"). Макет внутри объекта виден только этому объекту.
Как добавить свой макет к типовой печатной форме, не меняя конфигурацию?
Через расширение конфигурации: создаёте расширение, добавляете туда макет и команду печати. Основная конфигурация остаётся на поддержке без изменений.