Как исправить ошибку «Установлен безопасный режим. Выполнение операции запрещено» при работе с Excel через COM в 1С

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

Рассмотрим распространенную и крайне неприятную ситуацию, с которой часто сталкиваются разработчики при внедрении внешних обработок. Под учетной записью администратора обработка по загрузке или выгрузке данных в Microsoft Excel отрабатывает без нареканий. Однако при попытке запустить её под правами обычного пользователя система выдает ошибку: «Установлен безопасный режим. Выполнение операции запрещено». Попытки прописать в коде регистрации отключение безопасного режима не помогают, а при переносе в дополнительные обработки система и вовсе может аварийно завершить работу («вылететь»).

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

Выясняем причину: разница между Безопасным режимом и Защитой от опасных действий

Прежде чем переходить к настройкам, проанализируем, почему стандартные советы из интернета часто не работают. Очень часто разработчики путают два абсолютно разных механизма защиты платформы:

  1. Защита от опасных действий. Этот механизм отвечает за появление интерактивного предупреждения при открытии внешних файлов (когда система спрашивает: «Вы доверяете этому файлу?»). Отключение этого механизма через конфигуратор у конкретного пользователя или глобально через параметр DisableUnsafeActionProtection в файле conf.cfg лишь убирает всплывающее диалоговое окно. Оно не снимает ограничения на выполнение операций в коде.
  2. Безопасный режим платформы. Это жесткое ограничение среды исполнения кода. Если для сеанса или конкретного модуля установлен безопасный режим, платформа на аппаратном уровне блокирует создание любых COM-объектов (включая Excel.Application), выполнение системных команд, доступ к локальной файловой системе сервера и сетевые запросы. Именно этот режим блокирует работу вашего кода.

Почему ошибка возникает именно при интерактивном открытии через Файл — Открыть? При использовании Библиотеки стандартных подсистем (БСП) платформа принудительно запускает код интерактивно открываемых внешних обработок в безопасном режиме для всех пользователей, у которых нет административных прав. При этом любые параметры регистрации, указанные внутри обработки, полностью игнорируются, так как файл запускается «напрямую» в обход справочника дополнительных обработок.

Решение 1. Правильная регистрация COM-объекта в БСП (Рекомендуемый способ)

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

Разберем по шагам, как модифицировать код вашей обработки в функции СведенияОВнешнейОбработке для явного запроса прав на работу с Microsoft Excel:


Функция СведенияОВнешнейОбработке() Экспорт

    // Задаем версию БСП, используемую в вашей конфигурации
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("3.1.5.132");
    
    ПараметрыReg.Наименование = "Загрузка данных из Excel";
    ПараметрыReg.Версия = "1.0";
    ПараметрыReg.БезопасныйРежим = Истина; // Оставляем безопасный режим включенным!
    
    // Создаем массив для хранения запрашиваемых разрешений
    МассивРазрешений = Новый Массив;
    
    // Запрашиваем точечное разрешение на создание COM-класса Excel
    ProgID = "Excel.Application";
    CLSID = "{00024500-0000-0000-C000-000000000046}";
    
    Разрешение = РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса(ProgID, CLSID);
    МассивРазрешений.Добавить(Разрешение);
    
    // Вставляем массив разрешений в параметры регистрации
    ПараметрыРегистрации.Вставить("Разрешения", МассивРазрешений);
    
    Возврат ПараметрыРегистрации;

КонецФункции

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

Решение 2. Отключение использования профилей безопасности в базе

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

Для этого выполним следующие действия:

  1. Запустите сеанс «1С:Предприятие» под учетной записью с административными правами.
  2. Перейдите в меню «Функции для технического специалиста» (в старых версиях платформы это меню называлось «Все функции»).
  3. Найдите и откройте раздел Константы.
  4. В списке констант найдите параметр «Используются профили безопасности» (в некоторых конфигурациях он может называться «Использовать профили безопасности для внешних модулей»).
  5. Снимите флаг (установите значение в Ложь), запишите изменения и перезапустите пользовательские сеансы.

Решение 3. Настройка прав DCOM на сервере (если 1С «вылетает» при запуске)

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

Чтобы исправить это поведение на сервере Windows, выполним настройку системных компонентов DCOM:

  1. На сервере, где запущен служба кластера 1С, нажмите сочетание клавиш Win + R, введите dcomcnfg и нажмите Enter.
  2. Перейдите по пути: Службы компонентов — Компьютеры — Мой компьютер — Настройка DCOM.
  3. Найдите в списке элемент Microsoft Excel Application (или имя класса {00024500-0000-0000-C000-000000000046}).
  4. Откройте его свойства и перейдите на вкладку Безопасность.
  5. В группе «Права на запуск и активацию» выберите вариант «Настроить» и нажмите «Изменить». Добавьте туда учетную запись, под которой запущена служба сервера 1С (обычно это локальный пользователь USR1CV8 или сетевая служба NetworkService), и предоставьте ей полные права на локальный запуск и локальную активацию.

Важная тонкость: Для корректной работы COM-объектов MS Office на сервере Windows под учетными записями служб обязательно должны существовать специальные системные папки рабочего стола. Создайте вручную следующие директории на сервере (в зависимости от разрядности операционной системы):

Решение 4. Прогрессивный метод — отказ от использования COM в пользу встроенных механизмов 1С

Использование технологии COM постепенно уходит в прошлое из-за своей нестабильности, привязки к операционной системе Windows и жестких требований к установке пакета MS Office непосредственно на сервере 1С. Мы рекомендуем полностью отказаться от создания COMОбъект("Excel.Application") в пользу нативных платформенных методов работы с файлами .xlsx.

Современные версии платформы «1С:Предприятие 8.3» позволяют легко прочитать данные из любого файла Excel напрямую, не задействуя сторонние приложения и библиотеки. Посмотрим, как элегантно переписать процедуру чтения файла:


&НаСервере
Процедура ПрочитатьФайлExcelНаСервере(ПутьКФайлу)

    ТабДок = Новый ТабличныйДокумент;
    
    Попытка
        // Чтение файла XLSX встроенными средствами платформы
        ТабДок.Прочитать(ПутьКФайлу, СпособИмпортаТабличногоДокумента.XLSX);
    Исключение
        ВызватьИсключение "Не удалось прочитать файл. Ошибка: " + ОписаниеОшибки();
    КонецПопытки;
    
    // Обходим строки и колонки полученной таблицы
    КоличествоСтрок = ТабДок.ВысотаТаблицы;
    КоличествоКолонок = ТабДок.ШиринаТаблицы;
    
    Для НомерСтроки = 1 По КоличествоСтрок Цикл
        
        // Получаем значение из конкретной ячейки
        КодТовара = ТабДок.Область(НомерСтроки, 1).Текст;
        Наименование = ТабДок.Область(НомерСтроки, 2).Текст;
        Цена = ТабДок.Область(НомерСтроки, 3).Текст;
        
        // Выполняем дальнейшую обработку полученных данных
        
    КонецЦикла;

КонецПроцедуры

Применение встроенного метода Прочитать() объекта ТабличныйДокумент дает нам колоссальные преимущества:

← На главную