Как устранить ошибку «Установлен безопасный режим. Выполнение операции запрещено» при создании COM-объекта в расширении?

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

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

{...}: Ошибка при вызове конструктора (COMОбъект): AppExcel = Новый COMОбъект("Excel.Application"); по причине: Установлен безопасный режим. Выполнение операции запрещено

Разберем подробнее, почему платформа 1С блокирует данное действие, как правильно настроить свойства расширения для разрешения работы с COM и какие существуют альтернативные способы решения исходной задачи.

Причины возникновения ошибки

Платформа 1С:Предприятие 8.3 по умолчанию запускает подключаемые модули и расширения в изолированном контексте — безопасном режиме. Безопасный режим предназначен для предотвращения несанкционированных действий потенциально ненадежного кода и накладывает строгие системные ограничения. В этом режиме категорически запрещены:

  1. Создание и вызов любых COM-объектов (COMОбъект).
  2. Загрузка и подключение внешних компонент.
  3. Вызов внешних программ, утилит и системных команд операционной системы.
  4. Прямой доступ к файловой системе сервера и клиента (за исключением работы с предопределенными временными каталогами).
  5. Выполнение привилегированного кода с повышением прав.

Попытка отключить безопасный режим непосредственно в коде модуля расширения с помощью вызова функции УстановитьБезопасныйРежим(Ложь) не даст результата и завершится системным исключением, так как исполняемый контекст не имеет прав на снятие ограничений с самого себя.

Основное решение: отключение безопасного режима у расширения

Для предоставления расширению доступа к механизму COM необходимо снять признак безопасного режима на уровне конфигурации расширения либо в пользовательском интерфейсе.

Шаг 1. Настройка свойств расширения в конфигураторе

  1. Откроем дерево метаданных и перейдем в меню Конфигурация — Расширения конфигурации.
  2. В появившемся списке расширений выделим требуемое расширение и откроем его палитру свойств (через контекстное меню или нажатием клавиши F4).
  3. В палитре свойств найдем параметр Безопасный режим и снимем установленный флажок (переведем значение в Ложь).
  4. Сохраним изменения в расширении и обновим конфигурацию базы данных.

Шаг 2. Проверка параметров подключения в режиме «1С:Предприятие»

Если конфигурация работает на базе Библиотеки стандартных подсистем (БСП), настройки безопасного режима также сохраняются в пользовательском интерфейсе базы данных:

  1. Запустим режим «1С:Предприятие» под пользователем с административными правами.
  2. Перейдем в раздел Администрирование — Печатные формы, отчеты и обработки — Расширения.
  3. В списке установленных расширений снимем флажок в колонке Безопасный режим для нашего расширения. Если флажок останется активным в интерфейсе предприятия, платформа продолжит блокировать обращение к COM-объектам даже при снятом флаге в конфигураторе.

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

Решение сопутствующей ошибки контролируемых свойств

При изменении свойств расширения платформа выполняет проверку совместимости с основной конфигурацией. Нередко возникает предупреждение: Значение контролируемого свойства РежимСовместимостиИнтерфейса у объекта не совпадает со значением в расширяемой конфигурации.

Платформа требует, чтобы ключевые свойства управления поведением интерфейса у расширения строго соответствовали свойствам основной конфигурации. Для устранения предупреждения выполним следующие действия:

  1. Откроем свойства корневого узла основной конфигурации и посмотрим значения параметров: Режим совместимости, Режим совместимости интерфейса и Использовать управляемые формы в обычном приложении.
  2. Откроем свойства корневого узла нашего расширения и установим точно такие же значения в одноименных контролируемых свойствах.

Корректная работа с объектом Excel.Application

Если работа с COM-объектом сохраняется, необходимо учитывать архитектурные особенности платформы и операционной системы:

  1. Разрядность приложений: 64-разрядный клиент или сервер 1С не сможет инициализировать 32-разрядный COM-сервер Excel без специальной настройки системных библиотек в компонентах DCOM. Убедитесь в совпадении разрядности 1С и Microsoft Office.
  2. Зависание системных процессов: При нештатном завершении кода процесс EXCEL.EXE остается в диспетчере задач операционной системы. Все операции с COM обязательно нужно обрамлять конструкцией Попытка ... Исключение с гарантированным закрытием приложения.

Посмотрим на пример безопасного освобождения памяти:


Попытка
    AppExcel = Новый COMОбъект("Excel.Application");
    AppExcel.DisplayAlerts = Ложь;
    AppExcel.Visible = Ложь;
    
    Книга = AppExcel.Workbooks.Add();
    // Алгоритм заполнения данных
    
    Книга.SaveAs(ПутьКФайлу);
    Книга.Close();
Исключение
    Если AppExcel <> Неопределено Тогда
        AppExcel.Quit();
        AppExcel = Неопределено;
    КонецЕсли;
    ВызватьИсключение;
КонецПопытки;

Если AppExcel <> Неопределено Тогда
    AppExcel.Quit();
    AppExcel = Неопределено;
КонецЕсли;

Альтернативный вариант: выгрузка без использования COM

Использование COM-соединения считается устаревшим и платформозависимым подходом (код полностью неработоспособен на серверах и клиентах под управлением Linux, а также в веб-клиенте). Наиболее надежный способ сформировать файл Excel — использование встроенного объекта ТабличныйДокумент.

Преимущества формирования через табличный документ:

  1. Не требуется наличие установленного MS Excel на сервере или рабочем месте пользователя.
  2. Кроссплатформенность: корректная работа под управлением Windows, Linux и в веб-браузерах.
  3. Высокая скорость генерации данных и отсутствие риска утечки процессов операционной системы.

Разберем пример реализации выгрузки:


ТабДок = Новый ТабличныйДокумент;

// Заполнение макета или программное добавление областей
// Например: ТабДок.Вывести(ОбластьШапки);

Попытка
    ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Исключение
    ЗаписьЖурналаРегистрации("ВыгрузкаВExcel", УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    ВызватьИсключение "Не удалось сохранить файл Excel: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;

Использование встроенных механизмов платформы позволяет отказаться от необходимости снижать уровень безопасности расширения и исключает появление ошибок блокировки внешних объектов.

← На главную