Своя печатная форма в расширении: макет, команда печати и вывод без снятия с поддержки

· 10 мин

Содержание

Чтобы добавить макет в расширение 1С, откройте Конфигуратор, через Конфигурация → Расширения конфигурации создайте или откройте расширение, затем в дереве основной конфигурации на нужном документе выберите в контекстном меню Добавить в расширение. В ветке Макеты заимствованного документа нажмите «Добавить», задайте имя с префиксом расширения и тип «Табличный документ». После этого обновите конфигурацию базы данных (F7) — макет появится в базе, а типовая конфигурация останется на поддержке.

Сам по себе макет ничего не печатает. Чтобы он стал печатной формой, нужен код: команда печати и процедура вывода. В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) это делают через аннотацию &После в модуле менеджера. Есть и другой путь — внешняя печатная форма через дополнительные обработки. Расширение выбирают, когда форму нужно хранить вместе с базой и обновлять одним файлом .cfe, внешнюю обработку — когда форму часто меняет пользователь или её нужно быстро подключить без Конфигуратора.

Какие макеты можно хранить в расширении

Расширение принимает почти те же виды макетов, что и основная конфигурация. Тип выбирают при создании макета, и потом его не меняют — проще удалить и создать заново.

Тип макетаДля чего обычно используютРаботает в веб-клиенте
Табличный документ (.mxl)Печатные формы, накладные, акты, бланкиДа
Схема компоновки данныхОтчёты на СКДДа
Макет оформления компоновки данныхСвоё оформление отчётов СКДДа
Двоичные данныеШаблоны Word/Excel, картинки, файлы для выгрузкиДа, но файл отдают через временное хранилище
HTML-документСправочные тексты, шаблоны писемДа
Текстовый документШаблоны текстовых файлов обменаДа
Active documentШаблон Word или Excel, открываемый через OLEНет

Где макет может лежать в дереве расширения:

  • 📄 в заимствованном объекте — документ, справочник, отчёт основной конфигурации, к которому вы «пристраиваете» новый макет;
  • 📁 в собственном объекте расширения — например, в своей обработке или своём отчёте, созданном прямо в расширении;
  • 🗂️ в общих макетах (Общие → Общие макеты) — для логотипа, подписи, общей шапки, которые нужны нескольким формам.

Для печатной формы документа почти всегда удобнее первый вариант. Макет лежит рядом с объектом, и типовые механизмы БСП находят его по полному имени вида Документ.РеализацияТоваровУслуг.ИмяМакета.

Расширения появились в платформе 8.3.6, но на ранних релизах набор объектов, которые в них можно добавлять, был беднее. На актуальных версиях 8.3.2x с макетами ограничений по сути нет.

Черновик макета во внешней обработке: зачем и как

Рисовать макет сразу в расширении можно. Но каждая правка там требует обновления конфигурации базы данных и перезапуска сеанса. Внешняя обработка (.epf) открывается в пользовательском режиме за секунды через Файл → Открыть, поэтому многие сначала отлаживают вывод в ней.

Порядок такой:

  1. В Конфигураторе создайте новую внешнюю обработку: Файл → Новый → Внешняя обработка.
  2. В ветке Макеты добавьте макет типа «Табличный документ» с тем же именем, которое будет в расширении.
  3. Нарисуйте форму и разметьте именованные области (ниже — как).
  4. На форме обработки сделайте реквизит «Документ» и кнопку, которая выводит макет в поле табличного документа.
  5. Когда вывод выглядит правильно, перенесите макет в расширение.

Перенос делают через буфер обмена. Откройте макет в обработке, выделите весь лист (Ctrl+A), скопируйте и вставьте в пустой макет расширения. После вставки проверьте имена областей: выделите строки области и посмотрите свойство «Имя» в палитре свойств. Если имя пропало, назначьте его заново.

Код процедуры вывода из обработки переносится почти без изменений. Меняется только способ получения макета — об этом в разделе про код.

Добавляем макет в расширение конфигурации пошагово

Шаг 1. Создайте расширение

Откройте Конфигурация → Расширения конфигурации и нажмите «Добавить». Задайте:

  • Имя — латиница или кириллица без пробелов, например ПечатныеФормыСклада;
  • Префикс — короткий, с подчёркиванием, например мр_;
  • Назначение — «Дополнение» для новых печатных форм.

Префикс подставляется в имена новых объектов. Он защищает от конфликта имён: если поставщик в следующем релизе добавит в документ свой макет с таким же названием, ваш с префиксом не пересечётся.

Шаг 2. Заимствуйте объект

Откройте основную конфигурацию (Конфигурация → Открыть конфигурацию), найдите документ, например Документы → РеализацияТоваровУслуг. В контекстном меню выберите Добавить в расширение и укажите ваше расширение.

В дереве расширения появится документ со значком заимствования. Его реквизиты и табличные части вы не трогаете — они доступны в коде как обычно.

Шаг 3. Создайте макет

В заимствованном документе раскройте ветку Макеты и нажмите «Добавить». В конструкторе:

  1. Имя — мр_НакладнаяСклад (с префиксом).
  2. Тип — «Табличный документ».
  3. Нажмите «Готово» — откроется пустой лист.

Шаг 4. Разметьте области и параметры

Печатная форма собирается из областей: шапка выводится один раз, строка — по числу строк табличной части, подвал — в конце.

  1. Выделите строки шапки, выберите Таблица → Имена → Назначить имя, введите Шапка.
  2. Так же назначьте Строка и Подвал.
  3. В ячейке, куда подставляется значение, откройте свойства и установите «Заполнение» = «Параметр», в поле «Параметр» впишите имя, например Контрагент.
  4. Для текста со вставками выберите «Заполнение» = «Шаблон» и пишите Накладная № [Номер] от [Дата].

Имена областей и параметров в макете должны совпадать с кодом буква в букву. Опечатка в одном символе даёт ошибку при печати.

Шаг 5. Сохраните и обновите базу

Нажмите F7 (Конфигурация → Обновить конфигурацию базы данных). Проверьте, что в списке расширений у вашего расширения стоит флажок «Активно». Пользователям, которые сейчас в базе, нужно перезапустить сеанс.

Если расширение готовят на копии базы, а потом переносят в рабочую, сохраните его в файл: Конфигурация → Расширения конфигурации, выберите расширение и сохраните в .cfe. В рабочей базе его загружают в пользовательском режиме: в БП 3.0 это Администрирование → Печатные формы, отчеты и обработки → Расширения.

Как получить макет из расширения в коде и подключить к печати

Получение макета: три способа

Где лежит макетКак получитьГде вызывать
В заимствованном или своём объектеДокументы.РеализацияТоваровУслуг.ПолучитьМакет("мр_НакладнаяСклад")Только на сервере
В общих макетахПолучитьОбщийМакет("мр_Логотип")Только на сервере
Через БСП с учётом правок пользователяУправлениеПечатью.МакетПечатнойФормы("Документ.РеализацияТоваровУслуг.мр_НакладнаяСклад")На сервере

Третий вариант полезен тем, что пользователь сможет поправить ваш макет в режиме 1С:Предприятия, в списке макетов печатных форм. В БП 3.0 он открывается через Администрирование → Печатные формы, отчеты и обработки → Макеты печатных форм. Код при этом подхватит изменённую версию.

Команда печати через &После

Добавьте в расширение модуль менеджера заимствованного документа: откройте у документа в расширении «Модуль менеджера». Сначала проверьте в основной конфигурации, что в модуле менеджера есть процедуры ДобавитьКомандыПечати и Печать. В большинстве документов типовых конфигураций на БСП они есть.

&После("ДобавитьКомандыПечати")
Процедура мр_ДобавитьКомандыПечати(КомандыПечати)

	КомандаПечати = КомандыПечати.Добавить();
	КомандаПечати.Идентификатор = "мр_НакладнаяСклад";
	КомандаПечати.Представление = "Накладная для склада";
	КомандаПечати.Порядок = 100;

КонецПроцедуры

&После("Печать")
Процедура мр_Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)

	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "мр_НакладнаяСклад") Тогда
		УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм,
			"мр_НакладнаяСклад", "Накладная для склада",
			мр_СформироватьНакладную(МассивОбъектов, ОбъектыПечати));
	КонецЕсли;

КонецПроцедуры

Аннотация &После означает: сначала выполнится типовая процедура, потом ваша. Типовые команды остаются на месте, ваша добавляется к ним в подменю «Печать».

Сверьте список параметров процедуры Печать с вашим релизом. Если поставщик изменит сигнатуру, расширение перестанет применяться — это видно сразу после обновления типовой.

Процедура вывода

Функция мр_СформироватьНакладную(МассивОбъектов, ОбъектыПечати)

	ТабДок = Новый ТабличныйДокумент;
	ТабДок.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_мр_НакладнаяСклад";

	Макет = УправлениеПечатью.МакетПечатнойФормы(
		"Документ.РеализацияТоваровУслуг.мр_НакладнаяСклад");
	ОбластьШапка  = Макет.ПолучитьОбласть("Шапка");
	ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

	ПервыйДокумент = Истина;
	Для Каждого Ссылка Из МассивОбъектов Цикл

		Если Не ПервыйДокумент Тогда
			ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
		КонецЕсли;
		ПервыйДокумент = Ложь;
		НачалоДокумента = ТабДок.ВысотаТаблицы + 1;

		ОбластьШапка.Параметры.Номер      = Ссылка.Номер;
		ОбластьШапка.Параметры.Дата       = Формат(Ссылка.Дата, "ДЛФ=D");
		ОбластьШапка.Параметры.Контрагент = Ссылка.Контрагент;
		ТабДок.Вывести(ОбластьШапка);

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

		УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабДок, НачалоДокумента, ОбъектыПечати, Ссылка);

	КонецЦикла;

	Возврат ТабДок;

КонецФункции

Пример читает данные через точку от ссылки — так короче для иллюстрации. В рабочей форме на десятки документов лучше один запрос по всем ссылкам из МассивОбъектов: это заметно быстрее при массовой печати.

ЗадатьОбластьПечатиДокумента нужна, чтобы при печати нескольких документов БСП правильно отправляла каждый по почте и сохраняла в файл отдельно.

Особенности макетов в веб-клиенте и тонком клиенте

В тонком и веб-клиенте форма живёт на клиенте, а макеты — на сервере. Отсюда главное правило: ПолучитьМакет и ПолучитьОбщийМакет вызывают в процедуре с директивой &НаСервере, а на клиент возвращают готовый ТабличныйДокумент.

&НаСервере
Функция мр_ПолучитьПечать(Ссылка)
	Макет = Документы.РеализацияТоваровУслуг.ПолучитьМакет("мр_НакладнаяСклад");
	ТабДок = Новый ТабличныйДокумент;
	Область = Макет.ПолучитьОбласть("Шапка");
	Область.Параметры.Номер = Ссылка.Номер;
	ТабДок.Вывести(Область);
	Возврат ТабДок;
КонецФункции

Что ещё отличает веб-клиент:

  • 🌐 Active document не работает . Шаблоны Word/Excel через OLE требуют Windows-клиента. Для веб-клиента храните шаблон как «Двоичные данные» и заполняйте его на сервере.
  • 📦 Файлы отдают через временное хранилище. Двоичные данные макета помещают в ПоместитьВоВременноеХранилище, а на клиенте вызывают асинхронное получение файла с сервера, например НачатьПолучениеФайлаССервера.
  • 🔤 Шрифты берутся с компьютера пользователя. Если в макете стоит редкий шрифт, браузер подменит его, и строки могут переноситься иначе. Используйте Arial или шрифты, которые есть у всех.
  • 🖨️ Печать идёт через браузер. Поля и масштаб задавайте в свойствах табличного документа (ориентация, «Поля», «Масштаб печати»), а не полагайтесь на настройки принтера .

Печать через подменю «Печать» в типовых конфигурациях уже работает через сервер. Директиву &НаСервере нужно помнить, когда вы выводите макет из своей формы — например, из формы обработки в расширении.

Отладка и типичные ошибки при подключении макета

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

Проверить, применилось ли расширение, можно в пользовательском режиме: в списке расширений у него не должно быть пометки об ошибке. В Конфигураторе запустите Конфигурация → Проверка конфигурации по расширению — она покажет, что не так с заимствованными объектами.

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

Ещё несколько ловушек, которые не дают явной ошибки:

  • 🔁 Пользователь правил ваш макет, а вы обновили расширение — пользователь продолжает видеть свою версию. Это поведение МакетПечатнойФормы: пользовательский макет важнее. Сбросьте его в списке макетов печатных форм, если нужна ваша новая разметка.
  • 📏 Строки «уезжают» на вторую страницу. Проверьте ширину колонок в макете: суммарная ширина больше листа A4 даёт мелкий масштаб или перенос.
  • 🧩 Расширение в безопасном режиме не мешает макетам, но может запретить другой код в нём, например работу с файлами. Это задаётся в свойствах расширения при загрузке.

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

Можно ли изменить типовой макет в расширении, а не добавлять свой?
Надёжнее добавить свой макет с префиксом и свою команду печати. Разовые правки типового бланка пользователь может сделать без программиста в списке макетов печатных форм.
Нужно ли снимать конфигурацию с поддержки, чтобы добавить макет?
Нет. Расширение для того и нужно: типовая остаётся на полной поддержке и обновляется как обычно.
Что выбрать: расширение или внешнюю печатную форму?
Расширение — когда форма нужна постоянно и меняется редко. Внешняя обработка — когда форму часто правят или нужно подключить её без доступа к Конфигуратору.
Работает ли макет из расширения в базе 1С:Фреш или в облаке?
В облачных сервисах расширения обычно загружают через пользовательский режим и проверяют на безопасность. Макеты в них работают, но код должен проходить проверку безопасного режима.
Как перенести расширение с макетом в другую базу?
Сохраните расширение в файл .cfe и загрузите его в другой базе через список расширений. Конфигурации в обеих базах должны совпадать по заимствованным объектам.