При переходе конфигураций на платформу 1С:Предприятие 8.3.10 разработчики нередко сталкиваются с ситуацией, когда формы документов (особенно в отраслевых решениях, использующих внешние системы защиты и лицензирования СЛК/Катран) намертво зависают при открытии. При этом в предыдущих версиях платформы (например, 8.3.9) тот же самый код выполнялся быстро и без ошибок.
Анализ стека вызовов показывает, что зависание происходит на сервере в защищенных модулях конфигурации, а функция БезопасныйРежим() внезапно начинает возвращать значение Истина, даже если в свойствах подключенного расширения флаг безопасного режима снят. Разберем подробно, почему меняется контекст выполнения и как восстановить нормальную работоспособность системы.
Начиная с версии 8.3.9 и с существенными доработками в 8.3.10, фирма «1С» изменила механизм защиты от потенциально опасных действий стороннего кода (внешних отчетов, обработок и расширений). Проанализируем ключевые особенности этого механизма:
ПриСозданииНаСервере или ПриСозданииНаСервереПосле), платформа распространяет контекст безопасного режима на весь серверный процесс создания формы. В результате даже код основной конфигурации внутри модуля формы выполняется при установленном БезопасныйРежим() = Истина.ПодключитьВнешнююКомпоненту()), сетевой обмен через сокеты, вызовы COM-объектов, исполнение команд операционной системы и доступ к файловой системе вне разрешенных каталогов.УстановитьПривилегированныйРежим(Истина) игнорируется платформой. Защищенный модуль лицензирования (СЛК/Катран), пытаясь обратиться к службе лицензирования через внешнюю компоненту или TCP-порт, попадает в непрерывный цикл ожидания или взаимоблокировку (таймаут), что визуально выглядит как зависание формы при открытии.Если код основной конфигурации открыт для доработки или вы модифицируете модуль формы через расширение, наиболее надежный способ — принудительно сбросить безопасный режим перед обращением к защищенному функционалу, а затем вернуть его исходное состояние.
Посмотрим на пример безопасного переключения контекста:
ТекущийРежим = БезопасныйРежим();
Попытка
// Снимаем безопасный режим для выполнения защищенной функции
УстановитьБезопасныйРежим(Ложь);
// Вызов защищенной процедуры системы лицензирования
ЗащищенныеФункцииСервер.ПроверитьЛицензиюИЗаполнитьДанные(ДокументОбъект);
Исключение
// В случае ошибки восстанавливаем режим и пробрасываем исключение
УстановитьБезопасныйРежим(ТекущийРежим);
ВызватьИсключение;
КонецПопытки;
// Возвращаем исходный режим после успешного выполнения
УстановитьБезопасныйРежим(ТекущийРежим);
Если в конфигурации используется Библиотека Стандартных Подсистем (БСП), рекомендуется использовать штатные механизмы управления безопасным контекстом:
// В модулях с поддержкой БСП
УстановитьОтключениеБезопасногоРежима(Истина);
Попытка
ЗащищенныеФункцииСервер.ВыполнитьДействие();
Исключение
УстановитьОтключениеБезопасногоРежима(Ложь);
ВызватьИсключение;
КонецПопытки;
УстановитьОтключениеБезопасногоРежима(Ложь);
Так как вызов УстановитьПривилегированныйРежим() внутри безопасного режима подавляется, вызов внешних компонент и лицензионных функций можно вынести в отдельный общий модуль основной конфигурации.
Разберем по шагам настройку модуля:
ЛицензированиеСерверПривилегированный).Для тестовых и закрытых контуров предприятий можно централизованно отключить механизм защиты от опасных действий, отредактировав конфигурационный файл платформы conf.cfg.
Найдем файл conf.cfg в каталоге установки 1С (обычно C:\Program Files\1cv8\conf\conf.cfg) и добавим строку с маской подключения к информационной базе:
DisableUnsafeActionProtection=.*
Данная директива отключает проверку потенциально опасных действий для всех информационных баз сервера, предотвращая блокировку загрузки внешних компонент и расширений.
В промышленной эксплуатации клиент-серверных баз полное отключение безопасности не рекомендуется. Правильный подход — создание специализированного профиля безопасности:
9099 для СЛК 3.0 или 1199 для СЛК 2.0).Если проблема вызвана несовместимостью системы защиты отраслевого решения (Рарус, 1С-Совместно) с обновленной моделью безопасности платформы: