Каждый разработчик 1С рано или поздно сталкивается с парадоксальной ситуацией: мы устанавливаем точку останова в самом начале процедуры УстановкаПараметровСеанса модуля сеанса, запускаем отладку и видим, что параметры сеанса уже заполнены значениями. Возникает закономерный вопрос: почему это произошло, если процедура как раз и предназначена для их первичной установки?
Разберем природу этого явления, выясним, что такое «эффект отладчика», как платформа 1С работает с неинициализированными параметрами сеанса и как правильно организовать диагностику и код модуля сеанса.
Процедура УстановкаПараметровСеанса вызывается платформой в двух случаях:
ТребуемыеПараметры равен значению Неопределено).ТребуемыеПараметры передается массив с именами запрашиваемых параметров).Когда мы останавливаемся на точке останова, среда разработки пытается отобразить текущее состояние переменных. Именно здесь и проявляется «эффект отладчика». Проанализируем, как это происходит:
ПараметрыСеанса.ТекущийПользователь) или переменной, обращающейся к нему, отладчик отправляет фоновый запрос к серверу на вычисление значения.УстановкаПараметровСеанса.В результате платформа выполняет расчет в фоновом режиме еще до того, как мы успеваем нажать клавишу пошагового выполнения кода. Когда мы наконец смотрим на значения параметров, они уже заполнены.
Если нам необходимо выяснить, какой именно участок конфигурации первым обращается к параметрам сеанса или почему определенный параметр не установлен вовремя, интерактивная отладка может искажать картину. Рассмотрим проверенные способы решения этой проблемы.
ЗаписьЖурналаРегистрации().Посмотрим на пример логирования внутри модуля сеанса, который позволяет точно определить, какие параметры запрашиваются и из какого места кода произошел вызов:
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
ИменаПараметров = "";
Если ТребуемыеПараметры = Неопределено Тогда
ИменаПараметров = "Все параметры (старт сеанса)";
Иначе
Для Каждого ИмяПараметра Из ТребуемыеПараметры Цикл
ИменаПараметров = ИменаПараметров + ИмяПараметра + "; ";
КонецЦикла;
КонецЕсли;
ТекстСобытия = "Запрос параметров: " + ИменаПараметров;
// Для получения точки вызова перехватим стек через исключение
Попытка
ВызватьИсключение "";
Исключение
ТекстСобытия = ТекстСобытия + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;
ЗаписьЖурналаРегистрации(
"ИнициализацияПараметровСеанса",
УровеньЖурналаРегистрации.Информация,,,
ТекстСобытия
);
// Далее следует штатный код инициализации
УстановитьНужныеПараметры(ТребуемыеПараметры);
КонецПроцедуры
Чтобы избежать скрытых ошибок и неконтролируемых вызовов инициализации, проанализируем базовые правила проектирования логики в модуле сеанса:
ТребуемыеПараметры = Неопределено. Полная загрузка существенно замедляет запуск сеансов, веб-сервисов и фоновых заданий. Заполнять нужно только тот минимум, без которого сеанс не может начать работу.Таким образом, видимость уже заполненных параметров в точке останова — это естественное следствие архитектуры платформы 1С. Использование логирования в журнал регистрации и аккуратная очистка окон отладки позволяют полностью контролировать процесс инициализации.