При автоматизации документооборота часто возникает задача не просто сформировать печатную форму в формате Microsoft Word, но и максимально упростить жизнь конечному пользователю. Одной из таких рутинных задач является сохранение документа. По умолчанию Word предлагает в качестве имени первую строку текста или стандартное «Документ1». Если мы хотим, чтобы при нажатии кнопки «Сохранить» или «Сохранить как» система автоматически подставляла, например, «Договор №123 от 01.01.2023», нам необходимо заранее передать это значение в объектную модель Word. В рамках данной статьи мы разберем, как это реализовать с помощью механизмов COM-соединения в 1С.
Для начала рассмотрим базовый сценарий работы. Программист создает объект Word.Application, добавляет новый документ на основании шаблона и заполняет его данными. Однако свойство FullName (полное имя файла) у нового, еще не сохраненного документа, доступно только для чтения. Это логично, так как файл физически еще не существует на диске. Чтобы «обмануть» систему и подсказать Word желаемое имя, мы должны обратиться к внутренним свойствам или диалогам приложения. Рассмотрим ситуацию, когда мы уже инициализировали приложение и создали документ:
ПриложениеВорд = Новый COMОбъект("Word.Application");
ШаблонДокумента = ПриложениеВорд.Documents.Add(ИмяФайлаШаблона);
// ... здесь идет заполнение параметров документа
ПриложениеВорд.Visible = Истина;
Проблема заключается в том, что простое присвоение заголовка окна через Caption не меняет имя файла при сохранении. Нам нужно воздействовать на метаданные документа или параметры диалоговых окон.
Как показала практика и обсуждение на форумах, одним из самых эффективных способов является обращение к коллекции диалогов Word. Конкретно нас интересует диалог с индексом 86 (в объектной модели Word это константа wdDialogFileSummaryInfo). Этот диалог отвечает за сводную информацию о документе.
Рассмотрим по шагам, как применить этот метод:
Dialogs(86).title (заголовок). Именно это значение Word подставляет в поле «Имя файла» при первом вызове команды сохранения.Execute(), чтобы применить изменения к документу без открытия самого окна диалога пользователю.Пример программного кода для реализации этого метода:
// Предположим, что ОбъектДокумент — это наш COM-объект документа Word
Попытка
ДиалогСводка = ОбъектДокумент.Application.Dialogs(86);
ДиалогСводка.title = "Договор № " + СокрЛП(НомерДоговора);
ДиалогСводка.Execute();
Исключение
Сообщить("Не удалось установить имя файла по умолчанию: " + ОписаниеОшибки());
КонецПопытки;
Важный нюанс: в отладчике 1С при просмотре объекта Dialogs(86) свойство title может быть не видно. Это особенность реализации COM-интерфейса Microsoft Office. Тем не менее, оно является рабочим и корректно воспринимается приложением Word, начиная с версии 2007 и выше.
Проанализируем альтернативный и более «официальный» с точки зрения документации Microsoft способ. У каждого документа Word есть набор встроенных свойств (метаданных). Свойство «Заголовок» (Title) напрямую коррелирует с предлагаемым именем файла.
Разберем этот метод подробнее. Вместо работы с диалогами мы напрямую меняем свойство документа:
// Установка заголовка через встроенные свойства документа
ШаблонДокумента.BuiltInDocumentProperties("Title").Value = "Счет №" + НомерСчета;
Этот метод считается более стабильным для разных версий Office (2010, 2013, 2016, 2019, 365), так как он не зависит от работы графических диалогов. Когда пользователь нажимает «Сохранить», Word проверяет наличие заполненного поля Title в метаданных и, если оно не пустое, использует его содержимое для формирования имени файла.
Выясним важную причину, по которой имя файла может «обрубаться» или вызывать ошибки. Операционная система Windows запрещает использование определенных символов в именах файлов. К ним относятся: / \ : * ? " < > |. В номерах договоров из 1С часто встречаются косые черты или двоеточия.
Проанализируем ситуацию: если мы передадим строку "Договор №123/05", Word может либо обрезать имя до слеша, либо выдать ошибку при попытке записи. Чтобы избежать этого, перед передачей строки в Word необходимо выполнить очистку.
Рассмотрим пример функции для подготовки корректного имени:
Функция ПодготовитьИмяФайла(ИсходноеИмя)
ЗапрещенныеСимволы = "/\:*?""<>|";
Результат = ИсходноеИмя;
Для Индекс = 1 По СтрДлина(ЗапрещенныеСимволы) Цикл
СимволЗамены = Сред(ЗапрещенныеСимволы, Индекс, 1);
Результат = СтрЗаменить(Результат, СимволЗамены, "");
КонецЦикла;
Возврат Результат;
КонецФункции
Используйте эту функцию всегда, когда формируете динамическое имя из реквизитов 1С. Это гарантирует, что Dialogs(86).title или BuiltInDocumentProperties("Title") получат валидную строку.
В новых редакциях Microsoft Office при сохранении часто открывается полноэкранное меню (Backstage view). Иногда это меню игнорирует программно заданные свойства, если документ открыт в «Защищенном просмотре» или если есть конфликты с синхронизацией OneDrive. В таких случаях рекомендуется комбинировать методы: устанавливать и title в диалоге, и свойство BuiltInDocumentProperties. Это обеспечит максимальную вероятность того, что пользователь увидит нужное имя.
Соберем все рекомендации вместе и посмотрим на итоговый фрагмент кода, который можно вставить в процедуру печати:
// Инициализация
ПриложениеВорд = Новый COMОбъект("Word.Application");
Документ = ПриложениеВорд.Documents.Add(ПутьКШаблону);
// Подготовка имени
НужноеИмя = "Договор " + ДоговорОбъект.Номер + " от " + Формат(ДоговорОбъект.Дата, "ДФ=dd.MM.yyyy");
НужноеИмя = ПодготовитьИмяФайла(НужноеИмя); // Очистка от символов / \ : * и т.д.
// Установка имени для сохранения
Попытка
// Вариант 1: Через диалоги (хорошо работает для подстановки в диалог Сохранить как)
Диалог = Документ.Application.Dialogs(86);
Диалог.title = НужноеИмя;
Диалог.Execute();
// Вариант 2: Через свойства (дублируем для надежности)
Документ.BuiltInDocumentProperties("Title").Value = НужноеИмя;
// Вариант 3: Заголовок окна для визуального контроля
Документ.ActiveWindow.Caption = НужноеИмя;
Исключение
// Обработка ошибок доступа к COM-объектам
КонецПопытки;
ПриложениеВорд.Visible = Истина;
ПриложениеВорд.Activate();
Таким образом, мы не только автоматизируем заполнение текста договора, но и берем на себя управление файловыми операциями, исключая человеческий фактор при именовании файлов на диске. Главное помнить: всегда очищайте строку от спецсимволов и используйте метод Execute() для диалогов, чтобы настройки вступили в силу незаметно для пользователя.