Макеты в 1С 8.3: создать, заполнить данными и вывести на печать
Содержание
Работа с макетом в 1С 8.3 сводится к трём действиям: нарисовать табличный документ с именованными областями, расставить в ячейках параметры и программно вывести области в новый ТабличныйДокумент. Разработчик делает это в Конфигураторе на закладке «Макеты» объекта, пользователь типовой конфигурации правит готовые формы в Администрирование → Печатные формы, отчеты и обработки → Макеты печатных форм.
Типичная ситуация: бухгалтер просит добавить в накладную колонку «Вес» и подпись кладовщика. Правка займёт полчаса, если понимать, как устроен макет. И может сломать обновление, если открыть конфигурацию на изменение ради одной ячейки. Ниже — оба пути и код, который работает.
Какие бывают макеты в 1С и какой тип выбрать
При создании макета платформа спрашивает тип. От него зависит, что вернёт ПолучитьМакет() в коде и каким редактором вы будете пользоваться.
| Тип макета | Что внутри | Когда брать |
|---|---|---|
| Табличный документ | Ячейки, области, параметры (формат MXL) | Печатные формы: накладные, акты, счета, справки |
| Схема компоновки данных | Запрос, ресурсы, варианты отчёта | Отчёты с настройками у пользователя |
| Текстовый документ | Обычный текст | Шаблоны выгрузки в TXT, письма |
| Двоичные данные | Любой файл: DOCX, XLSX, картинка, DLL | Шаблоны Word/Excel, внешние компоненты |
| HTML-документ | HTML-разметка | Справка, оформленные описания на форме |
| Географическая и графическая схема | Карта, схема процесса | Редкие специальные задачи |
На практике 90% задач — табличный документ. Дальше речь о нём.
💡 Если печатную форму нужно отдавать контрагенту в Word с его фирменным бланком, храните шаблон как «Двоичные данные». Табличный документ в DOCX тоже сохраняется, но вёрстка Word-бланка при этом теряется.
Как создать макет в конфигураторе: пошагово
1. Добавляем макет к объекту
- Откройте Конфигуратор и дерево конфигурации.
- Двойным щелчком откройте объект, например документ
ПриходнаяНакладная. - Перейдите на закладку «Макеты» и нажмите «Добавить».
- В конструкторе макета задайте имя латиницей или кириллицей без пробелов (
НакладнаяСклад) и тип «Табличный документ». - Нажмите «Готово» — откроется пустой лист.
2. Рисуем шапку, таблицу и подвал
Рисуйте форму так, как она будет выглядеть на бумаге. Объединяйте ячейки, задавайте рамки и шрифты через палитру свойств (Alt+Enter). Ширину колонок подгоняйте сразу под А4 — на предварительном просмотре это проверяется быстрее, чем после программирования.
3. Делим лист на именованные области
Код выводит не весь макет, а куски по имени. Типичный набор горизонтальных областей:
- 📄
Заголовок— название документа, номер, дата; - 🏢
Шапка— поставщик, покупатель, склад; - 📋
ШапкаТаблицы— названия колонок; - 🔁
Строка— одна строка товара, выводится в цикле; - ➕
Итого— суммы; - ✍️
Подвал— подписи.
Чтобы назначить имя, выделите строки по их номерам слева и выберите Таблица → Имена → Назначить имя. То же можно сделать в свойстве «Имя» выделенной области. Область, выделенная по номерам строк, — горизонтальная; по буквам колонок — вертикальная.
Где хранить макет: объект, общий макет, расширение или внешняя обработка
Место хранения решает, переживёт ли ваша правка обновление типовой конфигурации. Это главный вопрос для любого, кто дорабатывает БП, ЗУП или УТ.
| Где лежит макет | Как получить в коде | Плюсы | Минусы |
|---|---|---|---|
| Макет объекта | ПолучитьМакет("Имя") в модуле объекта или Документы.Имя.ПолучитьМакет("Имя") | Просто, рядом с данными | В типовой — снятие с поддержки |
| Общий макет | ПолучитьОбщийМакет("Имя") | Один бланк на много объектов | То же |
| Расширение конфигурации | Макет в заимствованном объекте расширения | Типовая остаётся на поддержке | Нужно следить за совместимостью после обновлений |
| Внешняя печатная форма (.epf) | ПолучитьМакет() в модуле обработки | Подключается без Конфигуратора | Регистрируется в каждой базе отдельно |
Не снимайте типовую конфигурацию с поддержки ради одной печатной формы. Каждое следующее обновление превратится в ручное сравнение-объединение.
Для типовых решений на БСП рабочих варианта два.
Расширение. Создайте расширение (Конфигурация → Расширения конфигурации), заимствуйте документ, добавьте ему свой макет. Чтобы команда печати появилась в списке, в заимствованном модуле менеджера оборачивают процедуру ДобавитьКомандыПечати аннотацией &После и добавляют туда свою команду. Сам вывод пишут в процедуре Печать того же модуля. Расширения доступны с платформы 8.3.6.
Внешняя печатная форма. Обработка с функцией СведенияОВнешнейОбработке() подключается в Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки. Команда печати появляется в документах, которые указаны в регистрации. Удобно, когда у клиента нет программиста на постоянной основе.
Заполнение макета данными: параметры, шаблоны и форматы
Каждая ячейка имеет свойство «Заполнение» с тремя значениями.
| Значение | Что пишете в ячейке | Пример |
|---|---|---|
| Текст | Постоянный текст | Наименование товара |
| Параметр | Имя параметра в свойстве «Параметр» | Номенклатура |
| Шаблон | Текст с параметрами в квадратных скобках | Накладная № [Номер] от [Дата] |
В коде параметры области заполняются двумя способами:
// По одному
Область.Параметры.Номер = Выборка.Номер;
// Сразу все совпадающие по имени поля выборки или структуры
Область.Параметры.Заполнить(Выборка);
Заполнить() берёт значения тех полей источника, имена которых совпадают с параметрами. Поэтому в запросе давайте полям псевдонимы, равные именам параметров, — код сократится вдвое.
Форматирование чисел и дат
Формат задают в свойстве ячейки «Формат» или в коде функцией Формат():
- 📅
ДЛФ=D— дата без времени: 07.10.2026; - 💰
ЧДЦ=2— две цифры после запятой; - 🔢
ЧГ=0— без разделителя групп разрядов (для номеров и ИНН); - ⛔
ЧН=-— что выводить вместо нуля.
Сумму прописью собирает ЧислоПрописью():
Область.Параметры.СуммаПрописью = ЧислоПрописью(Итог, "L=ru_RU",
"рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2");
Расшифровка по щелчку
В свойстве ячейки «Параметр расшифровки» укажите имя, например Документ, и передайте туда ссылку: Область.Параметры.Документ = Выборка.Ссылка. Пользователь кликнет по ячейке в готовой форме и откроет документ.
Готовое решение: печать накладной из макета целиком
Пример для модуля менеджера документа ПриходнаяНакладная с табличной частью Товары. Функция получает массив ссылок и возвращает табличный документ, в котором каждая накладная начинается с новой страницы, а шапка таблицы повторяется при переходе на следующий лист.
Функция ПечатьНакладной(МассивСсылок) Экспорт
ТабДок = Новый ТабличныйДокумент;
ТабДок.КлючПараметровПечати = "ПриходнаяНакладная_НакладнаяСклад";
Макет = Документы.ПриходнаяНакладная.ПолучитьМакет("НакладнаяСклад");
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьИтого = Макет.ПолучитьОбласть("Итого");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Док.Ссылка КАК Ссылка,
| Док.Номер КАК Номер,
| Док.Дата КАК Дата,
| Док.Контрагент КАК Контрагент,
| Док.Товары.(
| НомерСтроки КАК НомерСтроки,
| Номенклатура КАК Номенклатура,
| Количество КАК Количество,
| Цена КАК Цена,
| Сумма КАК Сумма
| ) КАК Товары
|ИЗ
| Документ.ПриходнаяНакладная КАК Док
|ГДЕ
| Док.Ссылка В (&Ссылки)
|УПОРЯДОЧИТЬ ПО
| Док.Дата";
Запрос.УстановитьПараметр("Ссылки", МассивСсылок);
Выборка = Запрос.Выполнить().Выбрать();
ПервыйДокумент = Истина;
Пока Выборка.Следующий() Цикл
Если Не ПервыйДокумент Тогда
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ПервыйДокумент = Ложь;
ОбластьЗаголовок.Параметры.Заполнить(Выборка);
ТабДок.Вывести(ОбластьЗаголовок);
ОбластьШапка.Параметры.Заполнить(Выборка);
ТабДок.Вывести(ОбластьШапка);
ТабДок.Вывести(ОбластьШапкаТаблицы);
Итог = 0;
ВыборкаТовары = Выборка.Товары.Выбрать();
Пока ВыборкаТовары.Следующий() Цикл
ОбластьСтрока.Параметры.Заполнить(ВыборкаТовары);
Проверка = Новый Массив;
Проверка.Добавить(ОбластьСтрока);
Если Не ТабДок.ПроверитьВывод(Проверка) Тогда
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
ТабДок.Вывести(ОбластьШапкаТаблицы);
КонецЕсли;
ТабДок.Вывести(ОбластьСтрока);
Итог = Итог + ВыборкаТовары.Сумма;
КонецЦикла;
ОбластьИтого.Параметры.Итого = Итог;
ОбластьИтого.Параметры.СуммаПрописью = ЧислоПрописью(Итог, "L=ru_RU",
"рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2");
ТабДок.Вывести(ОбластьИтого);
ТабДок.Вывести(ОбластьПодвал);
КонецЦикла;
Возврат ТабДок;
КонецФункции
На что смотреть в этом коде:
КлючПараметровПечатизапоминает поля и ориентацию листа, которые пользователь выставил в настройках печати. Делайте ключ уникальным для каждой формы.ПроверитьВывод()отвечает, поместится ли массив областей на текущей странице. Без этой проверки строка таблицы может уйти на новый лист без шапки колонок.- Области получают один раз до цикла.
ПолучитьОбласть()внутри цикла по строкам заметно тормозит на документах в тысячу строк.
На клиенте результат показывают так: ТабДок.Показать("Накладная"). В управляемом приложении вызов функции идёт с сервера, а показ — на клиенте.
Динамические макеты: колонки, группировки, разрывы страниц
Колонки, которых заранее нет
Когда число колонок известно только во время печати (размеры обуви, склады, месяцы), используют пересечение горизонтальной и вертикальной областей. В макете называют строки Строка, а колонки Размер. Пересечение получают через вертикальную черту:
ОбластьНоменклатура = Макет.ПолучитьОбласть("Строка|Номенклатура");
ОбластьРазмер = Макет.ПолучитьОбласть("Строка|Размер");
ТабДок.Вывести(ОбластьНоменклатура);
Для Каждого Размер Из СписокРазмеров Цикл
ОбластьРазмер.Параметры.Количество = Размер.Количество;
ТабДок.Присоединить(ОбластьРазмер);
КонецЦикла;
Вывести() начинает новую строку, Присоединить() дописывает область справа от последней выведенной.
Группировки строк
Чтобы пользователь сворачивал строки плюсиком, обрамляйте вывод так:
ТабДок.НачатьГруппуСтрок("Контрагент", Истина);
// вывод строк контрагента
ТабДок.ЗакончитьГруппуСтрок();
Второй параметр Истина — группа развёрнута при открытии.
Настройки листа из кода
- 📐
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт; - 🔍
ТабДок.АвтоМасштаб = Истина;— вписать по ширине страницы; - 🔁
ТабДок.ПовторятьПриПечатиСтроки = Макет.Область("ШапкаТаблицы");— платформа сама повторит шапку на каждом листе. Это альтернатива ручной проверке черезПроверитьВывод(); - 🔒
ТабДок.ТолькоПросмотр = Истина;— запрет правки готовой формы.
Двоичные данные: шаблон Word
Макет типа «Двоичные данные» возвращает объект ДвоичныеДанные. Его записывают во временный файл и открывают через COM-объект Word на клиенте под Windows. В серверном и веб-варианте COM недоступен — тогда выбирают макет «Табличный документ» и сохранение в DOCX методом ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.DOCX).
Как пользователю изменить макет без конфигуратора
В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11, КА, ERP) путь одинаковый:
- Откройте
Администрирование → Печатные формы, отчеты и обработки. - Перейдите по ссылке «Макеты печатных форм».
- Найдите нужную форму поиском по названию, например «Счет на оплату».
- Откройте макет на редактирование, внесите правку и сохраните.
Изменённый макет хранится в базе, а не в конфигурации. Поэтому правка не снимает конфигурацию с поддержки и переживает обновления. Вернуть исходный вид можно командой списка, которая переключает форму на стандартный макет.
Что пользователь может безопасно делать сам:
- ✅ менять шрифты, рамки, ширину колонок;
- ✅ добавлять постоянный текст, логотип, дополнительные подписи;
- ✅ удалять лишние строки внутри области;
- ❌ переименовывать области и параметры — код перестанет их находить;
- ❌ добавлять новые параметры — заполнять их некому, нужен программист.
После крупного обновления фирма может изменить стандартный макет, например под новую форму документа. Ваш изменённый вариант при этом останется прежним. Раз в квартал сравнивайте свои макеты со стандартными и переносите правки заново.
Ошибки при работе с макетом и как их найти
Таблица → Имена → Назначить имя, чтобы увидеть список имён.Ещё две проблемы, которые всплывают не сразу:
- ⏱ Медленная печать большого пакета. Почти всегда причина — запрос внутри цикла по документам. Соберите данные одним запросом по массиву ссылок, как в примере выше.
- 🔢 ИНН или номер с пробелами вида «7 707 083 893». Число вывели без формата. Для кодов и номеров ставьте
ЧГ=0.