При работе с конфигурацией «1С:Управление торговлей 10.3» (УТ 10.3), построенной на обычных формах, часто возникает задача расширения стандартного функционала печати. Например, когда для документа ЗаказПокупателя требуется добавить еще один вариант печатной формы (например, альтернативный макет счета на оплату с логотипом компании или дополнительными условиями договора) и вывести его в общее выпадающее меню кнопки «Печать».
Механизмы печати в УТ 10.3 существенно отличаются от современных конфигураций на базе БСП (Библиотеки стандартных подсистем). Здесь меню кнопки «Печать» формируется динамически при открытии формы документа на основании структуры печатных форм, заложенной в самом документе. В этой статье мы подробно разберем три практических способа реализации этой задачи: создание внешней печатной формы (рекомендуемый бескодовый метод), прямое изменение кода конфигурации и использование механизма расширений.
Использование внешней печатной формы является наиболее предпочтительным и безопасным методом разработки в экосистеме 1С. Этот подход позволяет оставить конфигурацию на поддержке, что значительно упрощает ее последующее обновление. При этом внешняя печатная форма автоматически встраивается в стандартное подменю «Печать» целевого документа.
Давайте по шагам разберем процесс создания и подключения такой формы в конфигурации УТ 10.3.
Шаг 1. Создание внешней обработки в конфигураторе
Для начала запустим Конфигуратор и создадим новую внешнюю обработку:
ВнешняяПечатнаяФормаНовыйСчет) и синоним.СсылкаНаОбъект. Этот реквизит крайне важен: именно через него платформа передает во внешнюю форму ссылку на документ, из которого была вызвана печать. Тип данных этого реквизита должен строго соответствовать типу документа-источника — в нашем случае выберем ДокументСсылка.ЗаказПокупателя.Шаг 2. Написание программного кода в модуле объекта
Перейдем в модуль объекта созданной внешней обработки. Здесь нам необходимо определить экспортную функцию Печать(), которая будет вызываться платформой при нажатии кнопки. Функция должна сформировать и вернуть заполненный табличный документ.
Рассмотрим пример кода в модуле объекта внешней обработки:
Функция Печать() Экспорт
ТабДок = Новый ТабличныйДокумент;
ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ЗаказПокупателя_НовыйСчет";
// Получаем макет из нашей внешней обработки
Макет = ПолучитьМакет("Макет");
// Задаем область заголовка макета
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
// Заполняем параметры области данными из реквизита СсылкаНаОбъект
ОбластьЗаголовок.Параметры.НомерДокумента = ОбщегоНазначения.ПолучитьНомерНаПечать(СсылкаНаОбъект);
ОбластьЗаголовок.Параметры.ДатаДокумента = СсылкаНаОбъект.Дата;
ОбластьЗаголовок.Параметры.ОрганизацияПолучатель = СсылкаНаОбъект.Организация;
ОбластьЗаголовок.Параметры.КонтрагентПлательщик = СсылкаНаОбъект.Контрагент;
// Выводим заполненную область в итоговый табличный документ
ТабДок.Вывести(ОбластьЗаголовок);
// Дополнительно можно организовать цикл по табличной части документа
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Для Каждого ТекСтрока Из СсылкаНаОбъект.Товары Цикл
ЗаполнитьЗначенияСвойств(ОбластьСтрока.Параметры, ТекСтрока);
ТабДок.Вывести(ОбластьСтрока);КонецЦикла;
Возврат ТабДок;
КонецФункции
Не забудьте создать сам макет с именем Макет типа «Табличный документ» в ветке макетов нашей внешней обработки и разместить там соответствующие именованные области и параметры.
Шаг 3. Регистрация внешней печатной формы в информационной базе
После сохранения обработки в файл с расширением .epf, запустим информационную базу в режиме «1С:Предприятие» и зарегистрируем ее:
.epf. Название заполнится автоматически.Заказ покупателя.После выполнения этих действий при открытии любого документа Заказ покупателя в подменю кнопки «Печать» автоматически появится новый пункт, соответствующий названию нашей зарегистрированной внешней обработки.
Полезный лайфхак УТ 10.3 — Замещение стандартных форм: В справочнике регистрации ВПФ присутствует колонка «Замещаемая печатная форма». Если вы выберете в ней стандартную форму документа (например, «Счет на оплату»), то при активации пользователем этой стандартной команды система автоматически перенаправит вызов на вашу внешнюю печатную форму. Это позволяет обновлять логику печати без необходимости переучивать пользователей нажимать новые пункты меню.
Если ваша конфигурация уже снята с поддержки или по корпоративным стандартам требуется хранить все макеты строго внутри единой базы данных, мы можем внедрить новую печатную форму непосредственно в код документа. Выясним, как работает механизм динамического построения меню печати в УТ 10.3.
При инициализации формы документа ЗаказПокупателя (обычно в процедуре ПередОткрытием или ПриОткрытии) вызывается специализированный метод общего модуля:
УниверсальныеМеханизмы.СформироватьКнопкиПечати(Ссылка, ЭтаФорма, КнопкаПечать, КнопкаПоУмолчанию);
Этот метод обращается к модулю объекта документа, считывает доступные печатные формы и на их основе конструирует меню кнопки. Чтобы встроить туда наше решение, нам потребуется отредактировать две функции в модуле объекта документа ЗаказПокупателя.
Разобьем этот процесс по шагам:
Шаг 1. Регистрация идентификатора макета
Найдем в модуле объекта документа ЗаказПокупателя экспортную функцию ПолучитьСтруктуруПечатныхФорм(). Она возвращает структуру, где ключом выступает внутренний технический идентификатор печатной формы, а значением — строковое представление для пользователя в интерфейсе. Добавим туда наш новый макет:
Функция ПолучитьСтруктуруПечатныхФорм() Экспорт
СтруктураПечатныхФорм = Новый Структура;
// Существующие стандартные формы документа
СтруктураПечатныхФорм.Вставить("Заказ", "Заказ покупателя");
СтруктураПечатныхФорм.Вставить("Счет", "Счет на оплату");
// Добавляем наш новый альтернативный вариант
СтруктураПечатныхФорм.Вставить("НовыйСчет", "Новый счет на оплату (с логотипом)");
Возврат СтруктураПечатныхФорм;
КонецФункции
Шаг 2. Перехват события вызова печати
Далее найдем в модуле объекта экспортную процедуру Печать(ИмяМакета, КоличествоЭкземпляров, НаПринтер). Эта процедура получает управление, когда пользователь выбирает соответствующую строку в меню «Печать». Нам необходимо добавить условие обработки нашего нового идентификатора НовыйСчет:
Процедура Печать(ИмяМакета, КоличествоЭкземпляров = 1, НаПринтер = Ложь) Экспорт
// Стандартные обработчики макетов конфигурации
Если ИмяМакета = "Заказ" Тогда
// Код печати заказа
ИначеЕсли ИмяМакета = "Счет" Тогда
// Код печати стандартного счета
// Наш новый обработчик
ИначеЕсли ИмяМакета = "НовыйСчет" Тогда
ТабДокумент = ПечатьНовогоСчета(ИмяМакета);
УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, КоличествоЭкземпляров, НаПринтер, "Новый счет на оплату");
КонецЕсли;
КонецПроцедуры
Шаг 3. Реализация алгоритма формирования макета
В этом же модуле объекта создадим приватную функцию ПечатьНовогоСчета(ИмяМакета), которая будет отвечать за компоновку табличного документа:
Функция ПечатьНовогоСчета(ИмяМакета)
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ЗаказПокупателя_НовыйСчет";
// Получаем встроенный макет конфигурации
Макет = ПолучитьМакет("МакетНовогоСчета");
// Алгоритм заполнения областей макета...
// ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
// ТабДокумент.Вывести(ОбластьЗаголовок);
Возврат ТабДокумент;
КонецФункции
Остается лишь добавить сам макет с именем МакетНовогоСчета в дерево метаданных документа ЗаказПокупателя в конфигураторе.
Если база данных работает под управлением современной платформы 1С:Предприятие 8.3 (пусть даже сама конфигурация УТ 10.3 запущена в режиме совместимости и использует обычные формы), мы можем применить технологию расширений. Это позволит нам встроить код макета внутрь базы без непосредственного изменения основной конфигурации поставщика.
Проанализируем алгоритм реализации расширения по шагам:
ДоработкаПечати).ЗаказПокупателя, нажмем по нему правой кнопкой мыши и выберем пункт Добавить в расширение.МакетНовогоСчетаРасширение.ЗаказПокупателя внутри расширения и добавим заимствование методов с помощью соответствующих аннотаций:
&После("ПолучитьСтруктуруПечатныхФорм")
Функция Расш_ПолучитьСтруктуруПечатныхФорм(Результат)
// Добавляем наш пункт в возвращаемую структуру
Результат.Вставить("НовыйСчетРасширение", "Счет с логотипом (Расширение)");
Возврат Результат;
КонецФункции
&Вместо("Печать")
Процедура Расш_Печать(ИмяМакета, КоличествоЭкземпляров = 1, НаПринтер = Ложь)
// Если вызван наш макет из расширения - перехватываем управление
Если ИмяМакета = "НовыйСчетРасширение" Тогда
ТабДокумент = СформироватьСчетИзРасширения();
УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, КоличествоЭкземпляров, НаПринтер, "Счет из расширения");
Иначе
// В противном случае передаем управление стандартному коду конфигурации
ПродолжитьВызов(ИмяМакета, КоличествоЭкземпляров, НаПринтер);
КонецЕсли;
КонецПроцедуры
Таким образом, мы элегантно встраиваемся в общую цепочку вызовов формирования меню печати УТ 10.3, сохраняя при этом конфигурацию полностью типовой и готовой к автоматическим обновлениям.
Мы подробно рассмотрели все возможные варианты расширения меню печати в конфигурации «1С:Управление торговлей 10.3». Подводя итоги, можно выделить следующие рекомендации: