Каталог решений - Вставка штрихкода на каждую страницу MS WORD для 1С: Документооборот

Вставка штрихкода на каждую страницу MS WORD для 1С: Документооборот

Вставка штрихкода на каждую страницу MS WORD для 1С: Документооборот

В наличии

Пример реализации вставки штрихкода в MS WORD на каждую страницу 1С: Документооборот.

Категория:

Описание

Добрый день.

Надеюсь, что данная мини-статья поможет кому-то сэкономить время, если будете решать похожую задачу. Похожих статей или готового решения не нашел.

Версия платформы: 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>.

Надеюсь, кому-то будет полезна данная мини-статья.

has been added to your cart:
Оформление заказа