В процессе работы с программой 1С:Управление торговлей 11 часто возникает необходимость кастомизации печатных форм. Одной из самых востребованных задач является добавление возможности печати факсимиле (изображений печати и подписей ответственных лиц) во внешнюю печатную форму (ВПФ). Рассмотрим подробно техническое руководство по интеграции печатей и подписей, чтобы понять, как реализовать этот механизм, даже если вы не являетесь профессиональным разработчиком, а выполняете функции администратора системы — для этого подойдёт редактор печатных форм и факсимиле для 1С.
Прежде чем приступать к правке программного кода, проанализируем, откуда программа берет изображения. В конфигурациях на базе Библиотеки Стандартных Подсистем (БСП), таких как УТ 11 или ERP, факсимиле привязано к карточке организации. Выполним следующие действия:
Организации.Разберем структуру функции СведенияОВнешнейОбработке. Чтобы пользователь мог выбирать, печатать документ с факсимиле или без, нам нужно зарегистрировать две разные команды. Проанализируем пример кода для модуля объекта обработки, на примере которого часто строится логика в таких решениях, как Счет-договор для УТ 11.5 с поддержкой факсимиле:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
МассивНазначений = Новый Массив;
// Указываем документ, к которому привязываем форму
МассивНазначений.Добавить("Документ.ЗаказКлиента");
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
ПараметрыРегистрации.Вставить("Наименование", "Счет-договор (ВПФ)");
ПараметрыРегистрации.Вставить("Версия", "1.1");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
ТаблицаКоманд = ПолучитьТаблицуКоманд();
// Добавляем две команды: обычную и с факсимиле
ДобавитьКоманду(ТаблицаКоманд, "Счет-договор", "СчетДоговор", "ВызовСерверногоМетода", Истина, "ПечатьMXL");
ДобавитьКоманду(ТаблицаКоманд, "Счет-договор (с факсимиле)", "СчетДоговорФаксимиле", "ВызовСерверногоМетода", Истина, "ПечатьMXL");
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Обратите внимание на параметр Идентификатор (третий параметр в ДобавитьКоманду). Мы будем использовать его далее, чтобы определить, какую именно кнопку нажал пользователь.
Теперь выясним, как направить поток выполнения программы в зависимости от выбранной команды. В модуле объекта должна присутствовать экспортная процедура Печать. Рассмотрим ее структуру:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// Проверяем наличие команды для обычной печати
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "СчетДоговор");
Если ПечатнаяФорма <> Неопределено Тогда
ПечатнаяФорма.ТабличныйДокумент = СформироватьПечатнуюФорму(МассивОбъектов, Ложь);
ПечатнаяФорма.СинонимМакета = "Счет-договор";
КонецЕсли;
// Проверяем наличие команды для печати с факсимиле
ПечатнаяФормаФакс = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "СчетДоговорФаксимиле");
Если ПечатнаяФормаФакс <> Неопределено Тогда
// Передаем Истина во второй параметр функции формирования
ПечатнаяФормаФакс.ТабличныйДокумент = СформироватьПечатнуюФорму(МассивОбъектов, Истина);
ПечатнаяФормаФакс.СинонимМакета = "Счет-договор (с факсимиле)";
КонецЕсли;
КонецПроцедуры
Рассмотрим подробнее функцию СформироватьПечатнуюФорму. Главный секрет здесь заключается в использовании стандартного метода БСП ФормированиеПечатныхФорм.ВывестиФаксимилеВТабличныйДокумент. Вы также можете применить универсальный механизм вывода факсимиле, который берет на себя всю сложную работу по поиску картинок и их позиционированию — есть универсальная обработка подстановки печатей и подписей.
Функция СформироватьПечатнуюФорму(МассивОбъектов, ВыводитьФаксимиле)
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.АвтоМасштаб = Истина;
// Получаем макет из обработки
Макет = ПолучитьМакет("Макет");
Для Каждого СсылкаНаДокумент Из МассивОбъектов Цикл
// ... здесь идет стандартный код заполнения областей макета данными (Шапка, Строки) ...
ОбластьПодписи = Макет.ПолучитьОбласть("Подвал");
// Заполняем параметры области подписи
ОбластьПодписи.Параметры.Заполнить(СсылкаНаДокумент);
// Если пользователь выбрал печать с факсимиле:
Если ВыводитьФаксимиле Тогда
// Выясним организацию из документа
Организация = СсылкаНаДокумент.Организация;
// Вызываем магическую функцию БСП
// Она найдет в ОбластиПодписи места, где должны быть картинки, и вставит их
ФормированиеПечатныхФорм.ВывестиФаксимилеВТабличныйДокумент(Макет, ОбластьПодписи, Организация);
КонецЕсли;
ТабличныйДокумент.Вывести(ОбластьПодписи);
КонецЦикла;
Возврат ТабличныйДокумент;
КонецФункции
Для того чтобы метод ВывестиФаксимилеВТабличныйДокумент сработал корректно, проанализируем требования к макету MXL. В области, которую вы передаете в процедуру (например, Подвал), должны быть созданы именованные рисунки-контейнеры. Используйте инструкцию по программной работе с рисунками в макетах (поможет автоматическое наложение факсимиле на печатные формы), чтобы правильно выполнить следующие действия:
ПечатьОрганизации.ПодписьРуководителя.Важный нюанс: установите свойство рисунка Граница в значение "Нет линии", а свойство ЦветФона — "Авто". Это позволит картинке выглядеть нативно на фоне документа.
Если код выдает ошибку Процедура или функция с указанным именем не определена, проанализируем следующие моменты:
СформироватьПечатнуюФорму находится в том же модуле, что и процедура Печать, или является экспортной в другом модуле.СформироватьПечатнуюФорму, а сама функция называется СформироватьПечать, возникнет ошибка компиляции.Таким образом, мы видим, что добавление факсимиле — это не столько написание сложного алгоритма отрисовки, сколько правильное использование готовых "кубиков", предоставленных платформой 1С:Предприятие. Следуя этой инструкции, вы сможете самостоятельно доработать формы, либо использовать готовый пакет внешних печатных форм с факсимиле для быстрого результата — есть комплект печатных форм с факсимиле для 1С. Это обеспечит компанию профессионально выглядящими документами без привлечения сторонних разработчиков.