Модуль сеанса в 1С 8.3: где найти и как поймать точку останова

· 9 мин

Содержание

Модуль сеанса открывается из корня дерева конфигурации: в конфигураторе щёлкните правой кнопкой по самой верхней строке «Конфигурация» и выберите Открыть модуль сеанса. Чтобы отладить его, поставьте точку останова (F9) внутри процедуры УстановкаПараметровСеанса и запустите Отладка → Начать отладку (F5). В серверной базе перед этим нужно включить отладку на сервере 1С, иначе остановки не будет.

Типичная ситуация: программист добавил новый параметр сеанса «ТекущийСклад», а у части пользователей он пустой. Код в модуле сеанса выполняется до того, как откроется первое окно программы, и «на глаз» его не проверить. Только отладчик покажет, с каким пользователем и в каком порядке заполняются параметры.

Зачем нужен модуль сеанса и когда он выполняется

Модуль сеанса — серверный модуль конфигурации. В нём обычно одна процедура-обработчик:

Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)

	Если ТребуемыеПараметры = Неопределено Тогда
		// Вызов при старте сеанса: заполняем то, что нужно сразу
		ПараметрыСеанса.ТекущийПользователь = ОпределитьТекущегоПользователя();
	Иначе
		// Обращение к параметру, который ещё не установлен
		Для Каждого ИмяПараметра Из ТребуемыеПараметры Цикл
			УстановитьПараметр(ИмяПараметра);
		КонецЦикла;
	КонецЕсли;

КонецПроцедуры

Функции ОпределитьТекущегоПользователя и УстановитьПараметр здесь — условные процедуры того же модуля, их пишет разработчик.

Ключевые свойства модуля, которые влияют на отладку:

  • 🖥️ Выполняется только на сервере. В клиент-серверной базе это рабочий процесс кластера, а не компьютер пользователя.
  • 🔓 Работает в привилегированном режиме. Права текущего пользователя здесь не проверяются, поэтому ошибка доступа «пропадает» именно в этом модуле.
  • 🔁 Вызывается дважды по-разному. При старте сеанса параметр ТребуемыеПараметры равен Неопределено. Позже, при первом обращении к неустановленному параметру сеанса, платформа вызывает обработчик повторно и передаёт массив имён.
  • 🌐 Срабатывает для любого сеанса: тонкий и толстый клиент, веб-клиент, фоновое задание, внешнее соединение (COM), HTTP- и веб-сервисы.

В конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) обработчик короткий: он передаёт управление в общий модуль СтандартныеПодсистемыСервер. Основная логика лежит там, и отлаживать придётся с заходом внутрь (F11).

Как открыть модуль сеанса в конфигураторе

Способов несколько, результат одинаковый.

  1. Откройте базу в режиме Конфигуратор, затем Конфигурация → Открыть конфигурацию.
  2. В дереве метаданных щёлкните правой кнопкой по корневому узлу (верхняя строка с именем конфигурации).
  3. Выберите Открыть модуль сеанса.

Рядом в том же контекстном меню находятся модуль управляемого приложения, модуль обычного приложения и модуль внешнего соединения. Их часто путают: код в модуле управляемого приложения выполняется на клиенте, а модуль сеанса — на сервере.

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

Модуль открывается и в расширении конфигурации, если расширение заимствует корень конфигурации. Так в типовую базу без снятия с поддержки добавляют свой код через аннотацию &После("УстановкаПараметровСеанса").

Чтобы точка останова сработала, модуль должен совпадать с конфигурацией базы данных. Если вы правили код, обновите конфигурацию базы данных (F7) перед запуском отладки.

Подготовка: чем отличается отладка файловой и серверной базы

Вариант базыГде выполняется модуль сеансаЧто нужно сделать заранее
ФайловаяВ процессе клиентского приложенияНичего: отладчик подключается сразу
Клиент-сервернаяВ рабочем процессе кластера 1СВключить отладку на сервере 1С
Клиент-серверная, отладка по HTTPВ рабочем процессе кластераВключить HTTP-отладку на сервере и в конфигураторе

Файловая база

Здесь всё просто. Серверный код исполняется в том же процессе, что и клиент, поэтому F5 из конфигуратора достаточно. Именно поэтому сложную логику модуля сеанса удобно сначала отлаживать на файловой копии базы.

Клиент-серверная база

Агент сервера 1С (ragent) нужно запустить с ключом -debug. Для службы Windows это делается так:

  1. Откройте services.msc и найдите службу агента сервера 1С:Предприятия 8.3. Запомните её точное имя.
  2. В редакторе реестра перейдите в ветку HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ и откройте раздел с этим именем.
  3. В параметре ImagePath после ragent.exe и остальных ключей допишите -debug. Для отладки по HTTP — -debug -http.
  4. Перезапустите службу.

Перезапуск службы агента обрывает все сеансы пользователей на этом сервере. Делайте это вне рабочего времени или на тестовом сервере. Отладку на продуктивном кластере лучше не включать вовсе: копия базы на тестовом сервере безопаснее.

Если на сервере включён режим HTTP, в конфигураторе тоже выберите отладку по протоколу HTTP в параметрах (Сервис → Параметры, раздел про запуск и отладку). Конфигуратор сам поднимет сервер отладки dbgs, по умолчанию он слушает порт 1550.

Запуск сеанса под отладчиком и остановка в модуле

Порядок действий одинаков для обоих вариантов базы.

  1. Поставьте курсор на первую исполняемую строку процедуры УстановкаПараметровСеанса и нажмите F9. Слева появится красная точка.
  2. В клиент-серверной базе откройте Отладка → Подключение, нажмите Автоматическое подключение и отметьте тип предмета отладки «Сервер». Без этого серверная часть нового сеанса может не подключиться к отладчику вовремя.
  3. Запустите Отладка → Начать отладку → Тонкий клиент (или нужный вам клиент). F5 запускает клиент, заданный в параметрах по умолчанию.
  4. При старте сеанса выполнение остановится на точке, строка подсветится. Окно клиента в этот момент ещё не открыто — это нормально.

Клавиши, которые понадобятся сразу:

ДействиеКлавиша
Шаг с заходом в процедуруF11
Шаг без заходаF10
Выйти из текущей процедурыShift+F11
Продолжить до следующей точкиF5
Выполнить до курсораShift+F10
Вычислить выражениеShift+F9

Чтобы снова пройти старт сеанса, не нужно закрывать всё вручную: Отладка → Перезапустить завершает отлаживаемый клиент и запускает его заново.

Когда модуль вызывается много раз (например, при каждом обращении к параметру), ставьте точку останова с условием. В контекстном меню строки выберите вариант точки с условием и напишите, например, ТребуемыеПараметры = Неопределено — остановка будет только при старте сеанса.

Стек вызовов: кто вызвал модуль сеанса

При первом входе в УстановкаПараметровСеанса стек почти пуст: вызов идёт напрямую от платформы. Интереснее повторные вызовы, когда ТребуемыеПараметры не равен Неопределено. По стеку видно, какой код обратился к ещё не установленному параметру.

Откройте Отладка → Стек вызовов (Ctrl+Alt+C). В окне:

  • 📍 верхняя строка — текущая процедура модуля сеанса;
  • ⬇️ ниже — модуль и строка, где произошло обращение к ПараметрыСеанса.ИмяПараметра;
  • 🖱️ двойной щелчок по строке открывает этот модуль на нужной строке и показывает переменные в том контексте.

Так находят самую неприятную ошибку модуля сеанса — рекурсию. Если внутри обработчика прочитать параметр, который ещё не установлен, платформа снова вызовет обработчик, тот снова прочитает параметр — и так до переполнения стека. В окне стека это выглядит как длинная колонка одинаковых строк УстановкаПараметровСеанса.

Правило против рекурсии: при установке параметров используйте локальные переменные, а не читайте ПараметрыСеанса до их записи. И всегда заполняйте все имена из массива ТребуемыеПараметры, иначе вызов закончится ошибкой.

Переменные, параметры сеанса и контекст пользователя

Отладчик даёт три инструмента для просмотра данных.

Локальные переменные. Окно Отладка → Локальные показывает все переменные текущей процедуры, включая ТребуемыеПараметры. Массив разворачивается, видно каждое имя параметра.

Табло (Ctrl+Alt+W). Сюда добавляют выражения, которые нужно видеть постоянно на каждом шаге. Полезный набор для модуля сеанса:

ПользователиИнформационнойБазы.ТекущийПользователь().Имя
ПривилегированныйРежим()
ПараметрыСеанса.ТекущийПользователь

Вычислить выражение (Shift+F9). Вычисляет произвольное выражение на текущей строке. Работает и с запросами: можно проверить, что вернёт функция определения пользователя, не дожидаясь следующего шага.

Осторожно с вычислением ПараметрыСеанса.Имя в Табло, пока параметр не установлен. Это то же самое обращение, что и в коде: оно может вызвать повторный вход в обработчик или ошибку, и картина отладки исказится. Смотрите значения после строки, где параметр записан.

Привилегированный режим тоже влияет на картину. ПривилегированныйРежим() в модуле сеанса вернёт Истина, поэтому запросы видят все данные без ограничений RLS. Если у пользователя «всё работает при входе, но падает в форме», причина часто здесь: в модуле сеанса проверка прав просто не выполнялась.

Модуль сеанса в фоновых заданиях и внешних соединениях

Каждое фоновое задание — отдельный сеанс. Значит, УстановкаПараметровСеанса выполнится и при его старте, причём от имени пользователя, запустившего задание. У регламентного задания пользователь задаётся в его настройках; если он не указан, сеанс работает без конкретного пользователя ИБ.

Чтобы остановиться в модуле сеанса фонового задания:

  1. Откройте Отладка → Подключение → Автоматическое подключение.
  2. Отметьте тип «Фоновое задание» (в серверной базе — вместе с «Сервер»).
  3. Поставьте точку в УстановкаПараметровСеанса и запустите задание из клиента, который уже работает под отладкой.

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

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

Перед отладкой модуля сеанса
Выполнено: 0 / 5

Почему точка останова в модуле сеанса не срабатывает

Диагностика: выберите симптом

Если ни один пункт не подошёл, проверьте, не выполняется ли нужный вам код раньше модуля сеанса или вообще не в нём. Логика старта программы распределена: модуль сеанса отрабатывает на сервере, а потом клиентский модуль управляемого приложения вызывает ПередНачаломРаботыСистемы и ПриНачалеРаботыСистемы. Ошибку «после входа» нередко ищут не в том модуле.

Частые вопросы

Можно ли отладить модуль сеанса без конфигуратора?
Нет. Точки останова и пошаговое выполнение доступны в конфигураторе или в 1С:EDT. Из пользовательского режима можно только подключить сеанс к уже запущенному отладчику.
Почему у разных пользователей параметры сеанса заполняются по-разному?
Код один, но выполняется в контексте пользователя, вошедшего в сеанс. Поставьте точку с условием по имени пользователя и сравните значения в окне Табло.
Выполняется ли модуль сеанса при входе в конфигуратор?
Нет. Конфигуратор не запускает УстановкаПараметровСеанса, поэтому через него и исправляют ошибку, из-за которой пользователи не могут войти.
Можно ли вызвать клиентский метод из модуля сеанса?
Нет. Модуль серверный: в нём недоступны формы, предупреждения и диалоги. Сообщения пользователю из него выводить бесполезно, используйте журнал регистрации.
Не опасно ли включать отладку на рабочем сервере?
Отладка замедляет выполнение, а остановка на точке держит сеанс и его блокировки. На рабочем кластере это мешает пользователям, поэтому отлаживайте на копии базы.