Как исправить ошибку «В данной процедуре / функции не был установлен безопасный режим» в 1С:Бухгалтерия 3.0?

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

При обновлении конфигурации 1С:Бухгалтерия предприятия 3.0 (например, до версии 3.0.72.70 и выше) пользователи часто сталкиваются с критической ошибкой, которая блокирует запуск программы. Система выдает сообщение: Ошибка при вызове метода контекста (УстановитьБезопасныйРежим): В данной процедуре/ функции не был установлен безопасный режим. Чаще всего это происходит в общем модуле СтандартныеПодсистемыСервер в процедуре ПроверитьВозможностьЗапуска.

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

Причина возникновения ошибки: логика работы платформы

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

Если код пытается «понизить» уровень безопасности, когда безопасный режим был установлен неявно (например, через настройки профиля безопасности в консоли кластера или через свойства расширения), платформа блокирует это действие и выбрасывает исключение. Рассмотрим основные факторы, которые приводят к этому конфликту:

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

Решение 1. Настройка профиля безопасности в консоли кластера

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

  1. Запустим консоль Администрирование серверов 1С:Предприятия.
  2. Найдем в дереве серверов нужный кластер, затем перейдем в ветку Информационные базы.
  3. Откроем Свойства нашей проблемной информационной базы.
  4. Найдем поле Профиль безопасности. Если в нем выбрано какое-либо значение, попробуем установить его в состояние (отсутствует).
  5. Сохраним изменения и попробуем снова запустить клиентское приложение.

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

Решение 2. Программная «заплатка» (исправление кода)

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

Найдем общий модуль СтандартныеПодсистемыСервер и процедуру, в которой происходит ошибка (обычно это ПроверитьВозможностьЗапуска). Типовой код может выглядеть так:


// ... код процедуры
УстановитьБезопасныйРежим(Ложь);
// ... код процедуры

Нам необходимо изменить этот участок, чтобы метод УстановитьБезопасныйРежим(Ложь) вызывался только тогда, когда безопасный режим действительно включен. Рассмотрим пример безопасного вызова:


// Добавляем проверку текущего состояния
Если БезопасныйРежим() Тогда
    Попытка
        УстановитьБезопасныйРежим(Ложь);
    Исключение
        // Записываем событие в журнал регистрации, чтобы понимать масштаб проблемы
        ЗаписьЖурналаРегистрации("ОшибкиОбновления", УровеньЖурналаРегистрации.Предупреждение, , , 
            "Не удалось программно отключить безопасный режим");
    КонецПопытки;
КонецЕсли;

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

Решение 3. Проверка расширений конфигурации

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

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

Решение 4. Принудительное завершение обновления

Иногда ошибка возникает из-за того, что параметры сеанса не успели инициализироваться правильно при первом запуске после обновления. Попробуем форсировать процесс:

Запустим базу в режиме Толстого клиента или через конфигуратор с параметром запуска /C ЗапуститьОбновлениеИнформационнойБазы. Это может помочь системе пройти участки кода, связанные с проверкой прав доступа, в привилегированном режиме.

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


Если БезопасныйРежим() <> ПрофильИнформационнойБазы Тогда
    // Профиль ИБ не доступен для выполнения обработчиков.
    УстановитьБезопасныйРежим(Ложь);
    // ... дальнейшая логика проверки
КонецЕсли;

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

Резюме

Мы выяснили, что ошибка «В данной процедуре не был установлен безопасный режим» — это результат ужесточения контроля платформы над контекстом исполнения. Для решения проблемы в БП 3.0 рекомендуется:

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

← На главную