Модуль сеанса в 1С 8.3: где найти и как поймать точку останова
Содержание
Модуль сеанса открывается из корня дерева конфигурации: в конфигураторе щёлкните правой кнопкой по самой верхней строке «Конфигурация» и выберите Открыть модуль сеанса. Чтобы отладить его, поставьте точку останова (F9) внутри процедуры УстановкаПараметровСеанса и запустите Отладка → Начать отладку (F5). В серверной базе перед этим нужно включить отладку на сервере 1С, иначе остановки не будет.
Типичная ситуация: программист добавил новый параметр сеанса «ТекущийСклад», а у части пользователей он пустой. Код в модуле сеанса выполняется до того, как откроется первое окно программы, и «на глаз» его не проверить. Только отладчик покажет, с каким пользователем и в каком порядке заполняются параметры.
Зачем нужен модуль сеанса и когда он выполняется
Модуль сеанса — серверный модуль конфигурации. В нём обычно одна процедура-обработчик:
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
Если ТребуемыеПараметры = Неопределено Тогда
// Вызов при старте сеанса: заполняем то, что нужно сразу
ПараметрыСеанса.ТекущийПользователь = ОпределитьТекущегоПользователя();
Иначе
// Обращение к параметру, который ещё не установлен
Для Каждого ИмяПараметра Из ТребуемыеПараметры Цикл
УстановитьПараметр(ИмяПараметра);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Функции ОпределитьТекущегоПользователя и УстановитьПараметр здесь — условные процедуры того же модуля, их пишет разработчик.
Ключевые свойства модуля, которые влияют на отладку:
- 🖥️ Выполняется только на сервере. В клиент-серверной базе это рабочий процесс кластера, а не компьютер пользователя.
- 🔓 Работает в привилегированном режиме. Права текущего пользователя здесь не проверяются, поэтому ошибка доступа «пропадает» именно в этом модуле.
- 🔁 Вызывается дважды по-разному. При старте сеанса параметр
ТребуемыеПараметрыравенНеопределено. Позже, при первом обращении к неустановленному параметру сеанса, платформа вызывает обработчик повторно и передаёт массив имён. - 🌐 Срабатывает для любого сеанса: тонкий и толстый клиент, веб-клиент, фоновое задание, внешнее соединение (COM), HTTP- и веб-сервисы.
В конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) обработчик короткий: он передаёт управление в общий модуль СтандартныеПодсистемыСервер. Основная логика лежит там, и отлаживать придётся с заходом внутрь (F11).
Как открыть модуль сеанса в конфигураторе
Способов несколько, результат одинаковый.
- Откройте базу в режиме
Конфигуратор, затемКонфигурация → Открыть конфигурацию. - В дереве метаданных щёлкните правой кнопкой по корневому узлу (верхняя строка с именем конфигурации).
- Выберите
Открыть модуль сеанса.
Рядом в том же контекстном меню находятся модуль управляемого приложения, модуль обычного приложения и модуль внешнего соединения. Их часто путают: код в модуле управляемого приложения выполняется на клиенте, а модуль сеанса — на сервере.
Если модуль пустой и вы только начинаете, создайте обработчик через шаблон: в открытом модуле вызовите список процедур на панели модуля и выберите УстановкаПараметровСеанса — платформа вставит заготовку с правильной сигнатурой.
Модуль открывается и в расширении конфигурации, если расширение заимствует корень конфигурации. Так в типовую базу без снятия с поддержки добавляют свой код через аннотацию &После("УстановкаПараметровСеанса").
Чтобы точка останова сработала, модуль должен совпадать с конфигурацией базы данных. Если вы правили код, обновите конфигурацию базы данных (F7) перед запуском отладки.
Подготовка: чем отличается отладка файловой и серверной базы
| Вариант базы | Где выполняется модуль сеанса | Что нужно сделать заранее |
|---|---|---|
| Файловая | В процессе клиентского приложения | Ничего: отладчик подключается сразу |
| Клиент-серверная | В рабочем процессе кластера 1С | Включить отладку на сервере 1С |
| Клиент-серверная, отладка по HTTP | В рабочем процессе кластера | Включить HTTP-отладку на сервере и в конфигураторе |
Файловая база
Здесь всё просто. Серверный код исполняется в том же процессе, что и клиент, поэтому F5 из конфигуратора достаточно. Именно поэтому сложную логику модуля сеанса удобно сначала отлаживать на файловой копии базы.
Клиент-серверная база
Агент сервера 1С (ragent) нужно запустить с ключом -debug. Для службы Windows это делается так:
- Откройте
services.mscи найдите службу агента сервера 1С:Предприятия 8.3. Запомните её точное имя. - В редакторе реестра перейдите в ветку
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\и откройте раздел с этим именем. - В параметре
ImagePathпослеragent.exeи остальных ключей допишите-debug. Для отладки по HTTP —-debug -http. - Перезапустите службу.
Перезапуск службы агента обрывает все сеансы пользователей на этом сервере. Делайте это вне рабочего времени или на тестовом сервере. Отладку на продуктивном кластере лучше не включать вовсе: копия базы на тестовом сервере безопаснее.
Если на сервере включён режим HTTP, в конфигураторе тоже выберите отладку по протоколу HTTP в параметрах (Сервис → Параметры, раздел про запуск и отладку). Конфигуратор сам поднимет сервер отладки dbgs, по умолчанию он слушает порт 1550.
Запуск сеанса под отладчиком и остановка в модуле
Порядок действий одинаков для обоих вариантов базы.
- Поставьте курсор на первую исполняемую строку процедуры
УстановкаПараметровСеансаи нажмитеF9. Слева появится красная точка. - В клиент-серверной базе откройте
Отладка → Подключение, нажмитеАвтоматическое подключениеи отметьте тип предмета отладки «Сервер». Без этого серверная часть нового сеанса может не подключиться к отладчику вовремя. - Запустите
Отладка → Начать отладку → Тонкий клиент(или нужный вам клиент).F5запускает клиент, заданный в параметрах по умолчанию. - При старте сеанса выполнение остановится на точке, строка подсветится. Окно клиента в этот момент ещё не открыто — это нормально.
Клавиши, которые понадобятся сразу:
| Действие | Клавиша |
|---|---|
| Шаг с заходом в процедуру | F11 |
| Шаг без захода | F10 |
| Выйти из текущей процедуры | Shift+F11 |
| Продолжить до следующей точки | F5 |
| Выполнить до курсора | Shift+F10 |
| Вычислить выражение | Shift+F9 |
Чтобы снова пройти старт сеанса, не нужно закрывать всё вручную: Отладка → Перезапустить завершает отлаживаемый клиент и запускает его заново.
Когда модуль вызывается много раз (например, при каждом обращении к параметру), ставьте точку останова с условием. В контекстном меню строки выберите вариант точки с условием и напишите, например, ТребуемыеПараметры = Неопределено — остановка будет только при старте сеанса.
Стек вызовов: кто вызвал модуль сеанса
При первом входе в УстановкаПараметровСеанса стек почти пуст: вызов идёт напрямую от платформы. Интереснее повторные вызовы, когда ТребуемыеПараметры не равен Неопределено. По стеку видно, какой код обратился к ещё не установленному параметру.
Откройте Отладка → Стек вызовов (Ctrl+Alt+C). В окне:
- 📍 верхняя строка — текущая процедура модуля сеанса;
- ⬇️ ниже — модуль и строка, где произошло обращение к
ПараметрыСеанса.ИмяПараметра; - 🖱️ двойной щелчок по строке открывает этот модуль на нужной строке и показывает переменные в том контексте.
Так находят самую неприятную ошибку модуля сеанса — рекурсию. Если внутри обработчика прочитать параметр, который ещё не установлен, платформа снова вызовет обработчик, тот снова прочитает параметр — и так до переполнения стека. В окне стека это выглядит как длинная колонка одинаковых строк УстановкаПараметровСеанса.
Правило против рекурсии: при установке параметров используйте локальные переменные, а не читайте ПараметрыСеанса до их записи. И всегда заполняйте все имена из массива ТребуемыеПараметры, иначе вызов закончится ошибкой.
Переменные, параметры сеанса и контекст пользователя
Отладчик даёт три инструмента для просмотра данных.
Локальные переменные. Окно Отладка → Локальные показывает все переменные текущей процедуры, включая ТребуемыеПараметры. Массив разворачивается, видно каждое имя параметра.
Табло (Ctrl+Alt+W). Сюда добавляют выражения, которые нужно видеть постоянно на каждом шаге. Полезный набор для модуля сеанса:
ПользователиИнформационнойБазы.ТекущийПользователь().Имя
ПривилегированныйРежим()
ПараметрыСеанса.ТекущийПользователь
Вычислить выражение (Shift+F9). Вычисляет произвольное выражение на текущей строке. Работает и с запросами: можно проверить, что вернёт функция определения пользователя, не дожидаясь следующего шага.
Осторожно с вычислением ПараметрыСеанса.Имя в Табло, пока параметр не установлен. Это то же самое обращение, что и в коде: оно может вызвать повторный вход в обработчик или ошибку, и картина отладки исказится. Смотрите значения после строки, где параметр записан.
Привилегированный режим тоже влияет на картину. ПривилегированныйРежим() в модуле сеанса вернёт Истина, поэтому запросы видят все данные без ограничений RLS. Если у пользователя «всё работает при входе, но падает в форме», причина часто здесь: в модуле сеанса проверка прав просто не выполнялась.
Модуль сеанса в фоновых заданиях и внешних соединениях
Каждое фоновое задание — отдельный сеанс. Значит, УстановкаПараметровСеанса выполнится и при его старте, причём от имени пользователя, запустившего задание. У регламентного задания пользователь задаётся в его настройках; если он не указан, сеанс работает без конкретного пользователя ИБ.
Чтобы остановиться в модуле сеанса фонового задания:
- Откройте
Отладка → Подключение → Автоматическое подключение. - Отметьте тип «Фоновое задание» (в серверной базе — вместе с «Сервер»).
- Поставьте точку в
УстановкаПараметровСеансаи запустите задание из клиента, который уже работает под отладкой.
Отладчик подключится к новому сеансу задания и остановится на точке. Поставьте условие по имени пользователя, если фоновых заданий много, иначе каждая регламентная операция будет вас прерывать.
Для внешних соединений, HTTP- и веб-сервисов логика та же: в автоматическом подключении включают соответствующий тип предмета отладки. HTTP-сервисы на веб-сервере дополнительно требуют разрешить отладку в публикации, иначе их сеансы к отладчику не подключаются.
Почему точка останова в модуле сеанса не срабатывает
Если ни один пункт не подошёл, проверьте, не выполняется ли нужный вам код раньше модуля сеанса или вообще не в нём. Логика старта программы распределена: модуль сеанса отрабатывает на сервере, а потом клиентский модуль управляемого приложения вызывает ПередНачаломРаботыСистемы и ПриНачалеРаботыСистемы. Ошибку «после входа» нередко ищут не в том модуле.