Почему зависает Excel при программном открытии через 1С и как это исправить?

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

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

Рассмотрим пример кода, на котором часто происходит зависание:


Попытка
    Excel = Новый COMОбъект("Excel.Application");
    Excel.DisplayAlerts = 0;
    Excel.Visible = 0;
Исключение
    Сообщить(ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Зависание может происходить на этой строке
Книга = Excel.Workbooks.Open(Файл);    

// Или на этой строке
Лист = Книга.Sheets(1);

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

1. Отладка зависаний: включаем видимость приложения

Первое, что мы рекомендуем сделать при любых зависаниях COM-объекта — это сделать окно Excel видимым. В коде инициализации свойство DisplayAlerts установлено в 0, что должно подавлять предупреждения. Однако, это свойство не отключает абсолютно все окна. Поменяем параметр Visible на истину:

Excel.Visible = 1; // или True

Запустим код еще раз и посмотрим на экран. Очень часто Excel зависает из-за того, что ожидает реакции пользователя на диалоговое окно, которое невозможно программно закрыть через DisplayAlerts. Это может быть окно активации продукта, запрос на принятие лицензионного соглашения или уведомление о макросах. Если вы увидите такое окно, закройте его вручную, и в дальнейшем зависания прекратятся.

2. Переустановка пакета MS Office

Если код прекрасно работает на других компьютерах, но зависает на конкретном рабочем месте, проблема может крыться в самом приложении MS Office. Как показывает практика (и опыт автора из рассмотренного случая), иногда внутренние компоненты Office могут быть повреждены. Полная переустановка Microsoft Office часто решает проблему необъяснимых зависаний при обращении к файлам.

3. Создание системных папок Desktop (при работе на сервере 1С)

Проанализируем ситуацию, когда код запускается не на клиенте, а на стороне сервера 1С. В 64-битных операционных системах Windows серверу для работы с Excel требуются специальные системные директории. Их отсутствие — самая частая причина "мертвого" зависания. Разберем по шагам, что нужно сделать:

  1. Откроем проводник Windows на сервере.
  2. Перейдем по пути C:\Windows\System32\config\systemprofile\ и создадим там папку с именем Desktop.
  3. Если используется 64-битная ОС, обязательно перейдем по пути C:\Windows\SysWOW64\config\systemprofile\ и также создадим папку Desktop.
  4. Перезапустим службу сервера 1С или просто попробуем выполнить код заново.

4. Отключение режима «Защищенного просмотра» (Protected View)

Выясним причину зависания при работе с файлами из интернета или локальной сети. Современные версии Excel по умолчанию открывают потенциально небезопасные файлы в "Защищенном просмотре". В режиме COM-соединения это приводит к бесконечному ожиданию, так как желтая полоса сверху окна требует клика пользователя для разрешения редактирования.

Для исправления необходимо зайти в сам Excel (без 1С), открыть «Параметры» -> «Центр управления безопасностью» -> «Параметры центра управления безопасностью». Там мы можем либо добавить нужную директорию (откуда 1С берет файлы) в «Надежные расположения», либо отключить защищенный просмотр для файлов из сети.

5. Зависшие фоновые процессы и корректное завершение

Рассмотрим, что происходит, когда наш код в 1С падает с ошибкой до выполнения команды закрытия Excel. В оперативной памяти остается висеть невидимый процесс EXCEL.EXE. Со временем таких процессов накапливается множество, они блокируют файлы и конфликтуют друг с другом. Откроем Диспетчер задач и принудительно завершим все фоновые процессы Excel.

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


Попытка
    // Работа с файлом
Исключение
    Сообщить(ОписаниеОшибки());
    Если Excel <> Неопределено Тогда
        Excel.Quit();
    КонецЕсли;
КонецПопытки;

6. Настройка прав доступа DCOM

Если сервер 1С работает под специфическим пользователем (обычно это USR1CV8), у него банально может не быть прав на запуск компонентов DCOM. Проверим и настроим права:

  1. Нажмем Win+R и введем dcomcnfg.
  2. Перейдем в "Службы компонентов" -> "Компьютеры" -> "Мой компьютер" -> "Настройка DCOM".
  3. Найдем в списке Microsoft Excel Application.
  4. В свойствах перейдем на вкладку "Безопасность" и в разделах "Разрешения на запуск и активацию" и "Разрешения на доступ" добавим нашего пользователя (например, USR1CV8), дав ему полные права.

7. Конфликт с надстройками (Add-ins) и тяжелые файлы

Иногда Excel пытается подгрузить различные надстройки (от антивирусов, PDF-редакторов и прочих программ), которые блокируют COM-взаимодействие. Попробуем запустить Excel вручную в безопасном режиме (удерживая клавишу Ctrl при запуске) или отключить все COM-надстройки в параметрах.

Также стоит обратить внимание на сам файл. Существует известный баг: если в открываемом файле задвинуты ярлычки листов полосой прокрутки или имеется огромное количество пустых отформатированных ячеек (особенно в файлах, которые генерирует сама 1С при сохранении табличного документа), Excel может долго висеть на инициализации отображения. Попробуем пересохранить файл в формате .xlsx (если он был в старом .xls) и очистить неиспользуемые диапазоны ячеек.

Проанализировав все эти пункты и применив нужные решения, мы сможем добиться стабильной работы связки 1С и Microsoft Excel через COM-соединение без неожиданных зависаний.

← На главную