При доработке типовых конфигураций через механизм расширений разработчики часто сталкиваются с ошибкой времени выполнения при попытке программно инициализировать внешние компоненты, запустить внешние приложения или создать COM-объект:
{...}: Ошибка при вызове конструктора (COMОбъект): AppExcel = Новый COMОбъект("Excel.Application"); по причине: Установлен безопасный режим. Выполнение операции запрещено
Разберем подробнее, почему платформа 1С блокирует данное действие, как правильно настроить свойства расширения для разрешения работы с COM и какие существуют альтернативные способы решения исходной задачи.
Платформа 1С:Предприятие 8.3 по умолчанию запускает подключаемые модули и расширения в изолированном контексте — безопасном режиме. Безопасный режим предназначен для предотвращения несанкционированных действий потенциально ненадежного кода и накладывает строгие системные ограничения. В этом режиме категорически запрещены:
COMОбъект).Попытка отключить безопасный режим непосредственно в коде модуля расширения с помощью вызова функции УстановитьБезопасныйРежим(Ложь) не даст результата и завершится системным исключением, так как исполняемый контекст не имеет прав на снятие ограничений с самого себя.
Для предоставления расширению доступа к механизму COM необходимо снять признак безопасного режима на уровне конфигурации расширения либо в пользовательском интерфейсе.
Шаг 1. Настройка свойств расширения в конфигураторе
F4).Ложь).Шаг 2. Проверка параметров подключения в режиме «1С:Предприятие»
Если конфигурация работает на базе Библиотеки стандартных подсистем (БСП), настройки безопасного режима также сохраняются в пользовательском интерфейсе базы данных:
Обратите внимание: если в клиент-серверном варианте развернуты и активны Профили безопасности кластера 1С, одного снятия флажков может быть недостаточно. Потребуется явно прописать разрешение на создание COM-классов в настройках используемого профиля безопасности кластера серверов.
При изменении свойств расширения платформа выполняет проверку совместимости с основной конфигурацией. Нередко возникает предупреждение: Значение контролируемого свойства РежимСовместимостиИнтерфейса у объекта не совпадает со значением в расширяемой конфигурации.
Платформа требует, чтобы ключевые свойства управления поведением интерфейса у расширения строго соответствовали свойствам основной конфигурации. Для устранения предупреждения выполним следующие действия:
Режим совместимости, Режим совместимости интерфейса и Использовать управляемые формы в обычном приложении.Если работа с COM-объектом сохраняется, необходимо учитывать архитектурные особенности платформы и операционной системы:
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-соединения считается устаревшим и платформозависимым подходом (код полностью неработоспособен на серверах и клиентах под управлением Linux, а также в веб-клиенте). Наиболее надежный способ сформировать файл Excel — использование встроенного объекта ТабличныйДокумент.
Преимущества формирования через табличный документ:
Разберем пример реализации выгрузки:
ТабДок = Новый ТабличныйДокумент;
// Заполнение макета или программное добавление областей
// Например: ТабДок.Вывести(ОбластьШапки);
Попытка
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Исключение
ЗаписьЖурналаРегистрации("ВыгрузкаВExcel", УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение "Не удалось сохранить файл Excel: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;
Использование встроенных механизмов платформы позволяет отказаться от необходимости снижать уровень безопасности расширения и исключает появление ошибок блокировки внешних объектов.