Часто при работе с отраслевыми решениями, такими как «ПС:Управление мебельной фабрикой ERP» (базирующимися на ядре 1С:ERP), программисты сталкиваются с тем, что привычные общие модули Библиотеки стандартных подсистем (БСП) переименованы, сильно модифицированы или частично отсутствуют. Например, в базе может не оказаться общего модуля ДополнительныеОтчетыИОбработки или не работать стандартная экспортная процедура СведенияОВнешнейОбработке. Для подобных случаев подойдёт обработка для ручной регистрации внешних печатных форм.
Проанализируем ситуацию: если готовых примеров и стандартных обработчиков нет, нам придется реализовывать механизм печати самостоятельно. Рассмотрим подробно два рабочих метода формирования документов в формате ODT (OpenDocument Text): классический через COM-объект и более современный серверный метод через работу с ZIP-архивами.
Разберем по шагам специфику работы с ВПФ, когда стандартная БСП недоступна:
Двоичные данные.Этот подход во многом аналогичен созданию печатной формы на базе MS Word, но использует API OpenOffice/LibreOffice. Рассмотрим алгоритм действий:
ПолучитьИмяВременногоФайла("odt").com.sun.star.ServiceManager.Данный метод рабочий, но имеет недостатки: он требует обязательной установки стороннего ПО на клиентские машины и может работать медленно из-за особенностей COM-соединения.
Посмотрим на более оптимальный путь. Выясним причину, по которой мы можем обойтись без LibreOffice при генерации файла: любой файл формата ODT представляет собой обычный ZIP-архив, внутри которого лежат XML-файлы с разметкой и текстом. Мы можем просто распаковать его, изменить текст и запаковать обратно средствами самой платформы 1С на сервере.
Разберем этот процесс детально:
ЧтениеZipФайла архив распаковывается во временную директорию.ЧтениеТекста и ЗаписьТекста мы читаем этот XML-файл как обычную строку.СтрЗаменить находит расставленные в документе теги (например, {Организация}, {НомерДокумента}) и подставляет нужные значения.ЗаписьZipФайла в исходный формат ODT.ЗапуститьПриложение().Посмотрим на пример реализации данного алгоритма в коде:
// 1. Получаем макет из внешней обработки
Макет = ПолучитьМакет("МакетДоговораODT");
ИмяАрхиваZIP = ПолучитьИмяВременногоФайла("zip");
Макет.Записать(ИмяАрхиваZIP);
// 2. Распаковываем ODT (ZIP) во временную папку
ПапкаРаспаковки = ПолучитьИмяВременногоФайла("");
СоздатьКаталог(ПапкаРаспаковки);
ЧтениеАрхива = Новый ЧтениеZipФайла(ИмяАрхиваZIP);
ЧтениеАрхива.ИзвлечьВсе(ПапкаРаспаковки);
ЧтениеАрхива.Закрыть();
// 3. Читаем файл content.xml
ПутьККонтенту = ПапкаРаспаковки + "\content.xml";
ТекстДок = Новый ЧтениеТекста(ПутьККонтенту, КодировкаТекста.UTF8);
ТекстXML = ТекстДок.Прочитать();
ТекстДок.Закрыть();
// 4. Заменяем теги на данные из базы
ТекстXML = СтрЗаменить(ТекстXML, "{НомерДокумента}", ДанныеПечати.Номер);
ТекстXML = СтрЗаменить(ТекстXML, "{ДатаДокумента}", Формат(ДанныеПечати.Дата, "ДЛФ=DD"));
ТекстXML = СтрЗаменить(ТекстXML, "{Контрагент}", ДанныеПечати.КонтрагентНаименование);
// 5. Записываем изменения обратно в content.xml
ЗаписьДок = Новый ЗаписьТекста(ПутьККонтенту, КодировкаТекста.UTF8);
ЗаписьДок.Записать(ТекстXML);
ЗаписьДок.Закрыть();
// 6. Запаковываем обратно в ODT
ИмяГотовогоФайла = ПолучитьИмяВременногоФайла("odt");
ЗаписьАрхива = Новый ЗаписьZipФайла(ИмяГотовогоФайла);
ЗаписьАрхива.Добавить(ПапкаРаспаковки + "\*", РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);
ЗаписьАрхива.Записать();
Этот способ абсолютно независим от наличия БСП, COM-объектов или установленного на сервере офисного пакета. Он работает максимально быстро и надежно.
В самописных ВПФ часто возникает ситуация, когда платформа или остатки БСП запрещают печать непроведенных документов, выдавая ошибку. Чтобы обойти это ограничение без вмешательства в общие модули, применяют следующий подход:
В модуле формы вашей внешней обработки создайте команду с типом вызова ВызовКлиентскогоМетода. В клиентской процедуре формы пропишите собственную логику получения ссылки на текущий объект (документ) и прямой вызов вашей серверной процедуры генерации ODT. Таким образом, вы полностью перехватываете управление процессом печати на себя, минуя любые проверки стандартных подсистем конфигурации.