При программной интеграции 1С с Microsoft Excel через COM-соединение разработчики часто сталкиваются с неприятной проблемой: код выполняется корректно, но на определенном этапе приложение намертво зависает. Проанализируем типичную ситуацию: есть обработка, которая должна открыть существующий файл Excel и записать в него данные. Инициализация объекта проходит успешно, но на методах открытия книги или получения листа процесс останавливается.
Рассмотрим пример кода, на котором часто происходит зависание:
Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.DisplayAlerts = 0;
Excel.Visible = 0;
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
// Зависание может происходить на этой строке
Книга = Excel.Workbooks.Open(Файл);
// Или на этой строке
Лист = Книга.Sheets(1);
Давайте подробно разберем, почему возникает эта ошибка и какие шаги мы можем предпринять для ее решения.
Первое, что мы рекомендуем сделать при любых зависаниях COM-объекта — это сделать окно Excel видимым. В коде инициализации свойство DisplayAlerts установлено в 0, что должно подавлять предупреждения. Однако, это свойство не отключает абсолютно все окна. Поменяем параметр Visible на истину:
Excel.Visible = 1; // или True
Запустим код еще раз и посмотрим на экран. Очень часто Excel зависает из-за того, что ожидает реакции пользователя на диалоговое окно, которое невозможно программно закрыть через DisplayAlerts. Это может быть окно активации продукта, запрос на принятие лицензионного соглашения или уведомление о макросах. Если вы увидите такое окно, закройте его вручную, и в дальнейшем зависания прекратятся.
Если код прекрасно работает на других компьютерах, но зависает на конкретном рабочем месте, проблема может крыться в самом приложении MS Office. Как показывает практика (и опыт автора из рассмотренного случая), иногда внутренние компоненты Office могут быть повреждены. Полная переустановка Microsoft Office часто решает проблему необъяснимых зависаний при обращении к файлам.
Проанализируем ситуацию, когда код запускается не на клиенте, а на стороне сервера 1С. В 64-битных операционных системах Windows серверу для работы с Excel требуются специальные системные директории. Их отсутствие — самая частая причина "мертвого" зависания. Разберем по шагам, что нужно сделать:
C:\Windows\System32\config\systemprofile\ и создадим там папку с именем Desktop.C:\Windows\SysWOW64\config\systemprofile\ и также создадим папку Desktop.Выясним причину зависания при работе с файлами из интернета или локальной сети. Современные версии Excel по умолчанию открывают потенциально небезопасные файлы в "Защищенном просмотре". В режиме COM-соединения это приводит к бесконечному ожиданию, так как желтая полоса сверху окна требует клика пользователя для разрешения редактирования.
Для исправления необходимо зайти в сам Excel (без 1С), открыть «Параметры» -> «Центр управления безопасностью» -> «Параметры центра управления безопасностью». Там мы можем либо добавить нужную директорию (откуда 1С берет файлы) в «Надежные расположения», либо отключить защищенный просмотр для файлов из сети.
Рассмотрим, что происходит, когда наш код в 1С падает с ошибкой до выполнения команды закрытия Excel. В оперативной памяти остается висеть невидимый процесс EXCEL.EXE. Со временем таких процессов накапливается множество, они блокируют файлы и конфликтуют друг с другом. Откроем Диспетчер задач и принудительно завершим все фоновые процессы Excel.
Чтобы избежать этого в будущем, всегда нужно корректно закрывать приложение, особенно в блоках обработки исключений:
Попытка
// Работа с файлом
Исключение
Сообщить(ОписаниеОшибки());
Если Excel <> Неопределено Тогда
Excel.Quit();
КонецЕсли;
КонецПопытки;
Если сервер 1С работает под специфическим пользователем (обычно это USR1CV8), у него банально может не быть прав на запуск компонентов DCOM. Проверим и настроим права:
dcomcnfg.USR1CV8), дав ему полные права.Иногда Excel пытается подгрузить различные надстройки (от антивирусов, PDF-редакторов и прочих программ), которые блокируют COM-взаимодействие. Попробуем запустить Excel вручную в безопасном режиме (удерживая клавишу Ctrl при запуске) или отключить все COM-надстройки в параметрах.
Также стоит обратить внимание на сам файл. Существует известный баг: если в открываемом файле задвинуты ярлычки листов полосой прокрутки или имеется огромное количество пустых отформатированных ячеек (особенно в файлах, которые генерирует сама 1С при сохранении табличного документа), Excel может долго висеть на инициализации отображения. Попробуем пересохранить файл в формате .xlsx (если он был в старом .xls) и очистить неиспользуемые диапазоны ячеек.
Проанализировав все эти пункты и применив нужные решения, мы сможем добиться стабильной работы связки 1С и Microsoft Excel через COM-соединение без неожиданных зависаний.