Параметры сеанса 1С 8.3: объект метаданных, модуль сеанса и код
Содержание
Параметр сеанса в 1С создают в конфигураторе: ветка Общие → Параметры сеанса, команда «Добавить», затем задают имя и тип. Значение присваивают в модуле сеанса, в процедуре УстановкаПараметровСеанса(ТребуемыеПараметры), а читают на сервере через ПараметрыСеанса.Имя.
Чаще всего проблема не в создании, а в мелочах вокруг: параметр не заполнен, у роли нет права «Получение», код пытается обратиться к нему с клиента. Ниже весь путь от объекта метаданных до отладки, с рабочим кодом для платформы 8.3.
Что такое параметр сеанса и где он живёт
Параметр сеанса — переменная, которая существует ровно столько, сколько длится сеанс пользователя. У каждого сеанса свой экземпляр значения. Два бухгалтера в одной базе видят каждый своё.
Ключевые свойства:
- 🔒 Только сервер. Обратиться к
ПараметрыСеансаможно из серверного кода: общих модулей с флагом «Сервер», процедур формы с директивами&НаСервереи&НаСервереБезКонтекста, модулей объектов и менеджеров. В клиентском коде коллекции нет. - ⏳ Только на время сеанса. После выхода пользователя значение исчезает. Новый сеанс, в том числе фоновое задание или сеанс по HTTP-сервису, заполняет параметр заново.
- 🛡️ Под контролем прав. Для каждой роли задаются два права: «Получение» и «Установка».
- 🧩 Доступ в ограничениях RLS. В тексте ограничения доступа на уровне записей параметр сеанса указывают через амперсанд:
&ТекущийСклад. Это главный исторический сценарий использования.
Типичные задачи: текущий пользователь информационной базы как ссылка на справочник, основная организация или склад пользователя, признак «работает внешняя система», список разрешённых подразделений для RLS.
В обычном запросе параметр сеанса сам не подставится. Передайте его явно: Запрос.УстановитьПараметр("Склад", ПараметрыСеанса.ТекущийСклад). Подстановка &Имя без УстановитьПараметр работает только в ограничениях доступа.
Как создать параметр сеанса в конфигураторе
Работа идёт в режиме «Конфигуратор». Если конфигурация типовая и стоит на поддержке, сначала решите, где будет параметр: в основной конфигурации (нужно включить возможность изменения) или в расширении. Для типовых баз расширение удобнее — обновления пройдут без ручного сравнения.
Шаг 1. Добавьте объект метаданных
- Откройте
Конфигурация → Открыть конфигурацию. - В дереве раскройте ветку
Общиеи найдитеПараметры сеанса. - Правой кнопкой по ветке →
Добавить. - Заполните Имя латиницей или кириллицей без пробелов, например
ТекущийСклад, и Синоним для людей.
Шаг 2. Выберите тип
В поле «Тип» укажите, что будет храниться. Варианты:
| Что хранить | Какой тип выбрать |
|---|---|
| Ссылку на элемент справочника | СправочникСсылка.Склады и т.п. |
| Флаг, число, строку, дату | примитивный тип |
| Несколько ссылок для RLS | ФиксированныйМассив |
| Набор именованных настроек | ФиксированнаяСтруктура |
| Произвольные данные | ХранилищеЗначения |
Изменяемые коллекции вроде Массив, Структура или ТаблицаЗначений в тип параметра не выбрать. Если нужна коллекция, собирайте обычный массив и присваивайте Новый ФиксированныйМассив(Массив).
Шаг 3. Дайте права в ролях
Без прав параметр есть, но код упадёт при обращении к нему под обычным пользователем.
- Откройте нужную роль (
Общие → Роли). - В списке объектов роли найдите ветку
Параметры сеансаи ваш параметр. - Отметьте право «Получение» — для всех, кто будет читать значение. Сюда относится и чтение в RLS.
- Право «Установка» давайте только тем ролям, которым действительно нужно менять значение из своего кода. Для заполнения в модуле сеанса оно не требуется: модуль сеанса выполняется в привилегированном режиме.
Шаг 4. Обновите конфигурацию базы данных
Нажмите F7 или Конфигурация → Обновить конфигурацию базы данных. Параметр сеанса не меняет таблиц базы, поэтому обновление проходит быстро.
Расширение с новым параметром сеанса после подключения нужно применить, а пользователям — перезапустить сеанс. В уже открытых сеансах параметр не появится.
Заполнение значения в модуле сеанса
Платформа сама вызывает процедуру УстановкаПараметровСеанса из модуля сеанса. Открыть модуль
: правой кнопкой по корню конфигурации → Открыть модуль сеанса.
Вызовов два вида:
- При старте сеанса — параметр
ТребуемыеПараметрыравенНеопределено. - При первом обращении к незаполненному параметру — в
ТребуемыеПараметрыприходит массив имён тех параметров, которые нужно заполнить прямо сейчас.
Отсюда приём, который ускоряет вход в базу: ленивая инициализация. Тяжёлые параметры не считаем при старте, а заполняем по требованию.
Пример модуля сеанса для конфигурации без БСП
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
Если ТребуемыеПараметры = Неопределено Тогда
// Старт сеанса: заполняем только то, что нужно всегда.
ПараметрыСеанса.ВнешнийСеанс = Ложь;
Возврат;
КонецЕсли;
Для Каждого ИмяПараметра Из ТребуемыеПараметры Цикл
Если ИмяПараметра = "ТекущийСклад" Тогда
ПараметрыСеанса.ТекущийСклад = ОсновнойСкладПользователя();
ИначеЕсли ИмяПараметра = "РазрешенныеСклады" Тогда
ПараметрыСеанса.РазрешенныеСклады = РазрешенныеСкладыПользователя();
ИначеЕсли ИмяПараметра = "ВнешнийСеанс" Тогда
ПараметрыСеанса.ВнешнийСеанс = Ложь;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ОсновнойСкладПользователя()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Настройки.Склад КАК Склад
|ИЗ
| РегистрСведений.СкладыПользователей КАК Настройки
|ГДЕ
| Настройки.ИмяПользователя = &ИмяПользователя
| И Настройки.Основной";
Запрос.УстановитьПараметр("ИмяПользователя", ИмяПользователя());
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Склад;
КонецЕсли;
Возврат Справочники.Склады.ПустаяСсылка();
КонецФункции
Функция РазрешенныеСкладыПользователя()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Настройки.Склад КАК Склад
|ИЗ
| РегистрСведений.СкладыПользователей КАК Настройки
|ГДЕ
| Настройки.ИмяПользователя = &ИмяПользователя";
Запрос.УстановитьПараметр("ИмяПользователя", ИмяПользователя());
Массив = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Склад");
Возврат Новый ФиксированныйМассив(Массив);
КонецФункции
Регистр СкладыПользователей здесь — пример собственного объекта с измерениями ИмяПользователя и Склад и ресурсом-флагом Основной. Подставьте свой источник данных.
Каждое имя из ТребуемыеПараметры обязано получить значение. Если ветка для параметра не написана, платформа вызовет исключение при обращении к нему. Пустая ссылка — нормальное значение, «ничего» — нет.
Если в конфигурации есть БСП
Типовые конфигурации (Бухгалтерия, ЗУП, УТ) построены на Библиотеке стандартных подсистем. Там модуль сеанса не правят: он передаёт управление библиотеке. Свой параметр регистрируют в переопределяемом модуле ОбщегоНазначенияПереопределяемый, в процедуре ПриДобавленииОбработчиковУстановкиПараметровСеанса:
Процедура ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики) Экспорт
Обработчики.Вставить("ТекущийСклад", "СкладыПользователейСервер.УстановкаПараметровСеанса");
КонецПроцедуры
В указанном общем серверном модуле пишется экспортная процедура, которая заполняет параметр по имени и добавляет его имя в массив уже установленных. Точную сигнатуру обработчика сверьте с комментарием к процедуре в вашей версии БСП: он описан прямо в переопределяемом модуле. В расширении к этой процедуре подключаются через аннотацию &После.
Чтение и проверка параметра сеанса в коде
Чтение — обычное обращение к свойству:
&НаСервереБезКонтекста
Функция СкладПоУмолчанию()
Возврат ПараметрыСеанса.ТекущийСклад;
КонецФункции
Если параметр ещё не заполнен, платформа в этот момент сама вызовет УстановкаПараметровСеанса с его именем. Поэтому «просто посмотреть, заполнен ли параметр» нельзя: любое чтение запускает инициализацию.
Проверить, что параметр существует в метаданных, можно так. Это полезно в общем коде, который работает в разных конфигурациях:
Если Метаданные.ПараметрыСеанса.Найти("ТекущийСклад") <> Неопределено Тогда
Склад = ПараметрыСеанса.ТекущийСклад;
КонецЕсли;
Проверить право на чтение у текущего пользователя:
ЕстьПраво = ПравоДоступа("Получение", Метаданные.ПараметрыСеанса.ТекущийСклад);
Как передать значение на клиент
С клиента параметр не прочитать. Варианты:
- Серверная функция без контекста возвращает значение, клиент кэширует его у себя.
- Общий модуль с повторным использованием возвращаемых значений «На время сеанса» — второй вызов не пойдёт на сервер.
- В управляемой форме: значение кладут в реквизит формы в
ПриСозданииНаСервере.
Не тяните на клиент ФиксированныйМассив из тысяч ссылок. Передавайте то, что форме реально нужно, — например, одну ссылку или флаг.
Установка значения из обычного кода
Менять значение можно не только в модуле сеанса. Например, при смене склада пользователем:
&НаСервере
Процедура СменитьСкладНаСервере(НовыйСклад)
УстановитьПривилегированныйРежим(Истина);
ПараметрыСеанса.ТекущийСклад = НовыйСклад;
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Привилегированный режим нужен, если у роли нет права «Установка». Оставляйте его на минимальном участке кода и обязательно проверяйте, что НовыйСклад пользователю разрешён. Иначе любой обход RLS через параметр станет возможен.
Сброс и повторное заполнение параметров сеанса
Удалить параметр из сеанса нельзя: он существует, пока есть в метаданных. Зато значение можно сбросить. Метод ПараметрыСеанса.Сбросить() очищает значения, и при следующем обращении платформа снова вызовет УстановкаПараметровСеанса.
// Сбросить конкретные параметры
Имена = Новый Массив;
Имена.Добавить("ТекущийСклад");
Имена.Добавить("РазрешенныеСклады");
ПараметрыСеанса.Сбросить(Имена);
// Сбросить все параметры сеанса
ПараметрыСеанса.Сбросить();
Когда это нужно:
- 🔄 администратор поменял настройки пользователя, и новые права должны сработать без перезапуска;
- 🔄 пользователь переключил основную организацию;
- 🔄 тест или обработка меняет параметр и должна вернуть исходное состояние.
Сброс влияет только на текущий сеанс. Другим пользователям изменения в регистре настроек станут видны, когда их сеанс перечитает параметр — после сброса в их сеансе или после перезапуска.
Удалить сам объект метаданных — обычное удаление ветки в конфигураторе. Перед этим вызовите в контекстном меню объекта команду «Поиск ссылок на объект» и уберите упоминания из ролей, RLS и кода, иначе синтаксический контроль не даст сохранить конфигурацию .
Ошибки при работе с параметрами сеанса и отладка
Как отлаживать модуль сеанса
Точку останова в УстановкаПараметровСеанса поставить можно, но отладчик должен успеть подключиться к сеансу до его старта. Включите в конфигураторе автоматическое подключение отладчика к новым сеансам (Отладка → Подключение, затем настройка автоматического подключения) и запустите предприятие из конфигуратора.
Второй приём — ленивая ветка. Обращение к параметру в обработке вызывает УстановкаПараметровСеанса повторно, уже в работающем сеансе с подключённым отладчиком. Сбросьте параметр через Сбросить и прочитайте его — попадёте в нужную ветку.
Ошибка внутри модуля сеанса при старте не даёт пользователю войти в базу. Оборачивайте внешние вызовы (HTTP, COM, чтение файлов) в Попытка … Исключение и при сбое записывайте пустое значение плюс запись в журнал регистрации.
Параметры сеанса или другие способы хранения
Параметр сеанса — не единственное место для данных «на время работы». Выбор зависит от того, кто читает значение и сколько оно должно жить.
| Способ | Где доступно | Сколько живёт | Когда брать |
|---|---|---|---|
| Параметр сеанса | сервер, RLS | сеанс | значение нужно в ограничениях доступа или в серверном коде многих модулей |
| Общий модуль с повторным использованием «На время сеанса» | там, где модуль | сеанс, кэш может очиститься раньше | нужен кэш вычислений, без прав и RLS |
| Константа | сервер и клиент через сервер | постоянно | одно значение на всю базу |
ХранилищеОбщихНастроек | сервер | постоянно | личные настройки пользователя между сеансами |
| Временное хранилище | клиент и сервер по адресу | до закрытия формы или сеанса | передать большой объём между клиентом и сервером |
| Глобальная переменная клиента в модуле приложения | клиент | сеанс | флаги интерфейса, которые серверу не нужны |
Главное отличие параметра сеанса — его видит механизм RLS, и у него есть собственные права. Кэш общего модуля этого не умеет. Зато параметр нельзя положить в изменяемую коллекцию и нельзя прочитать на клиенте напрямую.
Частая связка: постоянная настройка хранится в регистре сведений или ХранилищеОбщихНастроек, а параметр сеанса держит её копию для быстрого серверного доступа и ограничений.
Частые вопросы
Сколько параметров сеанса можно создать?
Видит ли фоновое задание параметры сеанса пользователя?
Можно ли хранить в параметре сеанса пароль или токен?
Почему значение не меняется после правки настроек пользователя?
ПараметрыСеанса.Сбросить() с его именем или попросите пользователя перезайти.