Подробно про криптографию и ЭП в решениях на 1С можно почитать тут, а про ЭП в 1С:ДО тут;
Начнем...
В момент подписания файла ЭП в 1С:ДО выполняется функция СформироватьШтампЭП общего модуля РаботаСКартинками. В функции СформироватьШтампЭП осуществляется заполнение макета изображения ЭП с помощью ImageMagick. Макет представляет из себя изображение 1210х310 пикселей следующего вида:
После вставки изображения ЭП в файл формата Docx изображение уменьшается до размера 37% от высоты и 39% от широты, но выглядит ЭП в файле великовато.
Решение в два шага:
1. На первом шаге необходимо создать собственное изображение ЭП и загрузить в 1С:ДО в качестве нового макета. В нашем случае это изображение 225х95 пикселей следующего вида:
Размер изображения изменился, а потому необходимо внести корректировки в функцию заполнения макета изображения ЭП.
Функция СформироватьШтампЭП после корректировок:
Функция СформироватьШтампЭП(ОписаниеЭП, Формат)
ФайлыКУдалению = Новый Массив;
МакетСертификат = ПолучитьОбщийМакет("Новый_ШаблонОтметкиЭП");
//МакетСертификат = ПолучитьОбщийМакет("ШаблонОтметкиЭП");
ПутьФайлаШаблона = ПолучитьИмяВременногоФайла(Формат);
МакетСертификат.Записать(ПутьФайлаШаблона);
ФайлыКУдалению.Добавить(ПутьФайлаШаблона);
ПараметрыDraw = Новый Массив;
ПараметрыDraw.Добавить(
СтрШаблон(
"text %1, %2 '%3'",
5,
50,
ОписаниеЭП.Номер));
ПараметрыDraw.Добавить(
СтрШаблон(
"text %1, %2 '%3'",
5,
70,
"Владелец: " + ОписаниеЭП.Владелец));
ПараметрыDraw.Добавить(
СтрШаблон(
"text %1, %2 '%3'",
5,
85,
"Дата подписания: " + ТекущаяДата()));
ПараметрыСоздания = Новый Массив;
ПараметрыСоздания.Добавить(
СтрШаблон("convert %1", ПутьФайлаШаблона));
ПараметрыСоздания.Добавить(
СтрШаблон(" -pointsize 9 -draw ""%1""",
СтрСоединить(ПараметрыDraw, " ")));
ПутьНовогоФайла = ПолучитьИмяВременногоФайла("PNG");
ПараметрыСоздания.Добавить(ПутьНовогоФайла);
ПараметрыImageMagick = СтрСоединить(ПараметрыСоздания, " ");
ЗапуститьImageMagick(ПараметрыImageMagick, ФайлыКУдалению);
Возврат ПутьНовогоФайла;
КонецФункции
Функция СформироватьШтампЭП(ОписаниеЭП, Формат)
ФайлыКУдалению = Новый Массив;
МакетСертификат = ПолучитьОбщийМакет("Новый_ШаблонОтметкиЭП");
//МакетСертификат = ПолучитьОбщийМакет("ШаблонОтметкиЭП");
ПутьФайлаШаблона = ПолучитьИмяВременногоФайла(Формат);
МакетСертификат.Записать(ПутьФайлаШаблона);
ФайлыКУдалению.Добавить(ПутьФайлаШаблона);
ПараметрыDraw = Новый Массив;
ПараметрыDraw.Добавить(
СтрШаблон(
"text %1, %2 '%3'",
5,
50,
ОписаниеЭП.Номер));
ПараметрыDraw.Добавить(
СтрШаблон(
"text %1, %2 '%3'",
5,
70,
"Владелец: " + ОписаниеЭП.Владелец));
ПараметрыDraw.Добавить(
СтрШаблон(
"text %1, %2 '%3'",
5,
85,
"Дата подписания: " + ТекущаяДата()));
ПараметрыСоздания = Новый Массив;
ПараметрыСоздания.Добавить(
СтрШаблон("convert %1", ПутьФайлаШаблона));
ПараметрыСоздания.Добавить(
СтрШаблон(" -pointsize 9 -draw ""%1""",
СтрСоединить(ПараметрыDraw, " ")));
ПутьНовогоФайла = ПолучитьИмяВременногоФайла("PNG");
ПараметрыСоздания.Добавить(ПутьНовогоФайла);
ПараметрыImageMagick = СтрСоединить(ПараметрыСоздания, " ");
ЗапуститьImageMagick(ПараметрыImageMagick, ФайлыКУдалению);
Возврат ПутьНовогоФайла;
КонецФункции
После вставки изображения ЭП в файл формата Docx изображение увеличивается до размера 119% от высоты и 212% от широты и выглядит ЭП в файле размыто. Результат не устраивает - переходим к следующему шагу.
2. На втором шаге необходимо внести корректировки в функцию ВставитьИзображениеЭПВФайлDocxСУказаниемПоложения (если вставка изображения ЭП осуществляется вместо тега ВставитьЭП, тогда необходимо вносить аналогичные корректировки в функцию ВставитьШтрихкодВместоТэгаВФайлDocx) общего модуля ВизуализацияЭПВызовСервера.
В функции ВставитьИзображениеЭПВФайлDocxСУказаниемПоложения осуществляется вставка изображения ЭП в файл Docx с помощью DrawingML. Шаблон вставки изображения в файл с указанием положения и размера хранится в макете ВставкаИзображенияЭПСУказаниемПоложенияDocx.
Вносим корректировки в макет ВставкаИзображенияЭПСУказаниемПоложенияDocx позволяющие задавать ширину вставки изображения ЭП в файл и осуществляем заполнение параметров скорректированного макета.
Макет ВставкаИзображенияЭПСУказаниемПоложенияDocx после корректировок:
<w:p w:rsidR="00C51609" w:rsidRPr="00C51609" w:rsidRDefault="00DB582B">
<w:r>
<w:drawing>
<wp:anchor distT="0" distB="0" distL="114300" distR="114300" simplePos="0" relativeHeight="251659264" behindDoc="0" locked="0" layoutInCell="1" allowOverlap="1">
<wp:simplePos x="0" y="0"/>
<wp:positionH relativeFrom="_ОтносительноЧегоСчитатьГоризонтальноеСмещение_">
_СмещениеПоГоризонтали_
</wp:positionH>
<wp:positionV relativeFrom="_ОтносительноЧегоСчитатьВертикальноеСмещение_">
_СмещениеПоВертикали_
</wp:positionV>
<wp:extent cx="_ШиринаШтрихкода_" cy="_ВысотаШтрихкода_"/>
<wp:effectExtent l="19050" t="0" r="0" b="0"/>
<wp:wrapNone/>
<wp:docPr id="2" name="Рисунок 1"/>
<wp:cNvGraphicFramePr>
<a:graphicFrameLocks xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" noChangeAspect="1"/>
</wp:cNvGraphicFramePr>
<a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
<a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:nvPicPr>
<pic:cNvPr id="0" name="Picture 1"/>
<pic:cNvPicPr>
<a:picLocks noChangeAspect="1" noChangeArrowheads="1"/>
</pic:cNvPicPr>
</pic:nvPicPr>
<pic:blipFill>
<a:blip r:embed="_ИДКартинкиВоВнутреннейПапке_"/>
<a:srcRect/>
<a:stretch>
<a:fillRect/>
</a:stretch>
</pic:blipFill>
<pic:spPr bwMode="auto">
<a:xfrm>
<a:off x="0" y="0"/>
<a:ext cx="_ШиринаШтрихкода_" cy="_ВысотаШтрихкода_"/>
</a:xfrm>
<a:prstGeom prst="rect">
<a:avLst/>
</a:prstGeom>
<a:noFill/>
<a:ln w="9525">
<a:noFill/>
<a:miter lim="800000"/>
<a:headEnd/>
<a:tailEnd/>
</a:ln>
</pic:spPr>
</pic:pic>
</a:graphicData>
</a:graphic>
</wp:anchor>
</w:drawing>
</w:r>
</w:p>
Функция ВставитьИзображениеЭПВФайлDocxСУказаниемПоложения после корректировок:
Функция АН_ВставитьИзображениеЭПВФайлDocxСУказаниемПоложения(Расширение, ТекстНадписи, ДвоичныеДанныеФайла, ДвоичныеДанныеКартинки, ПоложениеНаСтранице, ВысотаКартинки)
Если ДвоичныеДанныеФайла.Размер() = 0 Тогда
Возврат ДвоичныеДанныеФайла;
КонецЕсли;
СтарыйПутьКФайлу = ПолучитьИмяВременногоФайла(Расширение);
ДвоичныеДанныеФайла.Записать(СтарыйПутьКФайлу);
НовыйПутьКФайлу = ПолучитьИмяВременногоФайла(Расширение);
КопироватьФайл(СтарыйПутьКФайлу, СтрЗаменить(СтарыйПутьКФайлу, Расширение, "zip"));
ИмяФайлаСПутемZIP = СтрЗаменить(СтарыйПутьКФайлу, Расширение, "zip");
ВременнаяПапкаДляРазархивирования = ПолучитьИмяВременногоФайла("");
ВременныйZIPФайл = ПолучитьИмяВременногоФайла("zip");
Архив = Новый ЧтениеZipФайла();
Архив.Открыть(ИмяФайлаСПутемZIP);
Архив.ИзвлечьВсе(ВременнаяПапкаДляРазархивирования, РежимВосстановленияПутейФайловZIP.Восстанавливать);
Архив.Закрыть();
//Заполнение полей в теле документа
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.ОткрытьФайл(ВременнаяПапкаДляРазархивирования + "/word/document.xml");
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ВременнаяПапкаДляРазархивирования + "/word/document_update.xml");
ЗаписьXML.ЗаписатьОбъявлениеXML();
//получение макета для вставки регштампа
МакетДляВставки = ПолучитьОбщийМакет("Новый_ВставкаШтрихкодаСУказаниемПоложенияDocx");
//МакетДляВставки = ПолучитьОбщийМакет("ВставкаИзображенияЭПСУказаниемПоложенияDocx");
ТекстДляВставкиШтампа = МакетДляВставки.ПолучитьТекст();
//установка положения и прочих параметров
СмещениеПоГоризонтали = 0;
СмещениеПоВертикали = 0;
ГоризонтальноеВыравнивание = "";
ОтносительночегоСчитатьГоризонтальноеВыравнивание = "margin";
ВертикальноеВыравнивание = "";
ОтносительноЧегоСчитатьВертикальноеВыравнивание = "margin";
Если ЗначениеЗаполнено(ТекстНадписи) Тогда
ИмяКомпании = ТекстНадписи.НазваниеОрганизации;
РегистрационныйНомер = ТекстНадписи.РегНомер;
ДатаРегистрации = ТекстНадписи.Регдата;
КонецЕсли;
//Добавили
//{
ЧислоПодписей = ВысотаКартинки / 30;
ВысотаКартинки = ЧислоПодписей * 25.2;
//}
//Высота штрихкода в EMU (English Metrick Units)
ВысотаШтрихкода = (ВысотаКартинки / 25.4) * 914400;
//Добавили
//{
ШиринаШтрихкодаЗначение = 2142000;
//}
Если ПоложениеНаСтранице = ПредопределенноеЗначение("Перечисление.ВариантыПечатиШтампаЭП.ПравыйНижний") Тогда
СмещениеПоГоризонтали = "MAX";
СмещениеПоВертикали = "MAX";
ИначеЕсли ПоложениеНаСтранице = ПредопределенноеЗначение("Перечисление.ВариантыПечатиШтампаЭП.ПравыйВерхний") Тогда
СмещениеПоГоризонтали = "MAX";
СмещениеПоВертикали = "MIN";
ИначеЕсли ПоложениеНаСтранице = ПредопределенноеЗначение("Перечисление.ВариантыПечатиШтампаЭП.ЛевыйВерхний") Тогда
СмещениеПоГоризонтали = "MIN";
СмещениеПоВертикали = "MIN";
ИначеЕсли ПоложениеНаСтранице = ПредопределенноеЗначение("Перечисление.ВариантыПечатиШтампаЭП.ЛевыйНижний") Тогда
СмещениеПоГоризонтали = "MIN";
СмещениеПоВертикали = "MAX";
КонецЕсли;
Если ЗначениеЗаполнено(ТекстНадписи) Тогда
Если СмещениеПоГоризонтали = "MAX" Тогда
//выравнивание к правому краю
ГоризонтальноеВыравнивание = "mso-position-horizontal:right";
ИначеЕсли СмещениеПоГоризонтали = "MIN" Тогда
//выравнивание к левому краю
ГоризонтальноеВыравнивание = "mso-position-horizontal:left";
Иначе
////если задано произвольное расположение, то переведем смещение по горизонтали из миллиметров в Point'ы
////1 д = 1/72"
//ОтносительночегоСчитатьГоризонтальноеВыравнивание = "page";
//СмещениеПоГоризонтали = (ДанныеОПоложении.СмещениеПоГоризонтали / 25.4) * 72;
КонецЕсли;
Если СмещениеПоВертикали = "MAX" Тогда
//выравнивание по нижнему краю
ВертикальноеВыравнивание = "mso-position-vertical:bottom";
ИначеЕсли СмещениеПоВертикали = "MIN" Тогда
//выравнивание по верхнему краю
ВертикальноеВыравнивание = "mso-position-vertical:top";
Иначе
////если задано произвольное расположение, то переведем смещение по горизонтали из миллиметров в Point'ы
//ОтносительноЧегоСчитатьВертикальноеВыравнивание = "page";
//СмещениеПоВертикали =(ДанныеОПоложении.СмещениеПоВертикали / 25.4) * 72;
КонецЕсли;
ТекстДляВставкиШтампа = СтрЗаменить(ТекстДляВставкиШтампа, "_СмещениеПоГоризонтали_", Формат(СмещениеПоГоризонтали,"ЧДЦ=0; ЧГ=0") + "pt");
ТекстДляВставкиШтампа = СтрЗаменить(ТекстДляВставкиШтампа, "_СмещениеПоВертикали_", Формат(СмещениеПоВертикали,"ЧДЦ=0; ЧГ=0") + "pt");
ТекстДляВставкиШтампа = СтрЗаменить(ТекстДляВставкиШтампа, "_ГоризонтальноеВыравнивание_", ГоризонтальноеВыравнивание);
ТекстДляВставкиШтампа = СтрЗаменить(ТекстДляВставкиШтампа, "_ВертикальноеВыравнивание_", ВертикальноеВыравнивание);
Иначе
Если СмещениеПоГоризонтали = "MAX" Тогда
//выравнивание к правому краю
СмещениеПоГоризонтали = "<wp:align>right</wp:align>";
ИначеЕсли СмещениеПоГоризонтали = "MIN" Тогда
//выравнивание к левому краю
СмещениеПоГоризонтали = "<wp:align>left</wp:align>";
Иначе
////если задано произвольное расположение, то переведем смещение по горизонтали из миллиметров в EMU
////1 д = 1/72"
//ОтносительночегоСчитатьГоризонтальноеВыравнивание = "page";
//СмещениеПоГоризонталиЗначение = (ДанныеОПоложении.СмещениеПоГоризонтали / 25.4) * 914400;
//СмещениеПоГоризонтали = "<wp:posOffset>" + Формат(СмещениеПоГоризонталиЗначение,"ЧДЦ=0; ЧГ=0") + "</wp:posOffset>";
КонецЕсли;
Если СмещениеПоВертикали = "MAX" Тогда
//выравнивание по нижнему краю
СмещениеПоВертикали = "<wp:align>bottom</wp:align>";
ИначеЕсли СмещениеПоВертикали = "MIN" Тогда
//выравнивание по верхнему краю
СмещениеПоВертикали = "<wp:align>top</wp:align>";
Иначе
////если задано произвольное расположение, то переведем смещение по горизонтали из миллиметров в EMU
//ОтносительноЧегоСчитатьВертикальноеВыравнивание = "page";
//СмещениеПоВертикалиЗначение =(ДанныеОПоложении.СмещениеПоВертикали / 25.4) * 914400;
//СмещениеПоВертикали = "<wp:posOffset>" + Формат(СмещениеПоВертикалиЗначение,"ЧДЦ=0; ЧГ=0") + "</wp:posOffset>";
КонецЕсли;
ТекстДляВставкиШтампа = СтрЗаменить(ТекстДляВставкиШтампа, "_СмещениеПоГоризонтали_", Формат(СмещениеПоГоризонтали,"ЧДЦ=0; ЧГ=0"));
ТекстДляВставкиШтампа = СтрЗаменить(ТекстДляВставкиШтампа, "_СмещениеПоВертикали_", Формат(СмещениеПоВертикали,"ЧДЦ=0; ЧГ=0"));
КонецЕсли;
ТекстДляВставкиШтампа = СтрЗаменить(ТекстДляВставкиШтампа, "_ОтносительноЧегоСчитатьВертикальноеСмещение_", ОтносительноЧегоСчитатьВертикальноеВыравнивание);
ТекстДляВставкиШтампа = СтрЗаменить(ТекстДляВставкиШтампа, "_ОтносительноЧегоСчитатьГоризонтальноеСмещение_", ОтносительночегоСчитатьГоризонтальноеВыравнивание);
ИДкартинки = 0;
СчетчикСвязей = 0;
СохранитьИзображениеВоВнутреннейСтруктуреDocx(ВременнаяПапкаДляРазархивирования, ДвоичныеДанныеКартинки, ИДкартинки, СчетчикСвязей);
ТекстДляВставкиШтампа = СтрЗаменить(ТекстДляВставкиШтампа, "_ИДКартинкиВоВнутреннейПапке_", "rId" + Строка(СчетчикСвязей + 1));
ТекстДляВставкиШтампа = СтрЗаменить(ТекстДляВставкиШтампа, "_ВысотаШтрихкода_", Формат(ВысотаШтрихкода,"ЧДЦ=0; ЧГ=0"));
//Добавили
//{
ТекстДляВставкиШтампа = СтрЗаменить(ТекстДляВставкиШтампа, "_ШиринаШтрихкода_", Формат(ШиринаШтрихкодаЗначение,"ЧДЦ=0; ЧГ=0"));
//}
// Обязательно нужно ставить Ложь, иначе будут пропадать пробелы
ЧтениеXML.ИгнорироватьПробелы = Ложь;
//вставка разметки для регштампа в файл
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ВставитьШтамп = Ложь;
Если ЧтениеXML.Имя = "w:body" Тогда
ВставитьШтамп = Истина;
КонецЕсли;
ЗаписьXML.ЗаписатьНачалоЭлемента(ЧтениеXML.Имя);
Пока ЧтениеXML.ПрочитатьАтрибут() Цикл
ЗаписьXML.ЗаписатьАтрибут(ЧтениеXML.Имя,ЧтениеXML.Значение);
КонецЦикла;
Если ВставитьШтамп Тогда
ЗаписьXML.ЗаписатьБезОбработки(ТекстДляВставкиШтампа);
ВставитьШтамп = Ложь;
КонецЕсли;
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
ЗаписьXML.ЗаписатьТекст(ЧтениеXML.Значение);
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
КонецЦикла;
ЧтениеXML.Закрыть();
ЗаписьXML.Закрыть();
АвтозаполнениеШаблоновФайловКлиентСервер.ЗаменитьПространствоИменR(
ВременнаяПапкаДляРазархивирования + "/word/document_update.xml");
ПереместитьФайл(ВременнаяПапкаДляРазархивирования + "/word/document_update.xml", ВременнаяПапкаДляРазархивирования + "/word/document.xml");
УдалитьФайлы(ВременнаяПапкаДляРазархивирования + "/word/document_update.xml");
Архиватор = Новый ЗаписьZipФайла(ВременныйZIPФайл, "", "");
Архиватор.Добавить(ВременнаяПапкаДляРазархивирования + "\*.*", РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);
Архиватор.Записать();
ПереместитьФайл(ВременныйZIPФайл, НовыйПутьКФайлу);
УдалитьФайлы(ВременнаяПапкаДляРазархивирования);
УдалитьФайлы(СтарыйПутьКФайлу);
УдалитьФайлы(ВременныйZIPФайл);
ДвоичныеДанныеЗаполненногоФайла = Новый ДвоичныеДанные(НовыйПутьКФайлу);
УдалитьФайлы(НовыйПутьКФайлу);
Возврат ДвоичныеДанныеЗаполненногоФайла;
КонецФункции
Функция АН_ВставитьИзображениеЭПВФайлDocxСУказаниемПоложения(Расширение, ТекстНадписи, ДвоичныеДанныеФайла, ДвоичныеДанныеКартинки, ПоложениеНаСтранице, ВысотаКартинки)
Если ДвоичныеДанныеФайла.Размер() = 0 Тогда
Возврат ДвоичныеДанныеФайла;
КонецЕсли;
СтарыйПутьКФайлу = ПолучитьИмяВременногоФайла(Расширение);
ДвоичныеДанныеФайла.Записать(СтарыйПутьКФайлу);
НовыйПутьКФайлу = ПолучитьИмяВременногоФайла(Расширение);
КопироватьФайл(СтарыйПутьКФайлу, СтрЗаменить(СтарыйПутьКФайлу, Расширение, "zip"));
ИмяФайлаСПутемZIP = СтрЗаменить(СтарыйПутьКФайлу, Расширение, "zip");
ВременнаяПапкаДляРазархивирования = ПолучитьИмяВременногоФайла("");
ВременныйZIPФайл = ПолучитьИмяВременногоФайла("zip");
Архив = Новый ЧтениеZipФайла();
Архив.Открыть(ИмяФайлаСПутемZIP);
Архив.ИзвлечьВсе(ВременнаяПапкаДляРазархивирования, РежимВосстановленияПутейФайловZIP.Восстанавливать);
Архив.Закрыть();
//Заполнение полей в теле документа
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.ОткрытьФайл(ВременнаяПапкаДляРазархивирования + "/word/document.xml");
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ВременнаяПапкаДляРазархивирования + "/word/document_update.xml");
ЗаписьXML.ЗаписатьОбъявлениеXML();
//получение макета для вставки регштампа
МакетДляВставки = ПолучитьОбщийМакет("Новый_ВставкаШтрихкодаСУказаниемПоложенияDocx");
//МакетДляВставки = ПолучитьОбщийМакет("ВставкаИзображенияЭПСУказаниемПоложенияDocx");
ТекстДляВставкиШтампа = МакетДляВставки.ПолучитьТекст();
//установка положения и прочих параметров
СмещениеПоГоризонтали = 0;
СмещениеПоВертикали = 0;
ГоризонтальноеВыравнивание = "";
ОтносительночегоСчитатьГоризонтальноеВыравнивание = "margin";
ВертикальноеВыравнивание = "";
ОтносительноЧегоСчитатьВертикальноеВыравнивание = "margin";
Если ЗначениеЗаполнено(ТекстНадписи) Тогда
ИмяКомпании = ТекстНадписи.НазваниеОрганизации;
РегистрационныйНомер = ТекстНадписи.РегНомер;
ДатаРегистрации = ТекстНадписи.Регдата;
КонецЕсли;
//Добавили
//{
ЧислоПодписей = ВысотаКартинки / 30;
ВысотаКартинки = ЧислоПодписей * 25.2;
//}
//Высота штрихкода в EMU (English Metrick Units)
ВысотаШтрихкода = (ВысотаКартинки / 25.4) * 914400;
//Добавили
//{
ШиринаШтрихкодаЗначение = 2142000;
//}
Если ПоложениеНаСтранице = ПредопределенноеЗначение("Перечисление.ВариантыПечатиШтампаЭП.ПравыйНижний") Тогда
СмещениеПоГоризонтали = "MAX";
СмещениеПоВертикали = "MAX";
ИначеЕсли ПоложениеНаСтранице = ПредопределенноеЗначение("Перечисление.ВариантыПечатиШтампаЭП.ПравыйВерхний") Тогда
СмещениеПоГоризонтали = "MAX";
СмещениеПоВертикали = "MIN";
ИначеЕсли ПоложениеНаСтранице = ПредопределенноеЗначение("Перечисление.ВариантыПечатиШтампаЭП.ЛевыйВерхний") Тогда
СмещениеПоГоризонтали = "MIN";
СмещениеПоВертикали = "MIN";
ИначеЕсли ПоложениеНаСтранице = ПредопределенноеЗначение("Перечисление.ВариантыПечатиШтампаЭП.ЛевыйНижний") Тогда
СмещениеПоГоризонтали = "MIN";
СмещениеПоВертикали = "MAX";
КонецЕсли;
Если ЗначениеЗаполнено(ТекстНадписи) Тогда
Если СмещениеПоГоризонтали = "MAX" Тогда
//выравнивание к правому краю
ГоризонтальноеВыравнивание = "mso-position-horizontal:right";
ИначеЕсли СмещениеПоГоризонтали = "MIN" Тогда
//выравнивание к левому краю
ГоризонтальноеВыравнивание = "mso-position-horizontal:left";
Иначе
////если задано произвольное расположение, то переведем смещение по горизонтали из миллиметров в Point'ы
////1 д = 1/72"
//ОтносительночегоСчитатьГоризонтальноеВыравнивание = "page";
//СмещениеПоГоризонтали = (ДанныеОПоложении.СмещениеПоГоризонтали / 25.4) * 72;
КонецЕсли;
Если СмещениеПоВертикали = "MAX" Тогда
//выравнивание по нижнему краю
ВертикальноеВыравнивание = "mso-position-vertical:bottom";
ИначеЕсли СмещениеПоВертикали = "MIN" Тогда
//выравнивание по верхнему краю
ВертикальноеВыравнивание = "mso-position-vertical:top";
Иначе
////если задано произвольное расположение, то переведем смещение по горизонтали из миллиметров в Point'ы
//ОтносительноЧегоСчитатьВертикальноеВыравнивание = "page";
//СмещениеПоВертикали =(ДанныеОПоложении.СмещениеПоВертикали / 25.4) * 72;
КонецЕсли;
ТекстДляВставкиШтампа = СтрЗаменить(ТекстДляВставкиШтампа, "_СмещениеПоГоризонтали_", Формат(СмещениеПоГоризонтали,"ЧДЦ=0; ЧГ=0") + "pt");
ТекстДляВставкиШтампа = СтрЗаменить(ТекстДляВставкиШтампа, "_СмещениеПоВертикали_", Формат(СмещениеПоВертикали,"ЧДЦ=0; ЧГ=0") + "pt");
ТекстДляВставкиШтампа = СтрЗаменить(ТекстДляВставкиШтампа, "_ГоризонтальноеВыравнивание_", ГоризонтальноеВыравнивание);
ТекстДляВставкиШтампа = СтрЗаменить(ТекстДляВставкиШтампа, "_ВертикальноеВыравнивание_", ВертикальноеВыравнивание);
Иначе
Если СмещениеПоГоризонтали = "MAX" Тогда
//выравнивание к правому краю
СмещениеПоГоризонтали = "<wp:align>right</wp:align>";
ИначеЕсли СмещениеПоГоризонтали = "MIN" Тогда
//выравнивание к левому краю
СмещениеПоГоризонтали = "<wp:align>left</wp:align>";
Иначе
////если задано произвольное расположение, то переведем смещение по горизонтали из миллиметров в EMU
////1 д = 1/72"
//ОтносительночегоСчитатьГоризонтальноеВыравнивание = "page";
//СмещениеПоГоризонталиЗначение = (ДанныеОПоложении.СмещениеПоГоризонтали / 25.4) * 914400;
//СмещениеПоГоризонтали = "<wp:posOffset>" + Формат(СмещениеПоГоризонталиЗначение,"ЧДЦ=0; ЧГ=0") + "</wp:posOffset>";
КонецЕсли;
Если СмещениеПоВертикали = "MAX" Тогда
//выравнивание по нижнему краю
СмещениеПоВертикали = "<wp:align>bottom</wp:align>";
ИначеЕсли СмещениеПоВертикали = "MIN" Тогда
//выравнивание по верхнему краю
СмещениеПоВертикали = "<wp:align>top</wp:align>";
Иначе
////если задано произвольное расположение, то переведем смещение по горизонтали из миллиметров в EMU
//ОтносительноЧегоСчитатьВертикальноеВыравнивание = "page";
//СмещениеПоВертикалиЗначение =(ДанныеОПоложении.СмещениеПоВертикали / 25.4) * 914400;
//СмещениеПоВертикали = "<wp:posOffset>" + Формат(СмещениеПоВертикалиЗначение,"ЧДЦ=0; ЧГ=0") + "</wp:posOffset>";
КонецЕсли;
ТекстДляВставкиШтампа = СтрЗаменить(ТекстДляВставкиШтампа, "_СмещениеПоГоризонтали_", Формат(СмещениеПоГоризонтали,"ЧДЦ=0; ЧГ=0"));
ТекстДляВставкиШтампа = СтрЗаменить(ТекстДляВставкиШтампа, "_СмещениеПоВертикали_", Формат(СмещениеПоВертикали,"ЧДЦ=0; ЧГ=0"));
КонецЕсли;
ТекстДляВставкиШтампа = СтрЗаменить(ТекстДляВставкиШтампа, "_ОтносительноЧегоСчитатьВертикальноеСмещение_", ОтносительноЧегоСчитатьВертикальноеВыравнивание);
ТекстДляВставкиШтампа = СтрЗаменить(ТекстДляВставкиШтампа, "_ОтносительноЧегоСчитатьГоризонтальноеСмещение_", ОтносительночегоСчитатьГоризонтальноеВыравнивание);
ИДкартинки = 0;
СчетчикСвязей = 0;
СохранитьИзображениеВоВнутреннейСтруктуреDocx(ВременнаяПапкаДляРазархивирования, ДвоичныеДанныеКартинки, ИДкартинки, СчетчикСвязей);
ТекстДляВставкиШтампа = СтрЗаменить(ТекстДляВставкиШтампа, "_ИДКартинкиВоВнутреннейПапке_", "rId" + Строка(СчетчикСвязей + 1));
ТекстДляВставкиШтампа = СтрЗаменить(ТекстДляВставкиШтампа, "_ВысотаШтрихкода_", Формат(ВысотаШтрихкода,"ЧДЦ=0; ЧГ=0"));
//Добавили
//{
ТекстДляВставкиШтампа = СтрЗаменить(ТекстДляВставкиШтампа, "_ШиринаШтрихкода_", Формат(ШиринаШтрихкодаЗначение,"ЧДЦ=0; ЧГ=0"));
//}
// Обязательно нужно ставить Ложь, иначе будут пропадать пробелы
ЧтениеXML.ИгнорироватьПробелы = Ложь;
//вставка разметки для регштампа в файл
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ВставитьШтамп = Ложь;
Если ЧтениеXML.Имя = "w:body" Тогда
ВставитьШтамп = Истина;
КонецЕсли;
ЗаписьXML.ЗаписатьНачалоЭлемента(ЧтениеXML.Имя);
Пока ЧтениеXML.ПрочитатьАтрибут() Цикл
ЗаписьXML.ЗаписатьАтрибут(ЧтениеXML.Имя,ЧтениеXML.Значение);
КонецЦикла;
Если ВставитьШтамп Тогда
ЗаписьXML.ЗаписатьБезОбработки(ТекстДляВставкиШтампа);
ВставитьШтамп = Ложь;
КонецЕсли;
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
ЗаписьXML.ЗаписатьТекст(ЧтениеXML.Значение);
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
КонецЦикла;
ЧтениеXML.Закрыть();
ЗаписьXML.Закрыть();
АвтозаполнениеШаблоновФайловКлиентСервер.ЗаменитьПространствоИменR(
ВременнаяПапкаДляРазархивирования + "/word/document_update.xml");
ПереместитьФайл(ВременнаяПапкаДляРазархивирования + "/word/document_update.xml", ВременнаяПапкаДляРазархивирования + "/word/document.xml");
УдалитьФайлы(ВременнаяПапкаДляРазархивирования + "/word/document_update.xml");
Архиватор = Новый ЗаписьZipФайла(ВременныйZIPФайл, "", "");
Архиватор.Добавить(ВременнаяПапкаДляРазархивирования + "\*.*", РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);
Архиватор.Записать();
ПереместитьФайл(ВременныйZIPФайл, НовыйПутьКФайлу);
УдалитьФайлы(ВременнаяПапкаДляРазархивирования);
УдалитьФайлы(СтарыйПутьКФайлу);
УдалитьФайлы(ВременныйZIPФайл);
ДвоичныеДанныеЗаполненногоФайла = Новый ДвоичныеДанные(НовыйПутьКФайлу);
УдалитьФайлы(НовыйПутьКФайлу);
Возврат ДвоичныеДанныеЗаполненногоФайла;
КонецФункции
После вставки изображения ЭП в файл формата Docx изображение имеет размер 225х95 пикселей - результат устраивает.
Корректировки описанные в данной статье можно вынести в расширение.
Проверено на релизе 2.1.29.18.