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

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

Как инициализировать параметры сеанса в 1С

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

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

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

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

Что такое параметры сеанса и когда они нужны

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

Типовое применение — подстановка текущего пользователя в шаблоны ограничения доступа (RLS). Например, условие «документ доступен, если Ответственный = &ТекущийПользователь» работает именно через параметр сеанса. Второй частый сценарий — хранение признаков режима работы: обмен данными, отладка, сервисный режим.

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

Где объявляются параметры и как устроен обработчик

Новый параметр создаётся в конфигураторе: ветка «Общие» → «Параметры сеанса». У параметра задаётся имя и тип значения. Тип может быть любым допустимым, включая составной, но на практике чаще всего используются ссылки на справочники, примитивные типы и перечисления.

Инициализация выполняется в модуле сеанса (Свойства конфигурации → Модуль сеанса). Платформа вызывает обработчик УстановкаПараметровСеанса(ИменаПараметровСеанса) и передаёт массив имён параметров, которые сейчас требуются. Обработчик обязан установить значения только для запрошенных параметров и отметить их в свойстве ПараметрыСеанса.УстановленныеПараметры.

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

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

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

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

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

ПараметрыСеанса.УстановленныеПараметры.Добавить("ТекущийПользователь");

КонецЕсли;

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

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

Пошаговое добавление собственного параметра

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

Порядок действий
  1. 1
    Создайте параметр сеанса: Общие → Параметры сеанса → Добавить, задайте имя и тип (например, СправочникСсылка.Подразделения).
  2. 2
    Откройте модуль сеанса и найдите обработчик УстановкаПараметровСеанса. В типовых конфигурациях он обычно вызывает общий модуль — добавьте свою ветку туда или в обработчик напрямую.
  3. 3
    Добавьте проверку: ИменаПараметровСеанса = Неопределено ИЛИ массив содержит имя вашего параметра.
  4. 4
    Получите значение (запросом к регистру сведений настроек пользователя, из параметров пользователя ИБ и т.п.) и присвойте его параметру. При отсутствии значения присвойте пустую ссылку.
  5. 5
    Добавьте имя параметра в ПараметрыСеанса.УстановленныеПараметры.
  6. 6
    Обновите конфигурацию базы данных и проверьте вход под тестовым пользователем.

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

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

Особенности работы обработчика

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

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

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

Работа с привилегированным режимом и правами

Обработчик выполняется в контексте прав текущего пользователя. Если для получения значения параметра требуется чтение данных, к которым у пользователя нет прав (например, чужие настройки или служебные регистры), обращение завершится ошибкой. Стандартное решение — обернуть получение данных в УстановитьПривилегированныйРежим(Истина).

УстановитьПривилегированныйРежим(Истина);

// чтение служебного регистра сведений

ПараметрыСеанса.ТекущееПодразделение = ПолученноеЗначение;

УстановитьПривилегированныйРежим(Ложь);

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

Типичные ошибки и ограничения механизма

Типичные ошибки
01
Не добавлено имя в УстановленныеПараметры — платформа циклически вызывает обработчик, пользователь получает ошибку инициализации сеанса.
02
Исключение без обработки внутри процедуры — вход в базу блокируется; оборачивайте рискованные участки в Попытка/Исключение с установкой пустого значения.
03
Тяжёлые запросы или обходы больших таблиц в обработчике — замедляется вход каждого пользователя; выносите вычисления в кэшируемые модули с повторным использованием.
04
Использование клиентских методов (Предупреждение, Вопрос) в модуле сеанса — код не скомпилируется или упадёт на сервере.
05
Хранение в параметре изменяемых данных и ожидание их актуальности — параметр инициализируется один раз, при изменении настроек пользователю нужно переустановить значение явно или перезайти.

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

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

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

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

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

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

Вход пользователя в базу
Норма

Сеанс стартует без сообщений об ошибке инициализации параметров

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

Ошибка «Ошибка установки параметра сеанса» или циклический вызов обработчика

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

ПараметрыСеанса.ИмяПараметра возвращает ожидаемое значение с первого чтения

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

Пустое значение при заполненных данных или повторный вызов обработчика

Состав УстановленныеПараметры
Норма

Имя параметра присутствует в коллекции после инициализации

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

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

Вход под пользователем с минимальными правами
Норма

Параметр инициализируется, ошибок прав нет

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

Нарушение прав доступа при чтении данных в обработчике

Для отладки поставьте точку останова внутри обработчика и запустите сеанс под отладкой: вы увидите, с каким массивом имён вызывается процедура и какие ветки реально выполняются. Это самый быстрый способ понять, почему параметр не получает ожидаемое значение.

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

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

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

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

Что будет, если не добавить имя в УстановленныеПараметры?

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

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

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

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

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

Как инициализировать параметр, если нужных данных ещё нет в базе?

Присвойте пустое значение соответствующего типа (пустую ссылку, Неопределено — в зависимости от типа параметра) и обязательно отметьте параметр как установленный. Оставлять параметр неустановленным нельзя — это приведёт к ошибке сеанса.

Итог

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

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