Мы часто сталкиваемся с необходимостью формировать документы в формате Microsoft Word, используя данные из 1С. Это могут быть договоры, акты, письма или любые другие документы, требующие сложного форматирования, которое трудно реализовать средствами табличных документов 1С. Давайте вместе разберем, как правильно организовать хранение шаблонов Word в 1С, использовать их для автоматического заполнения и какие подходы к разработке окажутся наиболее эффективными.
Прежде всего, давайте выясним, где могут располагаться наши шаблоны Word. Существует несколько распространенных подходов к хранению, каждый из которых имеет свои преимущества.
В конфигурации 1С через справочник "Шаблоны документов MS Word" (БСП).
Если в вашей конфигурации используется Библиотека стандартных подсистем (БСП), то наиболее типовым и удобным способом является хранение шаблонов в специальном справочнике ШаблоныДокументовMSWord. При добавлении нового шаблона сюда мы указываем:
Этот способ обеспечивает централизованное управление шаблонами и удобен для пользователей.
В реквизитах справочников или регистров сведений.
Мы можем хранить шаблоны программно, используя реквизиты объектов метаданных с типом ХранилищеЗначения. Этот подход полезен, когда шаблон жестко привязан к конкретному элементу справочника или записи регистра сведений. Например, шаблон договора может храниться непосредственно в элементе справочника "Договоры".
В макетах внешних обработок или самой конфигурации.
Очень часто шаблоны Word хранятся в макетах внешних печатных форм или обработок. В этом случае макет имеет тип ДвоичныеДанные, и в него загружается файл Word. Этот метод особенно популярен, поскольку позволяет распространять печатные формы как отдельные файлы, не затрагивая основную конфигурацию. Мы рассмотрим его подробнее, когда будем говорить о механизме БСП.
Как обычные файлы на диске.
В некоторых случаях шаблоны могут храниться как обычные файлы в определенной директории на диске. В 1С при этом сохраняется только путь к файлу. Этот подход менее гибок и требует обеспечения доступа к файловой системе, но иногда используется для очень специфических задач или при работе с большим количеством редко изменяемых шаблонов.
Теперь давайте разберем, как 1С взаимодействует с шаблонами Word, особенно если мы используем внешние печатные формы и подсистему "Дополнительные отчеты и обработки" из БСП.
Ключевую роль здесь играет процедура ДополнительныеОтчетыИОбработки.ПриПолученииКомандПечати. Эта процедура является частью Библиотеки стандартных подсистем (БСП) и предназначена для регистрации и определения команд печати, в том числе тех, которые формируют документы Word.
При создании внешней печатной формы, которая должна выводить результат в Word, мы обычно описываем в модуле объекта обработки специальную функцию СведенияОВнешнейОбработке(). Эта функция отвечает за регистрацию печатной формы и ее команд в подсистеме "Дополнительные отчеты и обработки". Именно через нее конфигурация "узнает" о нашей печатной форме.
Процесс формирования документа Word состоит из нескольких шагов:
ШаблоныДокументовMSWord.Для того чтобы 1С могла "понять", куда вставлять данные в шаблоне Word, нам необходимо использовать специальные маркеры. Рассмотрим основные подходы к их созданию:
Закладки Word.
Это один из самых старых и распространенных способов. Мы создаем в шаблоне Word закладки (Вставка -> Закладка) с уникальными именами. Затем в коде 1С мы ищем эти закладки и вставляем в них текст.
Поля слияния (MERGEFIELD).
Поля слияния используются для интеграции с источниками данных. Мы можем вставлять их через меню Word (Вставка -> Экспресс-блоки -> Поле... и выбрать MergeField). В 1С мы затем можем итерировать по коллекции полей документа и заполнять их значения.
Уникальные теги.
Это более гибкий подход, который часто используется в БСП. Мы вставляем в шаблон Word уникальные текстовые маркеры, например:
[Параметр] или <Параметр> для простых значений.{v8 ИмяПараметра} для параметров, специфичных для БСП.{v8 Область.ИмяОбласти} и {/v8 Область.ИмяОбласти} для обозначения табличных частей или повторяющихся блоков данных.В коде 1С мы затем ищем эти теги и заменяем их на нужные данные. Этот метод позволяет создавать более сложные и динамические шаблоны.
Для непосредственной работы с файлами Word из 1С мы используем механизм COM-объектов. Давайте посмотрим, как это происходит.
Мы создаем объект Word.Application, который является экземпляром приложения Microsoft Word. Это позволяет нам управлять Word программно.
Попытка
// Создаем новый экземпляр приложения Word
WordПриложение = Новый COMОбъект("Word.Application");
Исключение
Сообщить("Не удалось запустить Microsoft Word. Убедитесь, что Word установлен на компьютере.");
Возврат;
КонецПопытки;
// Делаем Word видимым (по желанию, для отладки или интерактивного режима)
WordПриложение.Visible = Истина;
// Открываем шаблон документа
ДокументWord = WordПриложение.Documents.Add("C:\Путь\К\Вашему\Шаблону.dotx");
// Или открываем существующий документ
// ДокументWord = WordПриложение.Documents.Open("C:\Путь\К\Существующему\Документу.docx");
После того как мы открыли шаблон или создали новый документ на его основе, мы можем приступить к заполнению данных. Для этого используются различные методы:
Если ДокументWord.Bookmarks.Exists("МояЗакладка") Тогда
ДокументWord.Bookmarks("МояЗакладка").Range.Text = "Значение из 1С";
КонецЕсли;
MERGEFIELD): Мы итерируем по коллекции полей документа и заполняем их значения.
Для Каждого Поле Из ДокументWord.Fields Цикл
Если Поле.Type = 28 Тогда // wdFieldMergeField
Если Поле.Code.Text Подобно "*ИмяПараметра*" Тогда
Поле.Result.Text = "Значение для ИмяПараметра";
КонецЕсли;
КонецЕсли;
КонецЦикла;
WordПриложение.Selection.Find.ClearFormatting();
WordПриложение.Selection.Find.Replacement.ClearFormatting();
// Поиск и замена простого параметра
Если WordПриложение.Selection.Find.Execute("{v8 МойПараметр}", Ложь, Ложь, Ложь, Ложь, Ложь, Истина, 1, Истина, "ЗначениеПараметра", 2) Тогда
// Замена выполнена
КонецЕсли;
// Для табличных частей или повторяющихся блоков используется более сложная логика
// с копированием областей и их заполнением.
После заполнения всех данных мы можем сохранить документ или закрыть Word.
// Сохраняем документ
ДокументWord.SaveAs("C:\Путь\Куда\Сохранить\ГотовыйДокумент.docx");
// Закрываем документ
ДокументWord.Close(0); // 0 - wdDoNotSaveChanges
// Или ДокументWord.Close(-1); // -1 - wdSaveChanges
// Закрываем приложение Word
WordПриложение.Quit();
Важный момент: работа с COM-объектами требует, чтобы Microsoft Word был установлен на том же компьютере, где выполняется код 1С (как правило, на клиентском ПК или на сервере 1С, если используется серверный вызов).
В контексте 1С часто возникает вопрос о том, как лучше внедрять новый функционал. Комментарий "сужение" вместо "расширения" указывает на важную стратегию разработки.
"Расширения" — это мощный механизм платформы 1С, который позволяет изменять функциональность конфигурации (добавлять реквизиты, формы, команды) без снятия ее с поддержки. Это отличный способ для минимальных доработок.
Однако, когда речь идет о добавлении печатных форм, особенно в Word, "сужение" или более целенаправленный подход часто оказывается предпочтительнее. Под "сужением" в данном контексте мы подразумеваем использование внешних печатных форм или внешних обработок.
Почему это так?
Таким образом, для добавления функционала печати в Word мы настоятельно рекомендуем использовать внешние печатные формы. Это позволяет сохранить типовую конфигурацию в максимальной степени неизменной, упрощает поддержку и развитие системы.
Использование шаблонов Word в 1С — это мощный инструмент для автоматизации создания документов любой сложности. Разобравшись с методами хранения, принципами подготовки шаблонов и программным взаимодействием, мы можем эффективно решать широкий круг задач, значительно повышая производительность и точность документооборота.
← К списку