Почему зависает открытие формы документа при использовании расширений в 1С 8.3.10 и как отключить безопасный режим?

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

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

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

Причины изменения поведения безопасного режима в 8.3.10

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

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

Способ 1. Программное отключение безопасного режима перед защищенным вызовом

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

Посмотрим на пример безопасного переключения контекста:


ТекущийРежим = БезопасныйРежим();
Попытка
    // Снимаем безопасный режим для выполнения защищенной функции
    УстановитьБезопасныйРежим(Ложь);
    
    // Вызов защищенной процедуры системы лицензирования
    ЗащищенныеФункцииСервер.ПроверитьЛицензиюИЗаполнитьДанные(ДокументОбъект);
    
Исключение
    // В случае ошибки восстанавливаем режим и пробрасываем исключение
    УстановитьБезопасныйРежим(ТекущийРежим);
    ВызватьИсключение;
КонецПопытки;

// Возвращаем исходный режим после успешного выполнения
УстановитьБезопасныйРежим(ТекущийРежим);

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


// В модулях с поддержкой БСП
УстановитьОтключениеБезопасногоРежима(Истина);
Попытка
    ЗащищенныеФункцииСервер.ВыполнитьДействие();
Исключение
    УстановитьОтключениеБезопасногоРежима(Ложь);
    ВызватьИсключение;
КонецПопытки;
УстановитьОтключениеБезопасногоРежима(Ложь);

Способ 2. Изоляция обращения в привилегированный общий модуль

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

Разберем по шагам настройку модуля:

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

Способ 3. Отключение защиты от опасных действий через conf.cfg

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

Найдем файл conf.cfg в каталоге установки 1С (обычно C:\Program Files\1cv8\conf\conf.cfg) и добавим строку с маской подключения к информационной базе:

DisableUnsafeActionProtection=.*

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

Способ 4. Настройка профилей безопасности кластера серверов 1С

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

  1. В консоли администрирования кластера серверов 1С откроем раздел Профили безопасности.
  2. Создадим профиль и назначим его расширению или информационной базе.
  3. В свойствах профиля явно разрешим:
    1. Загрузку внешних компонент защиты (указав имя библиотеки или маску).
    2. Исходящие сетевые TCP-соединения к серверу лицензирования СЛК (по умолчанию порт 9099 для СЛК 3.0 или 1199 для СЛК 2.0).
    3. Доступ к каталогам хранения ключей защиты на сервере.

Способ 5. Обновление компонент защиты и версии платформы

Если проблема вызвана несовместимостью системы защиты отраслевого решения (Рарус, 1С-Совместно) с обновленной моделью безопасности платформы:

  1. Обратимся к разработчику отраслевого решения и обновим компоненты системы лицензирования (СЛК/Катран) до актуальной версии, поддерживающей платформы 8.3.10 и выше.
  2. Обновим саму платформу «1С:Предприятие» до старших стабильных релизов (ветки 8.3.12+), где ошибки наследования безопасного режима расширениями были полностью устранены разработчиками платформы.
← На главную