Документы Word и 1С:Предприятие — открыть, заполнить шаблон, сохранить
Содержание
Открыть файл 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 у большинства документов и справочников есть команда присоединенных файлов (значок скрепки на командной панели формы). Порядок такой:
- Откройте документ или элемент справочника.
- Нажмите скрепку и добавьте
.docxс диска. - Двойной щелчок по файлу открывает его на просмотр в Word.
- Чтобы правки попали в базу, файл берут на редактирование, сохраняют в 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 и получить доступ к содержимому
- Создайте объект приложения:
Новый COMОбъект("Word.Application"). - Отключите диалоги Word, чтобы они не ждали ответа пользователя.
- Откройте файл методом
Documents.Open. - Решите, показывать ли окно: для заполнения шаблона в фоне
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–2003 | 0 | .doc |
| 17 |
КаталогВыгрузки = "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С?
Работает ли открытие Word из 1С в файловой базе по сети?
\\Сервер\Шаблоны\ надёжнее подключённой буквы диска.Как хранить шаблон Word в самой базе, а не на диске?
ПолучитьМакет("Шаблон").Записать(ИмяВременногоФайла), затем откройте через COM.