Добрый день.
Надеюсь, что данная мини-статья поможет кому-то сэкономить время, если будете решать похожую задачу. Похожих статей или готового решения не нашел.
Версия платформы: 8.3.19.1264
Версия 1С Документооборот: 2.1.28.14
1С Документооборот умеет вставлять штрихкод в MS WORD только на первую страницу. Поставили задачу, чтобы можно было вставлять штрихкод на каждую страницу. Предполагал изначально решать задачу через вставку в колонтитул MS WORD, но разбирая типовой код обнаружил, что работа с WORD идет через xml.
Если кратко, то логика в типовом решении следующая:
1. У файла меняется расширение на zip
2. Распаковывается
3. Находится xml файл "document.xml"
4. В самое начало файла в узел "w:body" идет вставка своего куска xml из общего макета конфигурации
5. Запаковывается обратно и сохраняется
Основная сложность была в определении следующей страницы. Долго погуглив нашел следующее решение:
Есть тэг "w:lastRenderedPageBreak", который указывает на конец текущей страницы. Соответственно нам нужно делать доп вставку в следующий общий тэг
Типовой кусок кода, в котором происходит вставка:
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ВставитьШтамп = Ложь;
Если ЧтениеXML.Имя = "w:body" Тогда
ВставитьШтамп = Истина;
КонецЕсли;
ЗаписьXML.ЗаписатьНачалоЭлемента(ЧтениеXML.Имя);
Пока ЧтениеXML.ПрочитатьАтрибут() Цикл
ЗаписьXML.ЗаписатьАтрибут(ЧтениеXML.Имя,ЧтениеXML.Значение);
КонецЦикла;
Если ВставитьШтамп Тогда
ЗаписьXML.ЗаписатьБезОбработки(ТекстДляВставкиШтампа);
ВставитьШтамп = Ложь;
КонецЕсли;
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
ЗаписьXML.ЗаписатьТекст(ЧтениеXML.Значение);
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
КонецЦикла;
Изменения, которые внес:
//ГК++ изменения связанные со вставкой ШК на каждой странице
//конец текущей страницы определяется по тегу w:lastRenderedPageBreak
ВставитьШтампСледТег = Ложь;
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ВставитьШтамп = Ложь;
Если ЧтениеXML.Имя = "w:body" Тогда
ВставитьШтамп = Истина;
КонецЕсли;
//ГК++
Если ЧтениеXML.Имя = "w:lastRenderedPageBreak" Тогда
ВставитьШтампСледТег = Истина;
КонецЕсли;
//ГК--
ЗаписьXML.ЗаписатьНачалоЭлемента(ЧтениеXML.Имя);
Пока ЧтениеXML.ПрочитатьАтрибут() Цикл
ЗаписьXML.ЗаписатьАтрибут(ЧтениеXML.Имя,ЧтениеXML.Значение);
КонецЦикла;
Если ВставитьШтамп Тогда
ЗаписьXML.ЗаписатьБезОбработки(ТекстДляВставкиШтампа);
ВставитьШтамп = Ложь;
КонецЕсли;
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
ЗаписьXML.ЗаписатьТекст(ЧтениеXML.Значение);
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
ЗаписьXML.ЗаписатьКонецЭлемента();
//ГК++
Если ЧтениеXML.Имя = "w:p" И ВставитьШтампСледТег Тогда
ЗаписьXML.ЗаписатьБезОбработки(ТекстДляВставкиШтампа);
ВставитьШтампСледТег = Ложь;
КонецЕсли;
//ГК--
КонецЕсли;
КонецЦикла;
Сейчас данный код ориентируется на вставку после тэга "w:p", это только текст. Если есть таблицы или в начале страницы таблица, нужно учитывать тэг <tr>.
Надеюсь, кому-то будет полезна данная мини-статья.