При разработке внешних печатных форм (ВПФ) с использованием Библиотеки стандартных подсистем (БСП) программисты часто сталкиваются с ситуацией, когда макет MS Word (docx) заполняется некорректно или на выходе получается пустой документ. Несмотря на то, что код кажется верным, а макет визуально содержит все необходимые теги, система «не видит» области или параметры. Разберем по шагам, почему это происходит и как правильно подготовить шаблон и код для стабильной работы.
Основная проблема при работе с шаблонами MS Word заключается в том, что формат .docx представляет собой ZIP-архив, внутри которого находятся XML-файлы. Когда мы пишем в документе тег области, например, {v8 Область.Заголовок}, мы ожидаем, что БСП найдет эту строку поиском. Однако текстовые редакторы (MS Word разных версий) часто вставляют служебные XML-теги прямо внутрь вашего параметра.
Проанализируем ситуацию: вы написали текст, случайно допустили опечатку, удалили букву и дописали её снова. Визуально слово выглядит целым, но внутри XML-структуры оно может быть разбито тегами проверки орфографии или изменения шрифта. Выглядит это примерно так: {v8 <w:t>Область.</w:t><w:proofErr/>Заголовок}. Механизм БСП ищет точное вхождение строки, и, разумеется, не находит его из-за «мусора» внутри тега.
Важный момент: Как отметил автор темы, при копировании текста в Word 2010 и выше, вокруг вставленного фрагмента могут автоматически появляться лишние пробелы. Если в коде 1С область определена как "Документ", а в ворде написано {v8 Область.Документ } (с пробелом перед закрывающей скобкой), поиск не даст результата.
Чтобы гарантировать, что 1С правильно прочитает области и параметры, выполним следующие действия:
{v8 Область.ИмяОбласти}, вырежем его (Ctrl+X), вставим в обычный текстовый «Блокнот» (Notepad), затем скопируем из Блокнота обратно в Word. Это полностью очистит строку от внутренних XML-тегов форматирования.Рассмотрим, как правильно организовать получение макета, если он хранится как двоичные данные во внешней обработке. В модуле объекта ВПФ процедура печати должна корректно обращаться к макету. Посмотрим на пример кода:
Функция СформироватьПечатнуюФорму(СсылкаНаОбъект, ОбъектыПечати)
// Получаем макет из двоичных данных внешней обработки
ЭтотОбъект = РеквизитФормыВЗначение("Объект"); // Если вызов из формы
// Или напрямую, если работаем в модуле объекта:
МакетДвоичныеДанные = УправлениеПечатью.МакетПечатнойФормы("ВнешняяОбработка.ИмяВашейОбработки.МакетWord");
// Если макет хранится просто в макетах обработки:
Макет = ПолучитьМакет("Макет");
// Создаем структуру для хранения данных
ДанныеДляПечати = Новый Структура;
// Заполняем параметры...
// Вызываем механизм БСП для формирования документа
// Важно: БСП ожидает макет в определенном формате
КонецФункции
Если вы используете общие методы БСП типа УправлениеПечатьюMSWord.СформироватьДокументПоШаблону, убедитесь, что структура параметров в точности совпадает с именами в макете. Регистр имен (Большие или маленькие буквы) в параметрах типа [ДатаДокумента] крайне важен.
В отличие от Excel, где области определяются именованными диапазонами, в Word БСП ищет текстовые маркеры начала и конца. Рассмотрим правила их расстановки:
{v8 Область.ИмяОбласти}{/v8 Область.ИмяОбласти}Особенности позиционирования:
Если вам нужно вывести повторяющуюся строку таблицы, маркеры должны стоять внутри ячеек. Если вы хотите вывести целый блок текста, маркеры лучше ставить на отдельных строках до и после блока. Проанализируем типичную ошибку: если поставить теги начала и конца в одну строку с текстом, БСП может «съесть» разрывы абзацев при выводе нескольких таких областей подряд.
Если файл все равно пустой, выясним причину с помощью отладчика. Нам нужно найти место, где БСП парсит файл шаблона. Рассмотрим алгоритм действий:
УправлениеПечатьюMSWord (или аналогичном в вашей версии БСП, например, УправлениеПечатьюMSWordКлиентСервер) в процедуре, которая занимается поиском тегов (обычно это функции, работающие с XML-структурой документа)..docx, так как это бинарный архив. Чтобы проверить его содержимое вручную, можно сохранить его с расширением .zip и зайти внутрь, открыв файл word/document.xml. Там вы увидите реальную картину того, как Word «разрезал» ваши теги.Посмотрим на ситуацию со стороны сервера. Современная БСП старается работать с Word-файлами без использования COM-соединения (без вызова Word.Application), напрямую манипулируя XML. Это позволяет печатать документы даже там, где MS Office не установлен на сервере.
Однако, если ваша конфигурация старая и использует COM, убедитесь, что:
DCOM позволяет взаимодействие с Office.Если эти условия не соблюдены, 1С может молча создать пустой файл или выдать ошибку инициализации, которую механизм печати перехватит и не покажет пользователю явно, выдав в итоге пустой результат.
Подведем итог: В большинстве случаев проблема «пустого ворда» в БСП решается простой перепечаткой тегов областей вручную (без копипаста) и включением отображения скрытых символов для удаления лишних пробелов. Всегда проверяйте соответствие имен параметров в коде и в шаблоне, включая регистр символов.