Для опытных коллег изложу суть вкратце, чтобы не тратить много времени на прочтение, но прочтя, впоследствии не тратить его на поиски, если встретится подобная задача, а использовать это решение. Вниманию тех, кто пожелает разобраться подробнее, предлагается приложенная обработка с комментариями в коде, которую можно использовать в качестве модели.
Общая идея в том, чтобы сформировать файл макета в виде временного файла с соответствующим расширением, получить данные для печати с сервера, запустить Word через COM-соединение и вставлять временный файл в документ Word столько раз, сколько документов (или других объектов 1С) имеется в данных для печати, заполняя каждый вставленный макет данными соответствующего документа по следующему алгоритму:
Далее продолжу для тех, кому небезынтересны детали.
У решаемой задачи есть две особенности. Первая состоит в том, что макет находится на сервере, а печать происходит на клиенте. Это не является проблемой, решение давно известно – передача макета в виде двоичных данных через временное хранилище. В связи с этим макет Word стоит сохранять сразу в виде двоичных данных, а не как Active Document. Во втором случае потребуется дополнительное его преобразование в двоичные данные. После передачи на клиент двоичные данные преобразуются во временный файл с расширением docx. Кстати, тем же способом можно работать и с другим приложением MS Office. Вторая - макет нужно заполнять данными разных объектов.
Чтобы расширить рамки задачи от конкретной печатной формы до методики мне показалось логичным представить содержимое макета в виде набора заполняемых данными объектов Word - параметров. В моём случае – это закладки, замены и таблицы:
Под закладками и заменами понимаются 2 основных метода, используемых для заполнения шаблонов Word – вставка текста в местах закладок и замена предварительно подготовленных шаблонов текстов. Для заполнения таблицы нужно создать их в макете, добавив первые строки с заголовками колонок.
Параметры нужно разместить в теле макета так, чтобы при печати он принимал нужный вид:
Для работы с параметрами Word требуется получить данные объектов 1С в удобном для последующей обработки виде. Этот вид сложился в 3х уровневую модель:
каждый уровень которой представляет собой набор параметров Word и данных 1С. Набор параметров на любом уровне может быть расширен по сравнению с приведённым в обработке, в зависимости от опыта работы с Word и решаемой задачи. Например, для вставки картинок.
1 уровень – макет. Параметры воздействуют на весь документ целиком. Я добавил «Разделитель» для управления выводом печатных форм объектов 1С, каждый на своей странице или с новой строки. Но задачи могут быть поставлены по-разному. Например, один объект таким шрифтом, другой другим и т.п. В зависимости от задачи набор параметров может быть расширен. У меня также добавлен параметр «Метод», который определяет задействованный для установки текста закладок метод Word. По той причине, что более оптимальный метод “Range” не срабатывает в случае, если закладка занимает первую позицию в документе Word.
2 уровень – объект, данные его шапки. У меня здесь параметров нет, только данные в виде массивов структур вида {«Имя», «Текст»} для закладок, {«Поиск», «Замена»} для замен. Для таблиц структур недостаточно, так как неизвестны ни количество колонок произвольной таблицы макета, ни количество её строк. Данные таблиц представляются в виде двумерных массивов, в первом измерении которых строки таблиц, во втором – значения колонок. Порядок таблиц должен совпадать с порядком их расположения в макете. На уровне объекта используется структура вида {«Таблицы»}, значением которой является массив таблиц. При печати проверяется соответствие количества элементов массива – табличный частей объекта 1С – количеству таблиц макета.
3 уровень – табличные части объекта или произвольно сформированные таблицы, соответствующие таблицам макета. В Word таблица - это отдельный объект со своим форматированием. На этом уровне я добавил параметр «Формат» - массив с числом элементов = числу колонок таблицы, который содержит числовые значения констант Word для выравнивания содержимого ячеек по горизонтали, поскольку числа принято выравнивать по правому краю, текст – по левому или по центру. Значения форматов колонок задаются в коде той же функции - ПолучитьДанныеДокументов() – в которой заполняются и остальные данные.
На последнем этапе переноса данных из сформированной структуры в документ Word особых сложностей нет. Разве что нужно учесть упомянутую выше некорректность метода “Range” при размещении закладки в начале документа. Проверяется корректность полученной структуры, добавляется документ Word, считываются параметры верхнего уровня, запускаются соответствующие методы Word или устанавливаются значения констант, вставляется пустой макет из временного файла, далее цикл по объектам 1С, формирование печатного документа в результате обработки закладок, замен, цикл по таблицам, заполнение ячеек в соответствии с форматами выравнивания.
Закладки в документе печати, после заполнения макета, не удаляются автоматически. Встречались обратные утверждения, оспаривать не буду, возможно, дело в особенностях версии Word. Чтобы избежать некорректности, после заполнения пустого шаблона данными очередного объекта 1С, закладки из документа печати удаляются с тем, чтобы после добавления очередного файла макета их позиция однозначно определяла местоположение вставки текста.
Форма обработки имитирует данные документа 1С с табличными частями, которые собираются в соответствующие структуры и массивы согласно уровням модели в функции ПолучитьДанныеДокументов, принимающей массив объектов печати в качестве параметра. То есть так, как это и происходит в параметризуемой команде конфигурации. Сами данные обрабатываются в клиентской процедуре ПечатьДокументов(). В форме также задаются параметры верхнего уровня модели – Метод и Разделитель.
Макет расположен в макетах обработки. Он содержит следующие закладки:
Другие параметры макета:
{Адрес поставщика} и {Адрес организации} - тексты замен, таблицы заданы строкой с наименованиями колонок.
Результат выполнения кода обработки с некоторыми значениями параметров, задаваемых в форме обработки, будет следующим:
Обработка приложена в виде внешней. Встраиваемой её не делал, потому что она не предназначена для пользователей. Работа обработки проверена на платформе 8.3.20.1674, в конфигурации БП, но в принципе, конфигурация значения не имеет.
На этом всё. Надеюсь, что изложенное в статье решение пригодится сообществу. Всем удачи!