В БСП есть функционал для формирования документа word (docx) без использования com объекта.
Подробно об этом написано здесь Печать в docx методами БСП без COM объекта
При формировании печатных форм на функцию ИнициализироватьМакетОфисногоДокумента приходится большой процент времени (в шаблонах заказчика занимало 60-70% времени выполнения), функция разархивирует шаблон документа docx и чтением XML строит структуру данного шаблона, при каждой печати экземпляра (не при пакетной) эта функция выполняет одну и ту же работу.
Вариант оптимизации: можно выполнить функцию один раз, а в макете хранить не шаблон DOCX, а результат этой функции - структуру данного документа.
1. Точка останова после выполнения функции "ИнициализироватьМакетОфисногоДокумента"
МакетДокументDOCX = ПолучитьМакет("ОченьВажныйДоговор");
Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(МакетДокументDOCX, Неопределено, Неопределено);
Теперь в переменной "Макет" находится структура документа
Используя отладчик
ОбщегоНазначения.ЗначениеВСтрокуXML(Макет)
2. Получаем тест для макета "МакетСтруктура"
Используя отладчик находим каталог
МакетСтруктура.ИмяКаталога
3. Заходим в каталог, архивируем все файлы в ZIP-архив, получаем двоичные данные для макета "МакетРесурсы"
4. В обработке печати добавляем эти два макета (тип:ДвоичныеДанные)
5. В обработке печати вместо вызова УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента функция
Функция ИнициализироватьМакетОфисногоДокумента()
ИмяВременногоФайлаСтруктура = ПолучитьИмяВременногоФайла("TXT");
ДвоичныеДанныеСтруктура = ПолучитьМакет("МакетСтруктура");
ДвоичныеДанныеСтруктура.Записать(ИмяВременногоФайлаСтруктура);
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ИмяВременногоФайлаСтруктура);
Макет = ОбщегоНазначения.ЗначениеИзСтрокиXML(ТекстовыйДокумент.ПолучитьТекст());
ИмяВременногоКаталога = ФайловаяСистема.СоздатьВременныйКаталог();
Макет.ИмяКаталога = ИмяВременногоКаталога;
АдресФайлаСРесурсамиZIP = ИмяВременногоКаталога + "ДоговорЮЛРесурсы.ZIP";
МакетРесурсы = ПолучитьМакет("МакетРесурсы");
МакетРесурсы.Записать(АдресФайлаСРесурсамиZIP);
ЧтениеZIP = Новый ЧтениеZipФайла(АдресФайлаСРесурсамиZIP);
ЧтениеZIP.ИзвлечьВсе(ИмяВременногоКаталога, РежимВосстановленияПутейФайловZIP.Восстанавливать);
УдалитьФайлы(АдресФайлаСРесурсамиZIP);
Возврат Макет;
КонецФункции
После этого сам шаблон документа DOCX в обработке печати не нужен. До оптимизации в среднем на формирование файла DOCX уходило 45 секунд, после оптимизации 15 секунд. Результатом максимально доволен, так как при отладке приходилось каждый раз ждать по минуте =)
И, приложенная к статье обработка, она делает первые три пункта, по указанному документу Word в каталоге создает два файла для двоичных данных макета.
Всем спасибо!
Проверено на следующих конфигурациях и релизах:
- Бухгалтерия предприятия, редакция 3.0, релизы 3.0.169.15, 3.0.168.25, 3.0.168.19