Почему регламентное задание не подхватывает настройки защиты от опасных действий в расширении?

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

При работе с расширениями в среде «1С:Предприятие 8.3» разработчики часто сталкиваются с ситуацией, когда изменение свойств расширения (например, снятие флага «Защита от опасных действий») визуально сохранено, но система продолжает вести себя так, будто действуют старые ограничения. Особенно остро это проявляется в регламентных и фоновых заданиях, которые взаимодействуют с внешними компонентами или COM-соединениями. В этой статье мы разберем механизмы кэширования серверных процессов, влияние параметров безопасности на системного пользователя и правильные подходы к доработке кода в расширениях.

Анализ механизма работы фоновых заданий с расширениями

Прежде всего, разберем, как платформа запускает регламентное задание. В отличие от интерактивного сеанса пользователя, фоновое задание выполняется в процессе rphost на стороне сервера. Когда вы вносите изменения в расширение, эти изменения должны быть подхвачены всеми активными процессами кластера. Рассмотрим основные причины, по которым это может не происходить:

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

Решение 1: Очистка серверного кэша и перезапуск процессов

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

Рассмотрим процедуру полной очистки серверного кэша. На сервере 1С данные расширений и конфигураций кэшируются в папке служебных файлов (обычно это путь вида C:\Program Files\1cv8\srvinfo\reg_1541\). Внутри этой директории находятся папки snccntxt, содержащие контексты сеансов.

Алгоритм действий:

Это заставит систему при первом же обращении к регламентному заданию перекомпилировать расширение с актуальными настройками защиты.

Решение 2: Проверка COM-компоненты и разрядности сервера

Поскольку проблема часто проявляется именно при использовании COM-соединения, проанализируем программную среду. Фоновое задание выполняется на сервере, следовательно, COM-объект должен быть зарегистрирован именно там. Если сервер 1С имеет разрядность 64 бита (x64), а используемая библиотека 32-битная, соединение не установится, что иногда ошибочно интерпретируется как «защита от опасных действий».

Убедимся, что регистрация выполнена корректно через regsvr32. Также проверим права доступа системной учетной записи, под которой запущена служба 1С (обычно это USR1CV8), к соответствующим веткам реестра и папкам с DLL-библиотеками.

Решение 3: Программное управление безопасным режимом

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


&Вместо("ВыполнитьОбменДанными")
Процедура Расш1_ВыполнитьОбменДанными(Параметры)
    
    // Принудительно отключаем безопасный режим для текущего потока, 
    // чтобы разрешить работу с внешними объектами и COM
    УстановитьБезопасныйРежим(Ложь);
    
    Попытка
        // Пример инициализации COM-соединения
        COMОбъект = Новый COMОбъект("V83.COMConnector");
        // Дальнейшая логика работы с объектом
    Исключение
        ЗаписьЖурналаРегистрации("Ошибка COM", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Использование функции УстановитьБезопасныйРежим(Ложь) позволяет внутри конкретного вызова гарантировать отсутствие ограничений, накладываемых платформой на выполнение «опасного» кода.

Решение 4: Переход от &Вместо к &ИзменениеИКонтроль

Выясним еще одну важную техническую деталь. Использование аннотации &Вместо полностью подменяет логику типового модуля. Это может приводить к тому, что некоторые инициализационные механизмы безопасности, предусмотренные в типовом коде, игнорируются или работают некорректно. Рассмотрим более современный и безопасный метод — &ИзменениеИКонтроль.

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

Итоги и рекомендации

Подведем итог нашему исследованию. Если регламентное задание «не видит» изменений в защите от опасных действий:

  1. Проверьте, что в справочнике «Расширения» (в режиме «1С:Предприятие», если используется БСП) настройки безопасности синхронизированы. Иногда БСП хранит собственные настройки прав для расширений, которые имеют приоритет над установленными в конфигураторе.
  2. Убедитесь, что для расширения снят флаг «Безопасный режим». Без этого COM-соединение не заработает.
  3. Выполните перезапуск рабочих процессов rphost или очистку кэша, чтобы исключить влияние старых сеансов.
  4. Проверьте, под каким пользователем запускается задание. Если это конкретный пользователь, убедитесь, что в его карточке в Конфигураторе также снята галочка «Защита от опасных действий».

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

← На главную