Разработка и Конфигурация · 10 мин
Когда инициализируются параметры сеанса в 1С
Разбираем, когда инициализируются параметры сеанса в 1С: порядок вызова УстановкаПараметровСеанса, типичные ошибки, отладка и проверка результата.
Параметры сеанса в 1С — это значения, привязанные к конкретному сеансу пользователя: текущий пользователь, его роли, настройки отбора, служебные флаги. Они доступны из любого серверного кода в рамках сеанса и часто используются в ограничениях доступа к данным (RLS), поэтому момент их инициализации критичен: если параметр не установлен вовремя, запрос с RLS упадёт с ошибкой или вернёт пустой результат.
Инициализация происходит не в фиксированный момент времени, а по требованию: платформа вызывает обработчик УстановкаПараметровСеанса модуля сеанса в момент первого обращения к параметрам сеанса внутри данного сеанса. Это ключевой момент, который часто понимают неправильно и из-за этого получают ошибки «Параметр сеанса не установлен» или бесконечную рекурсию при старте.
Ниже разобран порядок вызова обработчика, особенности фоновых заданий и веб-клиента, типовой шаблон кода, способы проверки и типичные ошибки, которые приводят к проблемам в производительности и логике доступа.
Механизм ленивой инициализации: когда именно вызывается обработчик
Платформа не заполняет параметры сеанса автоматически при подключении пользователя. Событие УстановкаПараметровСеанса модуля сеанса срабатывает в момент первого фактического обращения к параметру: при явном чтении ПараметрыСеанса.ИмяПараметра, при выполнении запроса с RLS, где в шаблоне ограничения используется параметр сеанса, или при обращении к функциональным опциям, значения которых хранятся в параметрах сеанса.
В обработчик передаётся параметр ИменаПараметровСеанса — массив строк с именами параметров, которые платформа запрашивает прямо сейчас. Если обращение идёт к одному параметру, в массиве будет одно имя. Ваша задача — установить значения для всех запрошенных имён. Если после выхода из обработчика какой-то из требуемых параметров остался неустановленным, платформа вызовет обработчик повторно; если и повторная попытка не установит значение, возникнет ошибка «Попытка получения неинициализированного значения параметра сеанса».
Важное следствие ленивой модели: если за весь сеанс ни один параметр не потребовался, обработчик не выполнится ни разу. Поэтому нельзя рассчитывать, что модуль сеанса — это «точка входа при старте», куда можно поместить общую инициализацию. Для логики при входе пользователя существуют события модуля сеанса ПриНачалеРаботыСистемы на клиенте и обработчики в общих модулях, а модуль сеанса должен заниматься только установкой параметров.
Типовой шаблон обработчика УстановкаПараметровСеанса
Стандартный подход — проверять, какие имена запрошены, и устанавливать только их. Это снижает нагрузку: если запрошен один «лёгкий» параметр, не нужно выполнять тяжёлые запросы для всех остальных.
Процедура УстановкаПараметровСеанса(Знач ИменаПараметровСеанса) Экспорт
Если ИменаПараметровСеанса <> Неопределено
И ИменаПараметровСеанса.Найти("ТекущийПользователь") = Неопределено Тогда
Возврат;
КонецЕсли;
ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
ПараметрыСеанса.ТекущийПользователь =
Справочники.Пользователи.НайтиПоНаименованию(ПользовательИБ.Имя);
КонецПроцедуры
Обратите внимание на проверку ИменаПараметровСеанса <> Неопределено. В некоторых сценариях (например, при старте в определённых режимах) платформа может вызвать обработчик с Неопределено, что означает «установить всё, что возможно». Корректный обработчик обязан обрабатывать оба случая.
- 1Определите состав параметров сеанса в конфигураторе и задайте им типы
- 2В модуле сеанса создайте УстановкаПараметровСеанса с проверкой массива имён
- 3Для каждого параметра напишите установку значения с защитой от пустого результата
- 4Проверьте, что обработчик не обращается к параметрам сеанса внутри себя
- 5Протестируйте вход пользователем с RLS и фоновым заданием
Особенности инициализации в разных режимах работы
Тонкий, толстый и веб-клиент
В клиентских приложениях первое обращение к параметрам обычно происходит уже на старте: типовые конфигурации при входе читают текущего пользователя, настройки интерфейса, функциональные опции. Поэтому на практике обработчик срабатывает почти сразу после аутентификации, но формально — всё равно по требованию, а не по факту входа.
Фоновые задания
Фоновое задание — это отдельный сеанс. При его старте параметры сеанса родительского сеанса копируются в новый сеанс, но если в коде фонового задания происходит обращение к параметру, который не был установлен, обработчик УстановкаПараметровСеанса будет вызван уже в контексте фонового сеанса. Учитывайте, что в фоновом задании нет интерактивного пользователя в привычном смысле: если ваша логика опирается на ПользователиИнформационнойБазы.ТекущийПользователь(), она обычно работает, так как пользователь наследуется, но вызовы клиентской логики недопустимы.
Внешние соединения и веб-сервисы
При обращении через веб-сервис, HTTP-сервис или COM-соединение для каждого вызова также создаётся сеанс, и параметры инициализируются по тому же ленивому принципу. Если логика сервиса завязана на RLS с параметрами сеанса, первое обращение к данным спровоцирует вызов обработчика — это нужно учитывать при оценке времени ответа сервиса.
Типичные ошибки и как их избежать
Самая опасная ошибка — обращение к параметру сеанса внутри самого обработчика. Например, код устанавливает ПараметрыСеанса.ТекущийПользователь, а для этого вызывает функцию, которая внутри читает ПараметрыСеанса.ТекущееПодразделение. Платформа попытается инициализировать второй параметр и рекурсивно вызовет тот же обработчик — итог: ошибка «Рекурсивный вызов» либо зацикливание сеанса.
Вторая частая проблема — тяжёлые запросы в обработчике. Поскольку обработчик вызывается в момент первого обращения, а таких обращений за сеанс может быть несколько (для разных имён), неоптимальный код заметно замедляет вход пользователя и открытие первых форм. Кэшируйте промежуточные результаты, устанавливайте только запрошенные параметры, избегайте обходов справочников целиком.
Как проверить, что параметры инициализируются правильно
Простейший способ — временно добавить в обработчик запись в журнал регистрации с именами запрошенных параметров. Это покажет, когда и с какими именами вызывается обработчик, и поможет обнаружить лишние вызовы.
ЗаписьЖурналаРегистрации("ПараметрыСеанса",
УровеньЖурналаРегистрации.Информация, , ,
"Запрошены: " + СтрСоединить(ИменаПараметровСеанса, ", "));
Далее войдите под обычным пользователем (не администратором) и проверьте: открываются ли списки с RLS, корректно ли подставляется текущий пользователь в документы, нет ли в журнале регистрации ошибок инициализации. Отдельно проверьте выполнение регламентного задания, которое обращается к данным с ограничениями доступа.
Как проверить результат
Параметр содержит ожидаемую ссылку или значение
Пустое значение или ошибка при обращении
Видны только разрешённые записи
Пустой список у всех или ошибка параметра сеанса
Один-два вызова обработчика на сеанс
Множественные повторные вызовы или ошибки рекурсии
Выполняются без ошибок инициализации
Ошибка получения параметра в фоновом сеансе
Альтернативы параметрам сеанса
Не для каждой задачи параметр сеанса — правильный инструмент. Если значение общее для всех пользователей и редко меняется, подойдут константы. Если нужны персональные настройки, которые должны сохраняться между сеансами, — используйте хранилище общих настроек (ХранилищеОбщихНастроек) или регистры сведений с измерением «Пользователь». Параметры сеанса оправданы именно для данных, которые нужны постоянно в течение сеанса, участвуют в RLS и не должны требовать повторных запросов при каждом обращении.
Сравнение вариантов хранения
Быстрый доступ внутри сеанса, работает в RLS; значение теряется при завершении сеанса
Общее значение для всех, хранится постоянно; не подходит для персональных данных
Персональные настройки между сеансами; нельзя использовать в RLS
Гибкие персональные данные с историей; каждое чтение — запрос к базе
FAQ
Вызывается ли УстановкаПараметровСеанса при каждом входе пользователя?
Не обязательно. Обработчик вызывается при первом обращении к любому параметру сеанса. На практике типовые конфигурации обращаются к параметрам сразу при старте, поэтому вызов происходит почти всегда, но формально он «ленивый».
Что будет, если обработчик не установил запрошенный параметр?
Платформа вызовет обработчик повторно с тем же именем. Если и после этого значение не установлено, возникнет ошибка «Попытка получения неинициализированного значения параметра сеанса», и обращение к данным завершится ошибкой.
Можно ли в обработчике читать другие параметры сеанса?
Нет, это приводит к рекурсивному вызову обработчика и ошибке. Всю необходимую информацию получайте из базы напрямую: через ПользователиИнформационнойБазы, запросы к справочникам и регистрам.
Наследуются ли параметры сеанса в фоновых заданиях?
Да, при запуске фонового задания значения параметров копируются в новый сеанс. Но если в фоновом сеансе обратиться к параметру, которого там нет, обработчик будет вызван уже в контексте фонового задания.
Почему пользователь видит пустые списки, хотя права настроены?
Частая причина — параметр сеанса, используемый в шаблоне RLS, установлен в пустое значение (например, пользователь не найден в справочнике «Пользователи»). Проверьте значение параметра и добавьте в обработчик значение по умолчанию.
Как отладить обработчик, если он выполняется на сервере?
Включите в конфигураторе отладку серверных вызовов (Сервис → Параметры → отладка на сервере) и поставьте точку останова в модуле сеанса. Альтернатива — временная запись имён запрошенных параметров в журнал регистрации.
Что важно запомнить
Параметры сеанса инициализируются лениво — при первом обращении, включая неявное через RLS. Обработчик должен устанавливать только запрошенные параметры, не читать другие параметры сеанса внутри себя и всегда задавать значение по умолчанию. Проверяйте работу под рядовым пользователем и в фоновых заданиях.