Своя печатная форма в расширении: макет, команда печати и вывод без снятия с поддержки
Содержание
Чтобы добавить макет в расширение 1С, откройте Конфигуратор, через Конфигурация → Расширения конфигурации создайте или откройте расширение, затем в дереве основной конфигурации на нужном документе выберите в контекстном меню Добавить в расширение. В ветке Макеты заимствованного документа нажмите «Добавить», задайте имя с префиксом расширения и тип «Табличный документ». После этого обновите конфигурацию базы данных (F7) — макет появится в базе, а типовая конфигурация останется на поддержке.
Сам по себе макет ничего не печатает. Чтобы он стал печатной формой, нужен код: команда печати и процедура вывода. В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) это делают через аннотацию &После в модуле менеджера. Есть и другой путь — внешняя печатная форма через дополнительные обработки. Расширение выбирают, когда форму нужно хранить вместе с базой и обновлять одним файлом .cfe, внешнюю обработку
— когда форму часто меняет пользователь или её нужно быстро подключить без Конфигуратора.
Какие макеты можно хранить в расширении
Расширение принимает почти те же виды макетов, что и основная конфигурация. Тип выбирают при создании макета, и потом его не меняют — проще удалить и создать заново.
| Тип макета | Для чего обычно используют | Работает в веб-клиенте |
|---|---|---|
Табличный документ (.mxl) | Печатные формы, накладные, акты, бланки | Да |
| Схема компоновки данных | Отчёты на СКД | Да |
| Макет оформления компоновки данных | Своё оформление отчётов СКД | Да |
| Двоичные данные | Шаблоны Word/Excel, картинки, файлы для выгрузки | Да, но файл отдают через временное хранилище |
| HTML-документ | Справочные тексты, шаблоны писем | Да |
| Текстовый документ | Шаблоны текстовых файлов обмена | Да |
| Active document | Шаблон Word или Excel, открываемый через OLE | Нет |
Где макет может лежать в дереве расширения:
- 📄 в заимствованном объекте — документ, справочник, отчёт основной конфигурации, к которому вы «пристраиваете» новый макет;
- 📁 в собственном объекте расширения — например, в своей обработке или своём отчёте, созданном прямо в расширении;
- 🗂️ в общих макетах (
Общие → Общие макеты) — для логотипа, подписи, общей шапки, которые нужны нескольким формам.
Для печатной формы документа почти всегда удобнее первый вариант. Макет лежит рядом с объектом, и типовые механизмы БСП находят его по полному имени вида Документ.РеализацияТоваровУслуг.ИмяМакета.
Расширения появились в платформе 8.3.6, но на ранних релизах набор объектов, которые в них можно добавлять, был беднее. На актуальных версиях 8.3.2x с макетами ограничений по сути нет.
Черновик макета во внешней обработке: зачем и как
Рисовать макет сразу в расширении можно. Но каждая правка там требует обновления конфигурации базы данных и перезапуска сеанса. Внешняя обработка (.epf) открывается в пользовательском режиме за секунды через Файл → Открыть, поэтому многие сначала отлаживают вывод в ней.
Порядок такой:
- В Конфигураторе создайте новую внешнюю обработку:
Файл → Новый → Внешняя обработка. - В ветке
Макетыдобавьте макет типа «Табличный документ» с тем же именем, которое будет в расширении. - Нарисуйте форму и разметьте именованные области (ниже — как).
- На форме обработки сделайте реквизит «Документ» и кнопку, которая выводит макет в поле табличного документа.
- Когда вывод выглядит правильно, перенесите макет в расширение.
Перенос делают через буфер обмена. Откройте макет в обработке, выделите весь лист (Ctrl+A), скопируйте и вставьте в пустой макет расширения. После вставки проверьте имена областей: выделите строки области и посмотрите свойство «Имя» в палитре свойств. Если имя пропало, назначьте его заново.
Код процедуры вывода из обработки переносится почти без изменений. Меняется только способ получения макета — об этом в разделе про код.
Добавляем макет в расширение конфигурации пошагово
Шаг 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 и загрузите его в другой базе через список расширений. Конфигурации в обеих базах должны совпадать по заимствованным объектам.