Как в 1С:Комплексная автоматизация 2.5 реализовать печать договоров по шаблонам Word (Open XML) через расширение

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

При разработке корпоративных систем на базе 1С:Комплексная автоматизация 2.5 (КА 2.5) часто возникает задача формирования печатных форм договоров в формате Microsoft Word (DOCX). В отличие от 1С:Бухгалтерии, где развит механизм печати на основе HTML, в КА 2.5 разработчики чаще обращаются к подсистеме "Печать" из Библиотеки стандартных подсистем (БСП). Современные версии БСП (начиная с 3.1.4) предоставляют мощный инструментарий для работы с форматом Open XML, который позволяет формировать документы на стороне сервера без установки MS Office.

В этой статье мы подробно разберем процесс создания расширения для реализации печати договора контрагента и сотрудника по шаблонам Word, проанализируем необходимые процедуры и особенности подготовки макетов.

Шаг 1: Проверка регистрации объекта в подсистеме печати

Прежде чем добавлять свои команды, нам необходимо убедиться, что целевой объект (в нашем случае справочник ДоговорыКонтрагентов) включен в список объектов, поддерживающих команды печати БСП. Для этого проанализируем общий модуль УправлениеПечатьюПереопределяемый.

Нам интересна процедура ПриОпределенииОбъектовСКомандамиПечати. Рассмотрим её содержание в типовой конфигурации. Как правило, в КА 2.5 она вызывает специализированный серверный модуль управления печатью торгового функционала:


Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт
    УправлениеПечатьюУТСервер.ОпределитьОбъектыСКомандамиПечати(СписокОбъектов);
КонецПроцедуры

Заглянув в УправлениеПечатьюУТСервер, мы обнаружим, что справочник ДоговорыКонтрагентов уже добавлен в СписокОбъектов. Это означает, что платформа готова искать команды печати в модуле менеджера этого справочника, и нам не нужно вносить изменения в этот общий модуль через расширение.

Шаг 2: Добавление команд печати в модуль менеджера через расширение

Теперь перейдем к созданию расширения. Нам нужно добавить в него справочник ДоговорыКонтрагентов и переопределить процедуру ДобавитьКомандыПечати в его модуле менеджера. Мы будем использовать аннотацию &После, чтобы не затирать типовые печатные формы, если они появятся в будущем.

Разберем пример кода для добавления двух вариантов договора (предоплата и отсрочка):


&После("ДобавитьКомандыПечати")
Процедура Расш1_ДобавитьКомандыПечати(КомандыПечати)
    
    // Команда для договора со 100% предоплатой
    КомандаПечати = КомандыПечати.Добавить();
    КомандаПечати.Идентификатор = "ДоговорКонтрагентаПредоплата";
    КомандаПечати.Представление = НСтр("ru = 'Договор поставки (Предоплата)'");
    КомандаПечати.ТребуетсяРасширениеРаботыСФайлами = Истина;
    КомандаПечати.Порядок = 10;
    КомандаПечати.Картинка = БиблиотекаКартинок.ФорматWord;
    
    // Команда для договора с отсрочкой платежа
    КомандаПечати = КомандыПечати.Добавить();
    КомандаПечати.Идентификатор = "ДоговорКонтрагентаОтсрочкаПлатежа";
    КомандаПечати.Представление = НСтр("ru = 'Договор поставки (Отсрочка платежа)'");
    КомандаПечати.ТребуетсяРасширениеРаботыСФайлами = Истина;
    КомандаПечати.Порядок = 11;
    КомандаПечати.Картинка = БиблиотекаКартинок.ФорматWord;
    
КонецПроцедуры

Обратим внимание на свойство ТребуетсяРасширениеРаботыСФайлами. Установка этого флага в Истина позволяет БСП корректно обрабатывать открытие файлов в веб-клиенте. После сохранения расширения в форме договора автоматически появится кнопка "Печать" с нашими пунктами меню.

Шаг 3: Подготовка и размещение макета Open XML

Макет для БСП в формате Word — это обычный файл .docx, внутри которого расставлены параметры. Важнейшее правило: при добавлении макета в дерево конфигурации (или расширения) его имя должно начинаться с префикса ПФ_DOC_.

Почему это важно? Префикс ПФ_DOC_ служит маркером для движка БСП. Увидев его, система понимает, что макет нужно обрабатывать как документ Office Open XML, а не как стандартную таблицу 1С (MXL). Если префикс не указать, при попытке печати возникнет программная ошибка обращения к областям макета.

Разберем правила разметки самого документа Word:

  1. Одиночные параметры: Текст, который должен быть заменен данными из базы, заключается в фигурные скобки с тегом v8. Например: {v8 НомерДоговора}, {v8 ДатаДоговора}, {v8 ОрганизацияНаименование}.
  2. Области: Если нам нужно выделить кусок текста, который может повторяться или выводиться по условию, используются теги начала и конца области: {v8 Область.Заголовок} ... {/v8 Область.Заголовок}.
  3. Списки и таблицы: Для вывода табличных частей (например, спецификации к договору) создается строка таблицы в Word, и вся эта строка обрамляется тегами области: {v8 Область.СтрокаТаблицы} ... {/v8 Область.СтрокаТаблицы}.

Важное предостережение: Шаблоны Open XML очень чувствительны к "разорванным" тегам. Если вы написали {v8 Номер}, а потом выделили слово "Номер" жирным шрифтом, Word внутри XML-структуры может разбить этот тег на несколько узлов. БСП не сможет найти такой параметр. Проверяйте, чтобы параметры вводились как единый текст, либо используйте специальные инструменты очистки XML-тегов.

Шаг 4: Реализация программной логики печати

После регистрации команд и добавления макетов нам необходимо описать саму процедуру формирования документа. В модуле менеджера (также в расширении) создадим или расширим процедуру Печать.

Рассмотрим структуру формирования данных для Open XML:


Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

    Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ДоговорКонтрагентаПредоплата") Тогда
        // Подготовим макет и данные
        ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ДоговорКонтрагентаПредоплата");
        
        ДанныеДляПечати = Новый Соответствие;
        Для Каждого Ссылка Из МассивОбъектов Цикл
            
            // Структура данных для заполнения параметров в Word
            СведенияОДоговоре = Новый Структура;
            СведенияОДоговоре.Вставить("НомерДоговора", Ссылка.Номер);
            СведенияОДоговоре.Вставить("ДатаДоговора", Формат(Ссылка.Дата, "ДЛФ=DD"));
            СведенияОДоговоре.Вставить("НаименованиеКонтрагента", Ссылка.Контрагент.НаименованиеПолное);
            
            // В БСП для Open XML данные передаются как структура или соответствие
            ДанныеДляПечати.Вставить(Ссылка, СведенияОДоговоре);
            
        КонецЦикла;
        
        // Вызываем универсальный механизм вывода макета Word
        УправлениеПечатью.ВывестиОбъектыВФорматеMicrosoftWord(
            "Справочник.ДоговорыКонтрагентов.ПФ_DOC_ДоговорПоставкиПредоплата", 
            МассивОбъектов, 
            ДанныеДляПечати, 
            ОбъектыПечати, 
            КоллекцияПечатныхФорм);
            
    КонецЕсли;

КонецПроцедуры

Проанализируем метод ВывестиОбъектыВФорматеMicrosoftWord. Он берет на себя всю "грязную" работу: распаковывает .docx (который по сути является ZIP-архивом), находит внутри XML-файлы с текстом, выполняет поиск строковых вхождений ваших параметров и заменяет их на значения из переданной структуры ДанныеДляПечати. После этого файл запаковывается обратно и передается на сторону клиента.

Преимущества работы через Open XML в БСП 3.1.4

Выясним, почему этот метод предпочтительнее старых способов работы через COM-объекты:

Таким образом, использование расширения для КА 2.5 в сочетании с современными возможностями БСП позволяет создать гибкую и надежную систему печати договоров любой сложности, сохраняя при этом типовую конфигурацию в чистоте.

← На главную