При интеграции 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);
КонецЕсли;
// Очистка памяти
ШаблонВорд = Неопределено;
ОбъектВорд = Неопределено;
Проанализируем ключевые моменты данного кода:
Фильтр. Важно всегда добавлять возможность выбора всех файлов, чтобы пользователь мог гибко управлять расширениями.Выбрать() приостанавливает выполнение кода и ждет, пока пользователь нажмет "Сохранить" или "Отмена".Обратим особое внимание на строки с DisplayAlerts и Quit. В процессе отладки и работы с COM-объектами часто возникают зависания фоновых процессов winword.exe. Выясним причину и как этого избежать.
Свойство DisplayAlerts = -1 (или Ложь) отключает показ любых системных сообщений и предупреждений от самого Word (например, о перезаписи существующего файла или подтверждении закрытия). Метод Quit(0) завершает работу приложения, где параметр 0 означает закрытие без сохранения текущих изменений (поскольку мы уже сохранили документ принудительно через SaveAs).
Важный совет для отладки: Если при выполнении кода файл не сохраняется и ошибок в 1С не возникает, закомментируйте строки подавления сообщений и закрытия программы. Вместо них добавьте команду ОбъектВорд.Visible = Истина;. Это позволит развернуть окно программы и увидеть, какую именно ошибку или диалоговое окно выдает сам Microsoft Word.
Рассмотрим ситуацию, если разработка ведется в современных конфигурациях на базе управляемых форм. Использование синхронного метода Выбрать() в веб-клиенте недопустимо, а логика работы разделяется на контексты.
ВыбратьАсинх() вместе с оператором Ждать (доступно в новых версиях платформы 8.3).Посмотрим на пример асинхронного вызова диалога на клиенте:
&НаКлиенте
Асинх Процедура СохранитьФайлНаКлиенте(АдресВХранилище)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Фильтр = "Документ Word (*.docx)|*.docx";
ВыбранныеФайлы = Ждать Диалог.ВыбратьАсинх();
Если ВыбранныеФайлы <> Неопределено Тогда
ПутьСохранения = ВыбранныеФайлы[0];
// Получаем файл из хранилища и сохраняем по выбранному пути
ДанныеФайла = Ждать ПолучитьФайлССервераАсинх(АдресВХранилище, ПутьСохранения);
КонецЕсли;
КонецПроцедуры
Не забывайте, что вызова метода Quit для COM-объекта недостаточно. Процесс может остаться "висеть" в оперативной памяти компьютера. Чтобы этого избежать, всегда явно обнуляйте ссылки на COM-объекты, присваивая им значение Неопределено в конце процедуры.