При разработке корпоративных систем на базе 1С:Комплексная автоматизация 2.5 (КА 2.5) часто возникает задача формирования печатных форм договоров в формате Microsoft Word (DOCX). В отличие от 1С:Бухгалтерии, где развит механизм печати на основе HTML, в КА 2.5 разработчики чаще обращаются к подсистеме "Печать" из Библиотеки стандартных подсистем (БСП). Современные версии БСП (начиная с 3.1.4) предоставляют мощный инструментарий для работы с форматом Open XML, который позволяет формировать документы на стороне сервера без установки MS Office.
В этой статье мы подробно разберем процесс создания расширения для реализации печати договора контрагента и сотрудника по шаблонам Word, проанализируем необходимые процедуры и особенности подготовки макетов.
Прежде чем добавлять свои команды, нам необходимо убедиться, что целевой объект (в нашем случае справочник ДоговорыКонтрагентов) включен в список объектов, поддерживающих команды печати БСП. Для этого проанализируем общий модуль УправлениеПечатьюПереопределяемый.
Нам интересна процедура ПриОпределенииОбъектовСКомандамиПечати. Рассмотрим её содержание в типовой конфигурации. Как правило, в КА 2.5 она вызывает специализированный серверный модуль управления печатью торгового функционала:
Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт
УправлениеПечатьюУТСервер.ОпределитьОбъектыСКомандамиПечати(СписокОбъектов);
КонецПроцедуры
Заглянув в УправлениеПечатьюУТСервер, мы обнаружим, что справочник ДоговорыКонтрагентов уже добавлен в СписокОбъектов. Это означает, что платформа готова искать команды печати в модуле менеджера этого справочника, и нам не нужно вносить изменения в этот общий модуль через расширение.
Теперь перейдем к созданию расширения. Нам нужно добавить в него справочник ДоговорыКонтрагентов и переопределить процедуру ДобавитьКомандыПечати в его модуле менеджера. Мы будем использовать аннотацию &После, чтобы не затирать типовые печатные формы, если они появятся в будущем.
Разберем пример кода для добавления двух вариантов договора (предоплата и отсрочка):
&После("ДобавитьКомандыПечати")
Процедура Расш1_ДобавитьКомандыПечати(КомандыПечати)
// Команда для договора со 100% предоплатой
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "ДоговорКонтрагентаПредоплата";
КомандаПечати.Представление = НСтр("ru = 'Договор поставки (Предоплата)'");
КомандаПечати.ТребуетсяРасширениеРаботыСФайлами = Истина;
КомандаПечати.Порядок = 10;
КомандаПечати.Картинка = БиблиотекаКартинок.ФорматWord;
// Команда для договора с отсрочкой платежа
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "ДоговорКонтрагентаОтсрочкаПлатежа";
КомандаПечати.Представление = НСтр("ru = 'Договор поставки (Отсрочка платежа)'");
КомандаПечати.ТребуетсяРасширениеРаботыСФайлами = Истина;
КомандаПечати.Порядок = 11;
КомандаПечати.Картинка = БиблиотекаКартинок.ФорматWord;
КонецПроцедуры
Обратим внимание на свойство ТребуетсяРасширениеРаботыСФайлами. Установка этого флага в Истина позволяет БСП корректно обрабатывать открытие файлов в веб-клиенте. После сохранения расширения в форме договора автоматически появится кнопка "Печать" с нашими пунктами меню.
Макет для БСП в формате Word — это обычный файл .docx, внутри которого расставлены параметры. Важнейшее правило: при добавлении макета в дерево конфигурации (или расширения) его имя должно начинаться с префикса ПФ_DOC_.
Почему это важно? Префикс ПФ_DOC_ служит маркером для движка БСП. Увидев его, система понимает, что макет нужно обрабатывать как документ Office Open XML, а не как стандартную таблицу 1С (MXL). Если префикс не указать, при попытке печати возникнет программная ошибка обращения к областям макета.
Разберем правила разметки самого документа Word:
v8. Например: {v8 НомерДоговора}, {v8 ДатаДоговора}, {v8 ОрганизацияНаименование}.{v8 Область.Заголовок} ... {/v8 Область.Заголовок}.{v8 Область.СтрокаТаблицы} ... {/v8 Область.СтрокаТаблицы}.Важное предостережение: Шаблоны Open XML очень чувствительны к "разорванным" тегам. Если вы написали {v8 Номер}, а потом выделили слово "Номер" жирным шрифтом, Word внутри XML-структуры может разбить этот тег на несколько узлов. БСП не сможет найти такой параметр. Проверяйте, чтобы параметры вводились как единый текст, либо используйте специальные инструменты очистки XML-тегов.
После регистрации команд и добавления макетов нам необходимо описать саму процедуру формирования документа. В модуле менеджера (также в расширении) создадим или расширим процедуру Печать.
Рассмотрим структуру формирования данных для Open XML:
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ДоговорКонтрагентаПредоплата") Тогда
// Подготовим макет и данные
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ДоговорКонтрагентаПредоплата");
ДанныеДляПечати = Новый Соответствие;
Для Каждого Ссылка Из МассивОбъектов Цикл
// Структура данных для заполнения параметров в Word
СведенияОДоговоре = Новый Структура;
СведенияОДоговоре.Вставить("НомерДоговора", Ссылка.Номер);
СведенияОДоговоре.Вставить("ДатаДоговора", Формат(Ссылка.Дата, "ДЛФ=DD"));
СведенияОДоговоре.Вставить("НаименованиеКонтрагента", Ссылка.Контрагент.НаименованиеПолное);
// В БСП для Open XML данные передаются как структура или соответствие
ДанныеДляПечати.Вставить(Ссылка, СведенияОДоговоре);
КонецЦикла;
// Вызываем универсальный механизм вывода макета Word
УправлениеПечатью.ВывестиОбъектыВФорматеMicrosoftWord(
"Справочник.ДоговорыКонтрагентов.ПФ_DOC_ДоговорПоставкиПредоплата",
МассивОбъектов,
ДанныеДляПечати,
ОбъектыПечати,
КоллекцияПечатныхФорм);
КонецЕсли;
КонецПроцедуры
Проанализируем метод ВывестиОбъектыВФорматеMicrosoftWord. Он берет на себя всю "грязную" работу: распаковывает .docx (который по сути является ZIP-архивом), находит внутри XML-файлы с текстом, выполняет поиск строковых вхождений ваших параметров и заменяет их на значения из переданной структуры ДанныеДляПечати. После этого файл запаковывается обратно и передается на сторону клиента.
Выясним, почему этот метод предпочтительнее старых способов работы через COM-объекты:
Таким образом, использование расширения для КА 2.5 в сочетании с современными возможностями БСП позволяет создать гибкую и надежную систему печати договоров любой сложности, сохраняя при этом типовую конфигурацию в чистоте.