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