К статье
Практический материал

Разработка и Конфигурация · 10 мин

Когда инициализируются параметры сеанса в 1С

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

Параметры сеанса в 1С — это значения, привязанные к конкретному сеансу пользователя: текущий пользователь, его роли, настройки отбора, служебные флаги. Они доступны из любого серверного кода в рамках сеанса и часто используются в ограничениях доступа к данным (RLS), поэтому момент их инициализации критичен: если параметр не установлен вовремя, запрос с RLS упадёт с ошибкой или вернёт пустой результат.

Инициализация происходит не в фиксированный момент времени, а по требованию: платформа вызывает обработчик УстановкаПараметровСеанса модуля сеанса в момент первого обращения к параметрам сеанса внутри данного сеанса. Это ключевой момент, который часто понимают неправильно и из-за этого получают ошибки «Параметр сеанса не установлен» или бесконечную рекурсию при старте.

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

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

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

В обработчик передаётся параметр ИменаПараметровСеанса — массив строк с именами параметров, которые платформа запрашивает прямо сейчас. Если обращение идёт к одному параметру, в массиве будет одно имя. Ваша задача — установить значения для всех запрошенных имён. Если после выхода из обработчика какой-то из требуемых параметров остался неустановленным, платформа вызовет обработчик повторно; если и повторная попытка не установит значение, возникнет ошибка «Попытка получения неинициализированного значения параметра сеанса».

Важное следствие ленивой модели: если за весь сеанс ни один параметр не потребовался, обработчик не выполнится ни разу. Поэтому нельзя рассчитывать, что модуль сеанса — это «точка входа при старте», куда можно поместить общую инициализацию. Для логики при входе пользователя существуют события модуля сеанса ПриНачалеРаботыСистемы на клиенте и обработчики в общих модулях, а модуль сеанса должен заниматься только установкой параметров.

Типовой шаблон обработчика УстановкаПараметровСеанса

Стандартный подход — проверять, какие имена запрошены, и устанавливать только их. Это снижает нагрузку: если запрошен один «лёгкий» параметр, не нужно выполнять тяжёлые запросы для всех остальных.

Процедура УстановкаПараметровСеанса(Знач ИменаПараметровСеанса) Экспорт

Если ИменаПараметровСеанса <> Неопределено

И ИменаПараметровСеанса.Найти("ТекущийПользователь") = Неопределено Тогда

Возврат;

КонецЕсли;

ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();

ПараметрыСеанса.ТекущийПользователь =

Справочники.Пользователи.НайтиПоНаименованию(ПользовательИБ.Имя);

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

Обратите внимание на проверку ИменаПараметровСеанса <> Неопределено. В некоторых сценариях (например, при старте в определённых режимах) платформа может вызвать обработчик с Неопределено, что означает «установить всё, что возможно». Корректный обработчик обязан обрабатывать оба случая.

Порядок реализации обработчика
  1. 1
    Определите состав параметров сеанса в конфигураторе и задайте им типы
  2. 2
    В модуле сеанса создайте УстановкаПараметровСеанса с проверкой массива имён
  3. 3
    Для каждого параметра напишите установку значения с защитой от пустого результата
  4. 4
    Проверьте, что обработчик не обращается к параметрам сеанса внутри себя
  5. 5
    Протестируйте вход пользователем с RLS и фоновым заданием

Особенности инициализации в разных режимах работы

Тонкий, толстый и веб-клиент

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

Фоновые задания

Фоновое задание — это отдельный сеанс. При его старте параметры сеанса родительского сеанса копируются в новый сеанс, но если в коде фонового задания происходит обращение к параметру, который не был установлен, обработчик УстановкаПараметровСеанса будет вызван уже в контексте фонового сеанса. Учитывайте, что в фоновом задании нет интерактивного пользователя в привычном смысле: если ваша логика опирается на ПользователиИнформационнойБазы.ТекущийПользователь(), она обычно работает, так как пользователь наследуется, но вызовы клиентской логики недопустимы.

Внешние соединения и веб-сервисы

При обращении через веб-сервис, HTTP-сервис или COM-соединение для каждого вызова также создаётся сеанс, и параметры инициализируются по тому же ленивому принципу. Если логика сервиса завязана на RLS с параметрами сеанса, первое обращение к данным спровоцирует вызов обработчика — это нужно учитывать при оценке времени ответа сервиса.

Типичные ошибки и как их избежать

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

Вторая частая проблема — тяжёлые запросы в обработчике. Поскольку обработчик вызывается в момент первого обращения, а таких обращений за сеанс может быть несколько (для разных имён), неоптимальный код заметно замедляет вход пользователя и открытие первых форм. Кэшируйте промежуточные результаты, устанавливайте только запрошенные параметры, избегайте обходов справочников целиком.

Типичные ошибки
01
Чтение другого параметра сеанса внутри обработчика — рекурсивный вызов и ошибка инициализации
02
Игнорирование массива имён и установка всех параметров при любом вызове — лишняя нагрузка на каждое обращение
03
Отсутствие значения по умолчанию: если пользователь не найден в справочнике, параметр остаётся пустым, и RLS молча скрывает все данные
04
Использование клиентских вызовов (Предупреждение, формы) в модуле сеанса — ошибка в фоновых заданиях и веб-сервисах

Как проверить, что параметры инициализируются правильно

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

ЗаписьЖурналаРегистрации("ПараметрыСеанса",

УровеньЖурналаРегистрации.Информация, , ,

"Запрошены: " + СтрСоединить(ИменаПараметровСеанса, ", "));

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

Контрольные точки

Как проверить результат

Значение параметра после входа
Норма

Параметр содержит ожидаемую ссылку или значение

Тревожный признак

Пустое значение или ошибка при обращении

Списки с RLS под рядовым пользователем
Норма

Видны только разрешённые записи

Тревожный признак

Пустой список у всех или ошибка параметра сеанса

Журнал регистрации
Норма

Один-два вызова обработчика на сеанс

Тревожный признак

Множественные повторные вызовы или ошибки рекурсии

Фоновые задания
Норма

Выполняются без ошибок инициализации

Тревожный признак

Ошибка получения параметра в фоновом сеансе

Альтернативы параметрам сеанса

Не для каждой задачи параметр сеанса — правильный инструмент. Если значение общее для всех пользователей и редко меняется, подойдут константы. Если нужны персональные настройки, которые должны сохраняться между сеансами, — используйте хранилище общих настроек (ХранилищеОбщихНастроек) или регистры сведений с измерением «Пользователь». Параметры сеанса оправданы именно для данных, которые нужны постоянно в течение сеанса, участвуют в RLS и не должны требовать повторных запросов при каждом обращении.

Сравнение вариантов хранения

Параметр сеанса

Быстрый доступ внутри сеанса, работает в RLS; значение теряется при завершении сеанса

Константа

Общее значение для всех, хранится постоянно; не подходит для персональных данных

Хранилище общих настроек

Персональные настройки между сеансами; нельзя использовать в RLS

Регистр сведений

Гибкие персональные данные с историей; каждое чтение — запрос к базе

FAQ

Вызывается ли УстановкаПараметровСеанса при каждом входе пользователя?

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

Что будет, если обработчик не установил запрошенный параметр?

Платформа вызовет обработчик повторно с тем же именем. Если и после этого значение не установлено, возникнет ошибка «Попытка получения неинициализированного значения параметра сеанса», и обращение к данным завершится ошибкой.

Можно ли в обработчике читать другие параметры сеанса?

Нет, это приводит к рекурсивному вызову обработчика и ошибке. Всю необходимую информацию получайте из базы напрямую: через ПользователиИнформационнойБазы, запросы к справочникам и регистрам.

Наследуются ли параметры сеанса в фоновых заданиях?

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

Почему пользователь видит пустые списки, хотя права настроены?

Частая причина — параметр сеанса, используемый в шаблоне RLS, установлен в пустое значение (например, пользователь не найден в справочнике «Пользователи»). Проверьте значение параметра и добавьте в обработчик значение по умолчанию.

Как отладить обработчик, если он выполняется на сервере?

Включите в конфигураторе отладку серверных вызовов (Сервис → Параметры → отладка на сервере) и поставьте точку останова в модуле сеанса. Альтернатива — временная запись имён запрошенных параметров в журнал регистрации.

Итог

Что важно запомнить

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