Как программно задать имя файла при сохранении документа Word из 1С

Программист 1С v8.3 (Обычные формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

При разработке внешних печатных форм в среде 1С часто возникает задача не просто выгрузить данные в Microsoft Word, но и сделать взаимодействие пользователя с итоговым документом максимально удобным. Одной из таких задач является автоматическая подстановка имени файла в диалоговом окне при нажатии кнопки «Сохранить как». Рассмотрим, почему стандартные подходы могут вызывать ошибки и как правильно управлять объектной моделью MS Word из 1С.

Разбор причины ошибки «Поле объекта не обнаружено (ActiveDocument)»

Для начала проанализируем ситуацию, с которой сталкиваются многие разработчики при работе в 1С:ЗУП 2.5 или других конфигурациях на обычных формах. Рассмотрим типичный фрагмент кода, вызывающий ошибку:


MSWord = ПолучитьМакет("Макет1");
Документ = MSWord.Получить();
// Попытка обращения, вызывающая ошибку:
Документ.ActiveDocument.Caption = "Имя файла";

Выясним причину возникновения ошибки. Когда мы используем метод Получить() для макета типа Active document, переменная Документ уже содержит в себе ссылку на объект типа Document (конкретный вордовский документ). В иерархии объектов Microsoft Word свойство ActiveDocument принадлежит объекту Application (самому приложению Word), а не объекту Document. Именно поэтому система сообщает, что поле не обнаружено.

Чтобы код заработал, необходимо обращаться к приложению через свойство Application самого документа:


// Правильное обращение к приложению:
ПриложениеВорд = Документ.Application;

Однако даже исправление этой ошибки не всегда приводит к желаемому результату — подстановке имени в диалог сохранения. Разберем рабочие способы реализации этой задачи.

Способ №1. Использование метаданных документа (Title)

Проанализируем самый надежный и «нативный» для Microsoft Word способ. Когда пользователь открывает диалог сохранения нового (еще не сохраненного) документа, Word автоматически берет предлагаемое имя файла из свойства «Заголовок» (Title) в метаданных документа. Если это поле заполнено, оно будет приоритетным для формирования имени.

Рассмотрим реализацию на языке 1С:


// Получаем объект документа из макета
MSWord = ПолучитьМакет("Макет1");
Документ = MSWord.Получить();

// Устанавливаем заголовок в свойствах документа
// Это имя Word предложит при сохранении
Документ.BuiltInDocumentProperties("Title").Value = "Приказ_на_отпуск_Иванов_ИИ";

// Делаем документ видимым для пользователя
Документ.Application.Visible = Истина;
Документ.Activate();

Важный нюанс: При указании значения не рекомендуется добавлять расширение файла (например, .doc или .docx). Word сам добавит нужное расширение в зависимости от версии офиса и настроек пользователя. Если добавить расширение вручную, можно столкнуться с проблемой «двойного расширения».

Способ №2. Программный вызов диалога сохранения через объект Dialogs

Если нам необходимо не просто надеяться на стандартное поведение Word, а принудительно вызвать окно сохранения с уже заполненным именем, мы можем воспользоваться коллекцией Dialogs. Для диалога «Сохранить как» используется идентификатор 84 (константа wdDialogFileSaveAs).

Разберем этот метод по шагам:


Приложение = Документ.Application;
ДиалогСохранения = Приложение.Dialogs(84); // 84 - это wdDialogFileSaveAs

// Задаем предлагаемое имя файла
ДиалогСохранения.Name = "Трудовой_договор_№15";

// Вызываем диалог. Метод Show() открывает окно, но не закрывает документ.
ДиалогСохранения.Show();

Этот способ удобен тем, что мы можем программно контролировать момент появления окна, при этом оставляя за пользователем выбор конечной папки для сохранения файла.

Способ №3. Изменение заголовка окна (Caption)

Иногда требуется изменить визуальное отображение названия документа в верхней строке окна Word. Это также может повлиять на имя сохранения в некоторых версиях MS Office, хотя метод с BuiltInDocumentProperties считается более стабильным.

Посмотрим на пример кода:


// Обращаемся к активному окну документа
Документ.ActiveWindow.Caption = "Справка_о_доходах_2023";

Стоит учитывать, что свойство Caption меняет только текст в заголовке окна. Если пользователь в дальнейшем воспользуется функцией «Сохранить как», Word сначала посмотрит в свойства документа (Title), и если там пусто, может использовать заголовок окна или первые строки текста документа.

Особенности работы с Active Document в ЗУП 2.5

В конфигурациях на базе 1С:Предприятие 8.2 (таких как ЗУП 2.5) использование Active document имеет свои ограничения. Поскольку документ является внедренным объектом, он иногда ведет себя иначе, чем документ, открытый напрямую через COM-объект Word.Application.

Если вышеперечисленные методы не срабатывают из-за специфики безопасности системы или настроек Office, рекомендуется использовать комбинированный подход:

  1. Сначала сохраняем документ во временную папку под нужным именем.
  2. Затем открываем его пользователю.

Проанализируем пример такого подхода:


ИмяФайла = "Расчетный_листок_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd") + ".doc";
ПутьКФайлу = КаталогВременныхФайлов() + ИмяФайла;

// Сохраняем невидимо для пользователя
Документ.SaveAs(ПутьКФайлу);

// Теперь открываем уже именованный файл
Документ.Application.Visible = Истина;
Документ.Activate();

В этом случае, когда пользователь нажмет «Сохранить», файл уже будет иметь путь и имя, и Word просто обновит текущий файл во временном каталоге. Если же пользователь выберет «Сохранить как», в поле имени файла уже будет стоять ваше заданное значение.

Рекомендации по автоматизации

Подведем итог и выделим основные правила работы с именами файлов Word в 1С:

  1. Всегда проверяйте иерархию: Если вы получили объект через Макет.Получить(), используйте свойство .Application для доступа к общим командам Ворда.
  2. Приоритет метаданных: Используйте BuiltInDocumentProperties("Title") для установки имени «по умолчанию». Это самый чистый способ, не нарушающий пользовательский опыт.
  3. Контроль расширений: Старайтесь не указывать расширение файла в строковых переменных имен, если используете внутренние свойства Word.
  4. Очистка временных файлов: Если вы используете метод с предварительным сохранением в КаталогВременныхФайлов(), помните, что эти файлы могут накапливаться, хотя система обычно очищает их при перезагрузке.

Использование данных методов позволит сделать работу пользователей с печатными формами в формате Microsoft Word более профессиональной и исключит ошибки при ручном вводе имен файлов.

← На главную