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