Как создать редактируемую внешнюю печатную форму в 1С:УНФ 3.0 с поддержкой динамических изображений?

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Управленческий учет IT и автоматизация бизнеса
← На главную

При разработке решений для 1С:Управление нашей фирмой 3.0 часто возникает задача создания внешних печатных форм (ВПФ), которые пользователь мог бы самостоятельно редактировать без привлечения программиста. Это касается не только исправления опечаток, но и изменения структуры документа, добавления новых параметров и динамической подстановки изображений (например, разных логотипов для разных организаций или подписей ответственных лиц). Разберем по шагам наиболее эффективные способы реализации такой задачи.

Вариант 1. Использование шаблонов Microsoft Word

Если заказчику требуется максимальная гибкость в оформлении (сложная верстка, специфические шрифты, плавающие блоки), использование шаблонов .docx является оптимальным решением. В этом случае внешняя печатная форма работает через COM-объект или библиотеку работы с форматом Office Open XML.

Рассмотрим алгоритм реализации:

  1. Создаем макет в формате Binary Data (Двоичные данные) внутри ВПФ, куда загружаем файл Word.
  2. В тексте Word-файла расставляем теги-заполнители, например, {НомерДокумента}, {Дата}, {ИмяКонтрагента}.
  3. В программном коде ВПФ инициализируем подключение к Word, выполняем отладку и замену текста.

Проанализируем пример кода для замены простых параметров:


Функция СформироватьПечатнуюФормуWord(СсылкаНаОбъект, Макет)
    // Получаем макет как двоичные данные и сохраняем во временный файл
    ПутьКФайлу = ПолучитьИмяВременногоФайла("docx");
    Макет.Записать(ПутьКФайлу);

    // Инициализируем COM-объект
    Попытка
        WordApp = Новый COMОбъект("Word.Application");
    Исключение
        Сообщить("MS Word не установлен");
        Возврат Неопределено;
    КонецПопытки;

    Документ = WordApp.Documents.Open(ПутьКФайлу);
    Selection = WordApp.Selection;

    // Пример замены текста
    ЗаменитьТекстВWord(Selection, "{НомерДокумента}", СсылкаНаОбъект.Номер);
    ЗаменитьТекстВWord(Selection, "{Дата}", Формат(СсылкаНаОбъект.Дата, "ДФ=dd.MM.yyyy"));

    WordApp.Visible = Истина;
КонецФункции

Вариант 2. Динамическая подстановка изображений в Word

Одной из специфических задач является вставка картинок в зависимости от условий (сообщение №8 на форуме). Для этого в шаблоне рекомендуется использовать специальные метки или закладки (Bookmarks). Мы можем найти нужную метку в документе и вставить на её место изображение из хранилища 1С.

Разберем, как это реализовать программно. Выясним причину, по которой обычная замена текста здесь не сработает: картинка является объектом InlineShape, а не строкой. Посмотрим на пример вставки:


// Допустим, у нас есть картинка в Двоичных Данных
ПутьККартинке = ПолучитьИмяВременногоФайла("png");
КартинкаДД.Записать(ПутьККартинке);

// Ищем метку в документе
Поиск = WordApp.Range().Find;
Поиск.Text = "[МестоДляПечати]";
Если Поиск.Execute() Тогда
    // Вставляем картинку на место найденного текста
    WordApp.Selection.InlineShapes.AddPicture(ПутьККартинке);
КонецЕсли;

Вариант 3. Пользовательские макеты на базе MXL

Не всегда нужно уходить в Word. Платформа 1С предоставляет мощный механизм «Пользовательских макетов». Вы можете создать стандартную ВПФ с макетом MXL, но вызвать его так, чтобы система проверяла наличие изменений, внесенных пользователем в режиме «Предприятие».

Для этого в коде формирования печатной формы мы не должны обращаться напрямую к макету обработки через ЭтотОбъект.ПолучитьМакет(). Вместо этого проанализируем использование менеджера печатных форм:

  1. Пользователь заходит в Администрирование — Печатные формы, отчеты и обработки — Макеты печатных форм.
  2. Находит вашу ВПФ и нажимает «Изменить».
  3. Вносит правки (меняет цвета, двигает области, меняет текст).

Чтобы эти правки применились, в коде используем следующую конструкцию:


// Вместо ПолучитьМакет("Макет") используем метод управления макетами
ИмяМакета = "ПФ_MXL_УниверсальнаяФорма";
ОбъектМакета = УправлениеПечатью.МакетПечатнойФормы("Документ.ЗаказПокупателя." + ИмяМакета);
// Если это внешняя форма, нужно передать путь к ней или использовать её менеджер

Важный момент: при использовании MXL важно защитить код от удаления пользователем именованных областей. Всегда проверяйте наличие области перед заполнением:


ОбластьМакета = Макет.ПолучитьОбласть("Заголовок");
Если ОбластьМакета <> Неопределено Тогда
    ОбластьМакета.Параметры.Заполнить(ДанныеПечати);
    ТабличныйДокумент.Вывести(ОбластьМакета);
КонецЕсли;

Вариант 4. Стандартный механизм «Шаблоны договоров» в УНФ 3.0

В УНФ 3.0 существует встроенная подсистема «Шаблоны печати». Она позволяет создавать шаблоны в формате HTML или Word прямо в интерфейсе программы. Вы можете использовать этот механизм как базу для своей ВПФ.

Рассмотрим преимущества этого подхода:

Для реализации динамических картинок в этом механизме придется немного доработать общий модуль, отвечающий за формирование печатных форм по шаблонам, добавив обработку специфических тегов для вывода изображений (например, QR-кодов или логотипов подразделений).

Рекомендации по архитектуре «неубиваемой» ВПФ

Чтобы ваша разработка была устойчива к изменениям, которые вносит пользователь, рекомендуем придерживаться следующих правил:

  1. Разделение данных и представления. Сначала соберите все возможные данные в одну структуру или таблицу значений (запросы к БД, расчеты, итоги). Только после этого передавайте эту структуру в процедуру печати.
  2. Безопасное заполнение параметров. Используйте метод ЗаполнитьПараметры() для табличных документов. Если пользователь добавит новый параметр в макет, который вы не передали, 1С просто проигнорирует его, а если удалит существующий — программа не упадет с ошибкой.
  3. Использование внешних хранилищ для картинок. Не «зашивайте» картинки в макет. Лучше добавьте в макет параметр-строку и в коде заменяйте его на объект картинки, взятый из справочника НоменклатураПрисоединенныеФайлы или ОрганизацииПрисоединенныеФайлы.

Таким образом, для реализации задачи в УНФ 3.0 оптимальным выбором будет либо шаблон Word (для сложной верстки), либо пользовательский макет MXL (для табличных данных), вызываемый через механизм управления печатью платформы.

← На главную