При разработке печатных форм на платформе Windows традиционным решением долгое время оставалась COM-автоматизация офисных пакетов Microsoft Word или OpenOffice/LibreOffice. Однако в среде Linux технологии COM и OLE отсутствуют. Если сервер 1С или рабочее место клиента функционирует под управлением Linux, старые механизмы прямого вызова офисных приложений работать не будут.
Разберем основные кросс-платформенные способы подготовки и заполнения шаблонов документов (например, договоров и соглашений) в 1С под Linux.
В подсистеме печати «Библиотеки стандартных подсистем» (БСП) реализован кросс-платформенный механизм работы с шаблонами в форматах DOCX и ODT. Для его работы не требуется установленный на сервере Microsoft Word, LibreOffice или COM-компоненты.
Рассмотрим принцип работы данного механизма:
DOCX и ODT физически представляют собой ZIP-архивы, внутри которых содержатся файлы разметки XML (например, document.xml в Word или content.xml в OpenOffice/LibreOffice).ЧтениеZipФайла, анализирует XML-структуру, находит параметры подстановки и заменяет их на реальные данные.ЗаписьZipФайла и выдается пользователю в виде готового бинарного файла.Шаблоны БСП поддерживают параметры вида {v8 ИмяПараметра}, а также построчный вывод табличных частей документа.
При самостоятельной разработке или редактировании макетов DOCX важно учитывать эффект разрыва тегов в XML. При редактировании текста шаблона офисный редактор может разбить единую строку параметра на несколько XML-тегов <w:t> (например, из-за встроенной проверки орфографии или смены начертания отдельных символов). Механизмы БСП автоматически нормализуют разметку перед поиском параметров, поэтому использование штатных процедур подсистемы печати БСП предпочтительнее самописного поиска по подстроке.
Универсальным и полностью кросс-платформенным решением внутри платформы «1С:Предприятие» является стандартный макет вида ТабличныйДокумент. Разметка макета выполняется непосредственно в конфигураторе, а для вывода используются типовые области строк, колонок и параметров.
Посмотрим на пример программного заполнения и сохранения табличного документа в файл нужного формата:
ТабДокумент = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МакетДоговора");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.НомерДоговора = "№ 123-А";
ОбластьШапка.Параметры.ДатаДоговора = ТекущаяДатаСеанса();
ОбластьШапка.Параметры.Контрагент = "ООО Ромашка";
ТабДокумент.Вывести(ОбластьШапка);
// Экспорт готового документа в PDF
ПутьКФайлу = "/tmp/dogovor.pdf";
ТабДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
Объект ТабличныйДокумент платформенными средствами поддерживает экспорт в форматы PDF, DOCX, XLSX, ODS и HTML через метод Записать().
Особенности использования табличных документов для многостраничного текста:
msttcorefonts). Если на сервере отсутствуют используемые в макете шрифты, платформа выполнит их подмену, что может нарушить границы и форматирование страниц.Если печатную форму необходимо сформировать на основе шаблона DOCX/ODT, но отдать клиенту в формате PDF, можно использовать внешнюю консольную конвертацию LibreOffice на стороне Linux-сервера.
Разберем пример вызова утилиты конвертации через метод платформы ЗапуститьПриложение:
КомандаКонвертации = "libreoffice --headless --convert-to pdf /tmp/dogovor.docx --outdir /tmp/";
ЗапуститьПриложение(КомандаКонвертации, , Истина);
Параметр --headless запускает офисный пакет в фоновом режиме без отображения графического интерфейса, генерируя итоговый файл PDF в указанном каталоге.
Еще один кросс-платформенный вариант создания сложных текстовых документов — использование HTML-шаблонов. Разметка создается с использованием стандартных тегов HTML и стилей CSS, а параметры заполняются с помощью строковых функций 1С или шаблонизаторов. Готовый HTML-документ открывается в веб-клиенте, отправляется на печать через браузерные средства или преобразуется в PDF.
Таким образом, для работы под управлением Linux оптимально использовать встроенный функционал БСП для макетов DOCX/ODT либо стандартный ТабличныйДокумент с экспортом в целевой формат.