Макеты в 1С 8.3: создать, заполнить данными и вывести на печать

· 9 мин

Содержание

Работа с макетом в 1С 8.3 сводится к трём действиям: нарисовать табличный документ с именованными областями, расставить в ячейках параметры и программно вывести области в новый ТабличныйДокумент. Разработчик делает это в Конфигураторе на закладке «Макеты» объекта, пользователь типовой конфигурации правит готовые формы в Администрирование → Печатные формы, отчеты и обработки → Макеты печатных форм.

Типичная ситуация: бухгалтер просит добавить в накладную колонку «Вес» и подпись кладовщика. Правка займёт полчаса, если понимать, как устроен макет. И может сломать обновление, если открыть конфигурацию на изменение ради одной ячейки. Ниже — оба пути и код, который работает.

Какие бывают макеты в 1С и какой тип выбрать

При создании макета платформа спрашивает тип. От него зависит, что вернёт ПолучитьМакет() в коде и каким редактором вы будете пользоваться.

Тип макетаЧто внутриКогда брать
Табличный документЯчейки, области, параметры (формат MXL)Печатные формы: накладные, акты, счета, справки
Схема компоновки данныхЗапрос, ресурсы, варианты отчётаОтчёты с настройками у пользователя
Текстовый документОбычный текстШаблоны выгрузки в TXT, письма
Двоичные данныеЛюбой файл: DOCX, XLSX, картинка, DLLШаблоны Word/Excel, внешние компоненты
HTML-документHTML-разметкаСправка, оформленные описания на форме
Географическая и графическая схемаКарта, схема процессаРедкие специальные задачи

На практике 90% задач — табличный документ. Дальше речь о нём.

💡 Если печатную форму нужно отдавать контрагенту в Word с его фирменным бланком, храните шаблон как «Двоичные данные». Табличный документ в DOCX тоже сохраняется, но вёрстка Word-бланка при этом теряется.

Как создать макет в конфигураторе: пошагово

1. Добавляем макет к объекту

  1. Откройте Конфигуратор и дерево конфигурации.
  2. Двойным щелчком откройте объект, например документ ПриходнаяНакладная.
  3. Перейдите на закладку «Макеты» и нажмите «Добавить».
  4. В конструкторе макета задайте имя латиницей или кириллицей без пробелов (НакладнаяСклад) и тип «Табличный документ».
  5. Нажмите «Готово» — откроется пустой лист.

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) путь одинаковый:

  1. Откройте Администрирование → Печатные формы, отчеты и обработки.
  2. Перейдите по ссылке «Макеты печатных форм».
  3. Найдите нужную форму поиском по названию, например «Счет на оплату».
  4. Откройте макет на редактирование, внесите правку и сохраните.

Изменённый макет хранится в базе, а не в конфигурации. Поэтому правка не снимает конфигурацию с поддержки и переживает обновления. Вернуть исходный вид можно командой списка, которая переключает форму на стандартный макет.

Что пользователь может безопасно делать сам:

  • ✅ менять шрифты, рамки, ширину колонок;
  • ✅ добавлять постоянный текст, логотип, дополнительные подписи;
  • ✅ удалять лишние строки внутри области;
  • ❌ переименовывать области и параметры — код перестанет их находить;
  • ❌ добавлять новые параметры — заполнять их некому, нужен программист.

После крупного обновления фирма может изменить стандартный макет, например под новую форму документа. Ваш изменённый вариант при этом останется прежним. Раз в квартал сравнивайте свои макеты со стандартными и переносите правки заново.

Ошибки при работе с макетом и как их найти

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

Ещё две проблемы, которые всплывают не сразу:

  • ⏱ Медленная печать большого пакета. Почти всегда причина — запрос внутри цикла по документам. Соберите данные одним запросом по массиву ссылок, как в примере выше.
  • 🔢 ИНН или номер с пробелами вида «7 707 083 893». Число вывели без формата. Для кодов и номеров ставьте ЧГ=0.

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

Можно ли открыть файл MXL без 1С?
Да. Бесплатная программа «1С:Предприятие — Работа с файлами» открывает и редактирует табличные документы MXL без платформы и лицензии.
Как добавить в макет картинку с логотипом?
Вставьте рисунок в табличный документ через меню «Таблица» в режиме редактирования макета и разместите его внутри нужной области. Рисунок выводится вместе с областью.
Чем макет отличается от формы?
Форма — интерактивное окно для ввода данных. Макет — заготовка для вывода: печатной формы, отчёта, файла. Пользователь его не заполняет, его заполняет код.
Можно ли печатать штрихкод из макета?
Да. В типовых конфигурациях на БСП есть механизм генерации штрихкода в картинку, её выводят в ячейку-рисунок. В самописной конфигурации понадобится внешняя компонента.
Как перенести изменённый пользователем макет в другую базу?
Откройте его в списке макетов печатных форм и сохраните в файл MXL. В другой базе загрузите файл в тот же макет. Конфигурации должны совпадать по версии, иначе имена параметров могут отличаться.