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

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

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

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

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

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

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

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

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

Как объявить параметр сеанса в конфигураторе

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

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

Обработчик УстановкаПараметровСеанса в модуле сеанса

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

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

	Если ТребуемыеПараметры = Неопределено Тогда
		Возврат;
	КонецЕсли;

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

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

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

Типовая логика заполнения: примеры значений

Текущий пользователь по имени учётной записи

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

Признаки прав и ролей

Булевы параметры вроде «ЭтоПолноправныйПользователь» удобно вычислять через функцию РольДоступна("ПолныеПрава") или ПравоДоступа(). Это дешёвые операции, они не обращаются к данным и не замедляют вход. Сохранённый признак затем используется в условиях кода и в шаблонах RLS.

Значения по умолчанию из настроек

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

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

Самый быстрый способ — временно добавить в конец обработчика запись в журнал регистрации через ЗаписьЖурналаРегистрации с именами и значениями установленных параметров, затем войти в базу тестовым пользователем и проверить журнал. Для отладки удобно запускать сеанс под отладчиком с точкой останова внутри обработчика: видно, какие имена пришли в массиве и в каком порядке.

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

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

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

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

Сеанс стартует без ошибок, обработчик отрабатывает быстро

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

Ошибка «Параметр сеанса не установлен» или долгое ожидание при входе

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

Нет ошибок обращения к параметрам сеанса

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

Записи об ошибках сразу после события входа

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

Склад, пользователь, признаки прав соответствуют ожиданиям

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

Пустые или чужие значения у пользователя

Типичные ошибки и их последствия

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

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

Типичные ошибки
01
Присваивать все параметры без проверки массива ТребуемыеПараметры — лишняя работа при каждом входе и риск рекурсии
02
Читать неустановленный параметр внутри самого обработчика — рекурсивный вызов и зацикливание
03
Выполнять тяжёлые запросы и обмены в модуле сеанса — замедление входа всех пользователей
04
Читать данные без привилегированного режима у пользователей с ограниченными правами — ошибка нарушения прав доступа
05
Забыть обновить конфигурацию базы данных после добавления параметра — ошибка при обращении

Альтернативные подходы и ограничения

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

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

Где хранить значение

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

Значение нужно на сервере в течение сеанса, используется в RLS и отборах. Не сохраняется между сеансами.

Константа или регистр сведений

Значение должно храниться постоянно и быть одинаковым или различаться по пользователям между сеансами.

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

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

Переменная модуля приложения

Значение нужно только на клиенте, серверная логика и RLS его не используют.

Практические рекомендации по поддержке

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

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

Итог

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

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

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

Когда именно платформа вызывает УстановкаПараметровСеанса?

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

Можно ли изменить параметр сеанса после инициализации?

Да, присвоение ПараметрыСеанса.ИмяПараметра = Значение доступно в любой момент из серверного кода. Но делать это стоит осознанно: если параметр используется в RLS или отборах, его смена в середине сеанса может привести к неочевидному поведению. Обычно параметры устанавливают один раз при старте.

Почему возникает ошибка «Параметр сеанса не установлен»?

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

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

Да. Фоновое задание выполняется в отдельном сеансе, и при первом обращении к параметрам платформа вызовет тот же обработчик УстановкаПараметровСеанса. Учтите, что в фоновом сеансе текущий пользователь может быть не задан, поэтому логика должна корректно обрабатывать пустое имя пользователя.

Нужен ли привилегированный режим в обработчике?

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

Чем параметр сеанса отличается от константы?

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