Каждый разработчик 1С рано или поздно сталкивается с ситуациями во время отладки, которые буквально «взрывают мозг». Одна из таких классических загадок — странное поведение платформы «1С:Предприятие» при попытке отладить процедуру УстановкаПараметровСеанса в модуле сеанса. Вы ставите точку останова в самом начале процедуры, пытаетесь посмотреть значение параметра через окно «Вычислить выражение» (Shift + F9), а он уже инициализирован! При этом точка останова в коде инициализации просто игнорируется.
Давайте подробно разберем, почему так происходит, как устроена внутренняя кухня платформы 1С и какими методами можно обойти этот «эффект наблюдателя» при отладке.
Представим стандартную ситуацию. Мы изучаем конфигурацию (например, «Библиотеку стандартных подсистем» — БСП) и хотим пошагово проследить, как при старте системы заполняется параметр сеанса ТекущийПользователь. Для этого мы выполняем следующие шаги:
УстановкаПараметровСеанса.Shift + F9 (или открываем панель «Табло») и вводим выражение ПараметрыСеанса.ТекущийПользователь, чтобы убедиться, что там пусто.Создается ощущение мистики: код инициализации физически выполнился (это легко проверить, если вставить в процедуру запись лога в текстовый файл), но отладчик проигнорировал точку останова в модуле установки этого параметра. Давайте выясним истинную причину этого явления.
Для оптимизации производительности и экономии серверной памяти платформа «1С:Предприятие» использует механизм отложенной (ленивой) инициализации параметров сеанса. Они не создаются все скопом в момент авторизации пользователя.
Когда система стартует, инициализируются только самые базовые системные механизмы. Любые прикладные параметры сеанса (такие как текущий пользователь, организация по умолчанию, настройки прав доступа RLS) остаются «пустыми» до тех пор, пока к ним не обратится какой-либо участок кода.
Как только в коде происходит обращение вида:
ТекущийПользовательСистемы = ПараметрыСеанса.ТекущийПользователь;
Платформа понимает, что параметр еще не определен, приостанавливает выполнение текущего потока и автоматически вызывает процедуру УстановкаПараметровСеанса в модуле сеанса, передавая в нее имя запрашиваемого параметра.
Когда мы останавливаемся в самом начале процедуры УстановкаПараметровСеанса, сам параметр ТекущийПользователь еще действительно не инициализирован. Но как только мы нажимаем Shift + F9 и просим отладчик вычислить выражение ПараметрыСеанса.ТекущийПользователь, мы сами принудительно инициируем обращение к нему!
Платформа послушно пытается вычислить это выражение на сервере. Так как параметр не инициализирован, она неявно (в фоновом режиме) запускает процедуру УстановкаПараметровСеанса.
Но почему же тогда не срабатывает точка останова внутри этой процедуры?
Это важнейший защитный механизм платформы 1С. Вычисление выражений в отладчике (через «Табло» или Shift + F9) происходит в реальном контексте исполнения, но с жестким ограничением: при выполнении кода, инициированного самим отладчиком, все точки останова временно блокируются.
Если бы платформа этого не делала, возникла бы бесконечная рекурсия (так называемый dead-lock):
Именно поэтому при вычислении выражения код инициализации выполняется «втихую». Он отрабатывает, записывает данные в файлы, если это прописано в коде, заполняет параметр сеанса, но интерфейс конфигуратора никак не выдает этот процесс разработчику. А когда вы закрываете окно оценки выражения и нажимаете F8 (Шагнуть обойти), параметр сеанса уже инициализирован, и повторно процедура инициализации для него вызываться не будет.
Если вы хотите лично убедиться в наличии скрытого вызова, вы можете использовать простой прием с записью лога в файл, как это сделал автор темы на форуме. Разберем этот пример по шагам.
Добавьте в процедуру инициализации конкретного параметра сеанса (или в общий модуль, который им занимается) следующий код:
лТекст = Новый ТекстовыйДокумент;
лТекст.ДобавитьСтроку("Процедура инициализации вызвана неявно!");
лТекст.Записать("C:\temp\debug_log.txt");
Установите точку останова на вызове этой процедуры. Запустите отладку. При остановке в модуле сеанса проверьте папку C:\temp\ — файла там еще нет. Теперь нажмите Shift + F9 и вычислите значение проверяемого параметра сеанса. Точка останова внутри общего модуля не сработает, однако на диске мгновенно появится файл debug_log.txt. Это прямое доказательство того, что код выполнился в обход механизмов отладки.
Чтобы процесс отладки не превращался в хаос, а переменные не инициализировались в самый неподходящий момент, мы рекомендуем придерживаться нескольких простых правил.
Панель «Табло» (вызывается по сочетанию клавиш Ctrl + Alt + W) вычисляет добавленные в нее выражения автоматически на каждом шаге отладки (при каждом нажатии F8, F7 или F5). Если вы случайно оставите там строку ПараметрыСеанса.ИмяПараметра, отладчик незаметно для вас инициализирует этот параметр при первом же шаге программы, заблокировав точки останова в коде инициализации.
Перед началом сессии отладки модуля сеанса всегда полностью очищайте список вычисляемых выражений в Табло.
ИменаПараметровСеансаПредопределенная процедура УстановкаПараметровСеанса(ИменаПараметровСеанса) принимает на вход массив имен параметров, которые платформа требует инициализировать прямо сейчас.
Если вы хотите понять, какой именно параметр затребовал код, не запрашивайте сами параметры сеанса напрямую. Вместо этого в окне Shift + F9 анализируйте значение переменной ИменаПараметровСеанса. Это безопасно, так как чтение локального массива не вызывает побочных эффектов инициализации на сервере.
Иногда требуется поймать момент, когда некий неизвестный модуль пытается прочитать еще не инициализированный параметр сеанса. Чтобы локализовать эту строку кода, выполните следующие действия:
Если интерактивный отладчик слишком сильно искажает логику работы системы из-за «эффекта наблюдателя», воспользуйтесь механизмом замера производительности:
В открывшейся таблице вы увидите абсолютно чистую хронологию вызовов функций без какого-либо вмешательства со стороны окон просмотра выражений. Вы сможете точно определить, какие процедуры общего модуля вызывались, сколько раз и в какой последовательности.
Понимание этих архитектурных особенностей платформы «1С:Предприятие» сбережет вам массу времени и нервов при анализе сложных конфигураций!