Документы Word и 1С:Предприятие — открыть, заполнить шаблон, сохранить

· 10 мин

Содержание

Открыть файл Word из 1С 8.3 можно тремя путями: запустить его в Word стандартной командой платформы НачатьЗапускПриложения, управлять Word программно через COM-объект Word.Application или прочитать .docx как ZIP-архив без установленного Office. Пользователю типовой конфигурации кода не нужно вовсе: файл прикладывают к документу и открывают двойным щелчком.

Ниже каждый способ доведён до рабочего кода: открыть документ, подставить данные в шаблон, сохранить в DOCX или PDF и закрыть Word так, чтобы в диспетчере задач не осталось висящих WINWORD.EXE.

Чем 1С может работать с документами Word

Выбор зависит от двух вещей: где выполняется код (на компьютере пользователя или на сервере 1С) и стоит ли там Microsoft Word.

СпособГде работаетНужен WordКогда выбирать
📎 Присоединенные файлыЛюбой клиентНа компьютере пользователяХранить договор, скан, письмо рядом с документом базы
🚀 НачатьЗапускПриложенияТонкий и толстый клиентДаПросто показать файл пользователю
⚙️ COM Word.ApplicationКлиент Windows, реже сервер WindowsДаЗаполнить шаблон, прочитать текст, сохранить в PDF
🗜️ ZIP + XML (ЧтениеZipФайла)Клиент и сервер, Windows и LinuxНетВытащить текст из .docx на сервере
🖨️ Макеты Office Open XML (БСП)Клиент и серверНет, для печатиПечатные формы в DOCX в типовых конфигурациях

COM — единственный способ из списка, который даёт полный контроль над документом: закладки, таблицы, колонтитулы, экспорт в PDF. Плата за это — привязка к Windows и установленному Office.

Присоединенные файлы в типовых конфигурациях

В БП 3.0, ЗУП 3.1, УТ 11 у большинства документов и справочников есть команда присоединенных файлов (значок скрепки на командной панели формы). Порядок такой:

  1. Откройте документ или элемент справочника.
  2. Нажмите скрепку и добавьте .docx с диска.
  3. Двойной щелчок по файлу открывает его на просмотр в Word.
  4. Чтобы правки попали в базу, файл берут на редактирование, сохраняют в Word и в 1С завершают редактирование — новая версия записывается в информационную базу.

Если просто открыть файл на просмотр, изменить и сохранить в Word, правки останутся во временной папке на компьютере. В базе останется старая версия.

Что проверить до написания кода

COM-автоматизация падает чаще из-за окружения, чем из-за кода. Перед отладкой проверьте:

  • 🖥️ Клиент. Тонкий или толстый клиент под Windows. В веб-клиенте и на Linux/macOS COMОбъект недоступен, там остаётся ZIP-разбор или передача файла пользователю.
  • 📝 Word установлен и активирован. Запустите его вручную один раз под тем же пользователем Windows. Окна первого запуска, активации и выбора формата файлов блокируют COM-вызов, и 1С «зависает».
  • 🔢 Разрядность. Word — внепроцессный COM-сервер, поэтому 64-разрядный клиент 1С нормально работает с 32-разрядным Office и наоборот.
  • 🔐 Права в базе. Если код живёт во внешней обработке, пользователю нужно право на интерактивное открытие внешних обработок. В типовых конфигурациях обработку проще подключить через Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки.
  • 🛡️ Защищённый просмотр Word. Файлы, скачанные из интернета или почты, Word открывает только на чтение. Для шаблонов в рабочей папке снимите блокировку в свойствах файла Windows или добавьте папку в надёжные расположения Word.
  • 📁 Путь к файлу. В клиент-серверной базе путь C:\Шаблоны\Договор.docx существует на компьютере пользователя, а не на сервере. Код с COM-вызовом должен выполняться там же, где лежит файл.

Клиент или сервер

В управляемой форме COM-код пишут в процедуре с директивой &НаКлиенте и обрамляют проверкой #Если Не ВебКлиент Тогда. Данные из базы (реквизиты, табличную часть) получают отдельным серверным вызовом и передают на клиент структурой.

Запуск Word на сервере 1С возможен, но Microsoft не поддерживает автоматизацию Office из служб. Служба 1С работает под отдельной учётной записью (обычно USR1CV8), и Word под ней ведёт себя непредсказуемо: окна сообщений никто не закроет, процесс повиснет. Для серверной генерации документов надёжнее макеты Office Open XML или прямая сборка .docx через XML.

Открываем документ Word из 1С: пошаговый код

Просто показать файл пользователю

Если документ нужно только открыть, COM не нужен. Платформа передаёт файл в программу, связанную с расширением .docx:

&НаКлиенте
Процедура ОткрытьВWord(Команда)
    ПутьКФайлу = "C:\Шаблоны\Договор.docx";
    НачатьЗапускПриложения(Новый ОписаниеОповещения("ПослеЗапуска", ЭтотОбъект), ПутьКФайлу);
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗапуска(КодВозврата, ДополнительныеПараметры) Экспорт
    // Word запущен, ждать его закрытия не требуется
КонецПроцедуры

Асинхронный вызов работает и в конфигурациях, где модальность отключена. В конфигурациях на БСП есть готовая обёртка ФайловаяСистемаКлиент.ОткрытьФайл.

Открыть через COM и получить доступ к содержимому

  1. Создайте объект приложения: Новый COMОбъект("Word.Application").
  2. Отключите диалоги Word, чтобы они не ждали ответа пользователя.
  3. Откройте файл методом Documents.Open.
  4. Решите, показывать ли окно: для заполнения шаблона в фоне Visible = Ложь, для правки пользователем — Истина.
&НаКлиенте
Процедура ОткрытьЧерезCOM(Команда)
    #Если Не ВебКлиент Тогда
    Попытка
        Word = Новый COMОбъект("Word.Application");
    Исключение
        Сообщить("Word не установлен или не зарегистрирован: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;

    Word.DisplayAlerts = 0;   // wdAlertsNone
    Документ = Word.Documents.Open("C:\Шаблоны\Договор.docx");

    Сообщить("Абзацев в документе: " + Формат(Документ.Paragraphs.Count, "ЧГ=0"));
    Сообщить(Лев(Документ.Content.Text, 300));

    Word.Visible = Истина;    // отдаём документ пользователю
    #КонецЕсли
КонецПроцедуры

Документ.Content.Text возвращает весь текст основной части документа. Абзацы в нём разделены символом возврата каретки Символы.ВК, поэтому для разбора по строкам используйте СтрРазделить(Текст, Символы.ВК).

Чтобы создать новый документ на основе шаблона .dotx, вместо Open вызывают Word.Documents.Add("C:\Шаблоны\Договор.dotx"). Сам шаблон при этом не меняется — удобно, когда одним образцом пользуются несколько человек.

Заполняем шаблон Word данными из базы

Шаблон готовят в Word один раз, а 1С подставляет в него значения. Есть два приёма, и у каждого свои ограничения.

ПриёмКак размечают шаблонПлюсМинус
ЗакладкиВставка → Закладка в WordТочное место, не зависит от текстаЗакладку легко случайно удалить при правке шаблона
Поиск и заменаМетки вида [НомерДоговора] в текстеШаблон читается глазами, правит юристЗамена ограничена 255 символами

Закладки

Процедура ЗаполнитьЗакладку(Документ, ИмяЗакладки, Значение)
    Если Документ.Bookmarks.Exists(ИмяЗакладки) Тогда
        Документ.Bookmarks.Item(ИмяЗакладки).Range.Text = Строка(Значение);
    КонецЕсли;
КонецПроцедуры

Проверка Exists спасает от ошибки, когда кто-то переименовал закладку в шаблоне. После присвоения Range.Text сама закладка исчезает — повторно в ту же закладку записать не получится.

Поиск и замена меток

Метод Find.Execute принимает 11 позиционных параметров. Для замены всех вхождений важны четыре: что искать, направление вперёд, продолжение поиска с начала (1 — wdFindContinue) и режим замены (2 — wdReplaceAll).

Процедура ЗаменитьМетку(Документ, Метка, Значение)
    Диапазон = Документ.Content;
    Диапазон.Find.Execute(Метка, Ложь, Ложь, Ложь, Ложь, Ложь,
        Истина, 1, Ложь, Строка(Значение), 2);
КонецПроцедуры

// Пример вызова
ЗаменитьМетку(Документ, "[НомерДоговора]", "15/24");
ЗаменитьМетку(Документ, "[Сумма]", Формат(125000, "ЧДЦ=2; ЧРГ=' '"));

Текст замены длиннее 255 символов Word отклоняет с ошибкой. Длинные условия договора вставляйте через закладку или найдите метку, а затем присвойте Range.Text найденному диапазону.

Документ.Content охватывает только основной текст. Метки в колонтитулах и надписях заменяются отдельно, через коллекцию Документ.StoryRanges.

Таблица товаров или услуг

В шаблоне делают таблицу с шапкой и одной пустой строкой. 1С добавляет строки и пишет значения в ячейки:

Таблица = Документ.Tables.Item(1);         // первая таблица документа
НомерСтроки = 1;                           // строка шапки
Для Каждого СтрокаТЧ Из ДанныеТовары Цикл
    НомерСтроки = НомерСтроки + 1;
    Если НомерСтроки > Таблица.Rows.Count Тогда
        Таблица.Rows.Add();
    КонецЕсли;
    Таблица.Cell(НомерСтроки, 1).Range.Text = СтрокаТЧ.Номенклатура;
    Таблица.Cell(НомерСтроки, 2).Range.Text = Формат(СтрокаТЧ.Количество, "ЧГ=0");
    Таблица.Cell(НомерСтроки, 3).Range.Text = Формат(СтрокаТЧ.Сумма, "ЧДЦ=2");
КонецЦикла;

Нумерация строк и столбцов в COM-объектах Word начинается с 1, а не с 0, как в коллекциях 1С. Ячейка записывается построчно, поэтому на 300+ строках заполнение заметно тормозит. Ускоряет работу скрытое окно (Visible = Ложь) и Word.ScreenUpdating = Ложь на время цикла.

Сохраняем результат и корректно закрываем Word

Готовый документ сохраняют под новым именем, чтобы шаблон остался чистым. Метод SaveAs2 есть в Word 2010 и новее, второй параметр задаёт формат.

ФорматКод FileFormatРасширение
Документ Word по умолчанию16.docx
Документ Word 97–20030.doc
PDF17.pdf
КаталогВыгрузки = "C:\Договоры\";
ИмяФайла = "Договор_" + СтрЗаменить(НомерДоговора, "/", "-");

Документ.SaveAs2(КаталогВыгрузки + ИмяФайла + ".docx", 16);
Документ.SaveAs2(КаталогВыгрузки + ИмяФайла + ".pdf", 17);

Документ.Close(0);   // wdDoNotSaveChanges: всё уже сохранено
Word.Quit(0);
Word = Неопределено;

Символы / \ : * ? " < > | в имени файла Windows запрещены — номер документа с косой чертой ломает сохранение. Поэтому в примере / заменяется на дефис.

Как не оставить висящие процессы WINWORD.EXE

Каждый Новый COMОбъект("Word.Application") запускает отдельный процесс. Если код упал между созданием объекта и Quit, процесс остаётся в памяти и держит файл открытым. Следующий запуск получает ошибку доступа к файлу.

Правило простое: всё между Open и Quit оборачивайте в Попытка … Исключение, а в ветке исключения закрывайте документ и Word, затем пробрасывайте ошибку дальше через ВызватьИсключение.

Если окно Word отдано пользователю (Visible = Истина), Quit вызывать нельзя — закроется документ, который он правит. В этом случае просто обнулите переменную Word = Неопределено, а закроет Word сам пользователь.

Диагностика: выберите симптом

Открыть файл Word в 1С без установленного Word

Когда Office нет — Linux-сервер, веб-клиент, терминальный сервер без лицензии Office, — остаются способы без COM.

Читаем .docx как ZIP-архив

Файл .docx — это ZIP с XML внутри. Основной текст лежит в word/document.xml, абзацы — элементы w:p, фрагменты текста — w:t. Платформа умеет и распаковать архив, и разобрать XML, а значит код работает на сервере под любой ОС:

Функция ТекстИзDOCX(ПутьКФайлу) Экспорт
    Каталог = ПолучитьИмяВременногоФайла();
    СоздатьКаталог(Каталог);

    Архив = Новый ЧтениеZipФайла(ПутьКФайлу);
    Архив.ИзвлечьВсе(Каталог);
    Архив.Закрыть();

    Разделитель = ПолучитьРазделительПути();
    ПутьКXML = Каталог + Разделитель + "word" + Разделитель + "document.xml";

    Чтение = Новый ЧтениеXML;
    Чтение.ОткрытьФайл(ПутьКXML);
    Части = Новый Массив;
    Пока Чтение.Прочитать() Цикл
        Если Чтение.ТипУзла = ТипУзлаXML.Текст Тогда
            Части.Добавить(Чтение.Значение);
        ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента
            И Чтение.ЛокальноеИмя = "p" Тогда
            Части.Добавить(Символы.ПС);
        КонецЕсли;
    КонецЦикла;
    Чтение.Закрыть();

    УдалитьФайлы(Каталог);
    Возврат СтрСоединить(Части, "");
КонецФункции

Функция возвращает текст с разбивкой по абзацам. Оформление, картинки и таблицы она не сохраняет — это способ «достать содержимое», а не «показать документ».

Подставлять значения прямой заменой в document.xml рискованно. Word часто разбивает метку [ФИО] на несколько фрагментов w:t из-за проверки орфографии или смены шрифта, и строковый поиск её не находит. Для шаблонов без Word используйте макеты Office Open XML из БСП или следите, чтобы метка набиралась одним фрагментом.

Печатные формы DOCX в типовых конфигурациях

Библиотека стандартных подсистем умеет формировать печатные формы по макетам Office Open XML: макет хранится в конфигурации как .docx, а данные подставляются без запуска Word. В БП 3.0 и других конфигурациях на БСП список макетов открывается из Администрирование → Печатные формы, отчеты и обработки → Макеты печатных форм. Оттуда же макет выгружают, правят в Word и загружают обратно — изменения не затрагивают конфигурацию и переживают обновления.

LibreOffice вместо Word

На Windows-компьютере без Microsoft Office с документами работает LibreOffice через COM-объект com.sun.star.ServiceManager. Объектная модель у него другая: методы и свойства Word из примеров выше не подойдут, код пишется заново. Если нужно только открыть файл для просмотра, LibreOffice сработает и через НачатьЗапускПриложения — при условии, что он назначен программой для .docx.

Частые вопросы

Можно ли редактировать документ Word прямо внутри формы 1С?
Нет, встроенного редактора .docx в платформе нет. Документ открывается в Word отдельным окном, а 1С получает результат после сохранения. Для текста с оформлением внутри формы есть поле форматированного документа, но это собственный формат 1С.
Работает ли открытие Word из 1С в файловой базе по сети?
Да. Код с COM выполняется на компьютере пользователя, поэтому тип базы не важен. Важно, чтобы путь к шаблону был доступен с этого компьютера: сетевая папка по UNC-пути вида \\Сервер\Шаблоны\ надёжнее подключённой буквы диска.
Как хранить шаблон Word в самой базе, а не на диске?
Положите .docx в макет типа «Двоичные данные» внешней обработки или конфигурации. Перед заполнением запишите его во временный файл: ПолучитьМакет("Шаблон").Записать(ИмяВременногоФайла), затем откройте через COM.
Почему документ открывается только для чтения?
Файл уже открыт другим пользователем или висящим процессом WINWORD.EXE, либо стоит атрибут «Только чтение», либо Word включил защищённый просмотр для файла из интернета. Закройте лишние процессы и снимите блокировку в свойствах файла.
Нужна ли отдельная лицензия Office для работы через COM?
COM использует установленный на компьютере Word, поэтому достаточно лицензии этого Office. Отдельная лицензия нужна каждому компьютеру или терминальному серверу, где 1С запускает Word.