При разработке внешних печатных форм в среде 1С часто возникает задача не просто выгрузить данные в Microsoft Word, но и сделать взаимодействие пользователя с итоговым документом максимально удобным. Одной из таких задач является автоматическая подстановка имени файла в диалоговом окне при нажатии кнопки «Сохранить как». Рассмотрим, почему стандартные подходы могут вызывать ошибки и как правильно управлять объектной моделью MS Word из 1С.
Для начала проанализируем ситуацию, с которой сталкиваются многие разработчики при работе в 1С:ЗУП 2.5 или других конфигурациях на обычных формах. Рассмотрим типичный фрагмент кода, вызывающий ошибку:
MSWord = ПолучитьМакет("Макет1");
Документ = MSWord.Получить();
// Попытка обращения, вызывающая ошибку:
Документ.ActiveDocument.Caption = "Имя файла";
Выясним причину возникновения ошибки. Когда мы используем метод Получить() для макета типа Active document, переменная Документ уже содержит в себе ссылку на объект типа Document (конкретный вордовский документ). В иерархии объектов Microsoft Word свойство ActiveDocument принадлежит объекту Application (самому приложению Word), а не объекту Document. Именно поэтому система сообщает, что поле не обнаружено.
Чтобы код заработал, необходимо обращаться к приложению через свойство Application самого документа:
// Правильное обращение к приложению:
ПриложениеВорд = Документ.Application;
Однако даже исправление этой ошибки не всегда приводит к желаемому результату — подстановке имени в диалог сохранения. Разберем рабочие способы реализации этой задачи.
Проанализируем самый надежный и «нативный» для Microsoft Word способ. Когда пользователь открывает диалог сохранения нового (еще не сохраненного) документа, Word автоматически берет предлагаемое имя файла из свойства «Заголовок» (Title) в метаданных документа. Если это поле заполнено, оно будет приоритетным для формирования имени.
Рассмотрим реализацию на языке 1С:
// Получаем объект документа из макета
MSWord = ПолучитьМакет("Макет1");
Документ = MSWord.Получить();
// Устанавливаем заголовок в свойствах документа
// Это имя Word предложит при сохранении
Документ.BuiltInDocumentProperties("Title").Value = "Приказ_на_отпуск_Иванов_ИИ";
// Делаем документ видимым для пользователя
Документ.Application.Visible = Истина;
Документ.Activate();
Важный нюанс: При указании значения не рекомендуется добавлять расширение файла (например, .doc или .docx). Word сам добавит нужное расширение в зависимости от версии офиса и настроек пользователя. Если добавить расширение вручную, можно столкнуться с проблемой «двойного расширения».
Если нам необходимо не просто надеяться на стандартное поведение Word, а принудительно вызвать окно сохранения с уже заполненным именем, мы можем воспользоваться коллекцией Dialogs. Для диалога «Сохранить как» используется идентификатор 84 (константа wdDialogFileSaveAs).
Разберем этот метод по шагам:
Приложение = Документ.Application;
ДиалогСохранения = Приложение.Dialogs(84); // 84 - это wdDialogFileSaveAs
// Задаем предлагаемое имя файла
ДиалогСохранения.Name = "Трудовой_договор_№15";
// Вызываем диалог. Метод Show() открывает окно, но не закрывает документ.
ДиалогСохранения.Show();
Этот способ удобен тем, что мы можем программно контролировать момент появления окна, при этом оставляя за пользователем выбор конечной папки для сохранения файла.
Иногда требуется изменить визуальное отображение названия документа в верхней строке окна Word. Это также может повлиять на имя сохранения в некоторых версиях MS Office, хотя метод с BuiltInDocumentProperties считается более стабильным.
Посмотрим на пример кода:
// Обращаемся к активному окну документа
Документ.ActiveWindow.Caption = "Справка_о_доходах_2023";
Стоит учитывать, что свойство Caption меняет только текст в заголовке окна. Если пользователь в дальнейшем воспользуется функцией «Сохранить как», Word сначала посмотрит в свойства документа (Title), и если там пусто, может использовать заголовок окна или первые строки текста документа.
В конфигурациях на базе 1С:Предприятие 8.2 (таких как ЗУП 2.5) использование Active document имеет свои ограничения. Поскольку документ является внедренным объектом, он иногда ведет себя иначе, чем документ, открытый напрямую через COM-объект Word.Application.
Если вышеперечисленные методы не срабатывают из-за специфики безопасности системы или настроек Office, рекомендуется использовать комбинированный подход:
Проанализируем пример такого подхода:
ИмяФайла = "Расчетный_листок_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd") + ".doc";
ПутьКФайлу = КаталогВременныхФайлов() + ИмяФайла;
// Сохраняем невидимо для пользователя
Документ.SaveAs(ПутьКФайлу);
// Теперь открываем уже именованный файл
Документ.Application.Visible = Истина;
Документ.Activate();
В этом случае, когда пользователь нажмет «Сохранить», файл уже будет иметь путь и имя, и Word просто обновит текущий файл во временном каталоге. Если же пользователь выберет «Сохранить как», в поле имени файла уже будет стоять ваше заданное значение.
Подведем итог и выделим основные правила работы с именами файлов Word в 1С:
Макет.Получить(), используйте свойство .Application для доступа к общим командам Ворда.BuiltInDocumentProperties("Title") для установки имени «по умолчанию». Это самый чистый способ, не нарушающий пользовательский опыт.КаталогВременныхФайлов(), помните, что эти файлы могут накапливаться, хотя система обычно очищает их при перезагрузке.Использование данных методов позволит сделать работу пользователей с печатными формами в формате Microsoft Word более профессиональной и исключит ошибки при ручном вводе имен файлов.