При разработке решений для 1С:Управление нашей фирмой 3.0 часто возникает задача создания внешних печатных форм (ВПФ), которые пользователь мог бы самостоятельно редактировать без привлечения программиста. Это касается не только исправления опечаток, но и изменения структуры документа, добавления новых параметров и динамической подстановки изображений (например, разных логотипов для разных организаций или подписей ответственных лиц). Разберем по шагам наиболее эффективные способы реализации такой задачи.
Если заказчику требуется максимальная гибкость в оформлении (сложная верстка, специфические шрифты, плавающие блоки), использование шаблонов .docx является оптимальным решением. В этом случае внешняя печатная форма работает через COM-объект или библиотеку работы с форматом Office Open XML.
Рассмотрим алгоритм реализации:
{НомерДокумента}, {Дата}, {ИмяКонтрагента}.Проанализируем пример кода для замены простых параметров:
Функция СформироватьПечатнуюФормуWord(СсылкаНаОбъект, Макет)
// Получаем макет как двоичные данные и сохраняем во временный файл
ПутьКФайлу = ПолучитьИмяВременногоФайла("docx");
Макет.Записать(ПутьКФайлу);
// Инициализируем COM-объект
Попытка
WordApp = Новый COMОбъект("Word.Application");
Исключение
Сообщить("MS Word не установлен");
Возврат Неопределено;
КонецПопытки;
Документ = WordApp.Documents.Open(ПутьКФайлу);
Selection = WordApp.Selection;
// Пример замены текста
ЗаменитьТекстВWord(Selection, "{НомерДокумента}", СсылкаНаОбъект.Номер);
ЗаменитьТекстВWord(Selection, "{Дата}", Формат(СсылкаНаОбъект.Дата, "ДФ=dd.MM.yyyy"));
WordApp.Visible = Истина;
КонецФункции
Одной из специфических задач является вставка картинок в зависимости от условий (сообщение №8 на форуме). Для этого в шаблоне рекомендуется использовать специальные метки или закладки (Bookmarks). Мы можем найти нужную метку в документе и вставить на её место изображение из хранилища 1С.
Разберем, как это реализовать программно. Выясним причину, по которой обычная замена текста здесь не сработает: картинка является объектом InlineShape, а не строкой. Посмотрим на пример вставки:
// Допустим, у нас есть картинка в Двоичных Данных
ПутьККартинке = ПолучитьИмяВременногоФайла("png");
КартинкаДД.Записать(ПутьККартинке);
// Ищем метку в документе
Поиск = WordApp.Range().Find;
Поиск.Text = "[МестоДляПечати]";
Если Поиск.Execute() Тогда
// Вставляем картинку на место найденного текста
WordApp.Selection.InlineShapes.AddPicture(ПутьККартинке);
КонецЕсли;
Не всегда нужно уходить в Word. Платформа 1С предоставляет мощный механизм «Пользовательских макетов». Вы можете создать стандартную ВПФ с макетом MXL, но вызвать его так, чтобы система проверяла наличие изменений, внесенных пользователем в режиме «Предприятие».
Для этого в коде формирования печатной формы мы не должны обращаться напрямую к макету обработки через ЭтотОбъект.ПолучитьМакет(). Вместо этого проанализируем использование менеджера печатных форм:
Чтобы эти правки применились, в коде используем следующую конструкцию:
// Вместо ПолучитьМакет("Макет") используем метод управления макетами
ИмяМакета = "ПФ_MXL_УниверсальнаяФорма";
ОбъектМакета = УправлениеПечатью.МакетПечатнойФормы("Документ.ЗаказПокупателя." + ИмяМакета);
// Если это внешняя форма, нужно передать путь к ней или использовать её менеджер
Важный момент: при использовании MXL важно защитить код от удаления пользователем именованных областей. Всегда проверяйте наличие области перед заполнением:
ОбластьМакета = Макет.ПолучитьОбласть("Заголовок");
Если ОбластьМакета <> Неопределено Тогда
ОбластьМакета.Параметры.Заполнить(ДанныеПечати);
ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЕсли;
В УНФ 3.0 существует встроенная подсистема «Шаблоны печати». Она позволяет создавать шаблоны в формате HTML или Word прямо в интерфейсе программы. Вы можете использовать этот механизм как базу для своей ВПФ.
Рассмотрим преимущества этого подхода:
Файлы, что исключает необходимость переустановки ВПФ при изменении дизайна.Для реализации динамических картинок в этом механизме придется немного доработать общий модуль, отвечающий за формирование печатных форм по шаблонам, добавив обработку специфических тегов для вывода изображений (например, QR-кодов или логотипов подразделений).
Чтобы ваша разработка была устойчива к изменениям, которые вносит пользователь, рекомендуем придерживаться следующих правил:
ЗаполнитьПараметры() для табличных документов. Если пользователь добавит новый параметр в макет, который вы не передали, 1С просто проигнорирует его, а если удалит существующий — программа не упадет с ошибкой.НоменклатураПрисоединенныеФайлы или ОрганизацииПрисоединенныеФайлы.Таким образом, для реализации задачи в УНФ 3.0 оптимальным выбором будет либо шаблон Word (для сложной верстки), либо пользовательский макет MXL (для табличных данных), вызываемый через механизм управления печатью платформы.