Как сохранить документ Word через ДиалогВыбораФайла в 1С?

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

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

Реализация сохранения в обычных формах (синхронный вызов)

Разберем по шагам классический пример, который отлично подходит для обычных форм. В данном сценарии мы создаем экземпляр ДиалогВыбораФайла с режимом сохранения, запрашиваем путь у пользователя и выполняем метод SaveAs объекта Word.

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


// Инициализация COM-объекта
Попытка
    ОбъектВорд = Новый COMОбъект("Word.Application");
Исключение
    Сообщить("Ошибка при запуске Microsoft Word: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
    Возврат;
КонецПопытки;

ОбъектВорд.Documents.Add("C:\Шаблоны\Документ Microsoft Word.docx");
ШаблонВорд = ОбъектВорд.ActiveDocument;

// Здесь происходит редактирование документа...

// Настройка диалога сохранения файла
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Заголовок = "Выберите имя файла для сохранения";
Диалог.МножественныйВыбор = Ложь;
Диалог.Фильтр = "Документ Word (*.docx)|*.docx|Все файлы (*.*)|*.*";

Если Диалог.Выбрать() Тогда
    ИмяФайла = Диалог.ПолноеИмяФайла;
    
    // Сохранение файла
    ШаблонВорд.SaveAs(ИмяФайла);
    
    // Отключение сообщений и закрытие Word
    ОбъектВорд.DisplayAlerts = -1; 
    ОбъектВорд.Quit(0);
КонецЕсли;

// Очистка памяти
ШаблонВорд = Неопределено;
ОбъектВорд = Неопределено;

Проанализируем ключевые моменты данного кода:

  1. Мы задаем фильтр через свойство Фильтр. Важно всегда добавлять возможность выбора всех файлов, чтобы пользователь мог гибко управлять расширениями.
  2. Метод Выбрать() приостанавливает выполнение кода и ждет, пока пользователь нажмет "Сохранить" или "Отмена".

Управление поведением MS Word: подавление ошибок и закрытие

Обратим особое внимание на строки с DisplayAlerts и Quit. В процессе отладки и работы с COM-объектами часто возникают зависания фоновых процессов winword.exe. Выясним причину и как этого избежать.

Свойство DisplayAlerts = -1 (или Ложь) отключает показ любых системных сообщений и предупреждений от самого Word (например, о перезаписи существующего файла или подтверждении закрытия). Метод Quit(0) завершает работу приложения, где параметр 0 означает закрытие без сохранения текущих изменений (поскольку мы уже сохранили документ принудительно через SaveAs).

Важный совет для отладки: Если при выполнении кода файл не сохраняется и ошибок в 1С не возникает, закомментируйте строки подавления сообщений и закрытия программы. Вместо них добавьте команду ОбъектВорд.Visible = Истина;. Это позволит развернуть окно программы и увидеть, какую именно ошибку или диалоговое окно выдает сам Microsoft Word.

Особенности работы в управляемых формах (Асинхронность и Клиент-Сервер)

Рассмотрим ситуацию, если разработка ведется в современных конфигурациях на базе управляемых форм. Использование синхронного метода Выбрать() в веб-клиенте недопустимо, а логика работы разделяется на контексты.

  1. Разделение контекста: Диалог выбора файла может быть вызван только на клиенте. При этом формирование самого COM-объекта часто выполняется на сервере (если 1С-сервер работает под ОС Windows и там установлен пакет MS Office).
  2. Правильный алгоритм: Сгенерируйте файл Word на сервере и сохраните его во временную папку. Затем поместите файл во временное хранилище и передайте адрес на клиент. Уже на клиенте вызовите асинхронный диалог сохранения и сохраните полученные двоичные данные.
  3. Асинхронный вызов: Используйте функцию ВыбратьАсинх() вместе с оператором Ждать (доступно в новых версиях платформы 8.3).

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


&НаКлиенте
Асинх Процедура СохранитьФайлНаКлиенте(АдресВХранилище)
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
    Диалог.Фильтр = "Документ Word (*.docx)|*.docx";
    
    ВыбранныеФайлы = Ждать Диалог.ВыбратьАсинх();
    
    Если ВыбранныеФайлы <> Неопределено Тогда
        ПутьСохранения = ВыбранныеФайлы[0];
        // Получаем файл из хранилища и сохраняем по выбранному пути
        ДанныеФайла = Ждать ПолучитьФайлССервераАсинх(АдресВХранилище, ПутьСохранения);
    КонецЕсли;
КонецПроцедуры

Корректное освобождение памяти

Не забывайте, что вызова метода Quit для COM-объекта недостаточно. Процесс может остаться "висеть" в оперативной памяти компьютера. Чтобы этого избежать, всегда явно обнуляйте ссылки на COM-объекты, присваивая им значение Неопределено в конце процедуры.

← На главную