Параметры сеанса 1С 8.3: объект метаданных, модуль сеанса и код

· 9 мин

Содержание

Параметр сеанса в 1С создают в конфигураторе: ветка Общие → Параметры сеанса, команда «Добавить», затем задают имя и тип. Значение присваивают в модуле сеанса, в процедуре УстановкаПараметровСеанса(ТребуемыеПараметры), а читают на сервере через ПараметрыСеанса.Имя.

Чаще всего проблема не в создании, а в мелочах вокруг: параметр не заполнен, у роли нет права «Получение», код пытается обратиться к нему с клиента. Ниже весь путь от объекта метаданных до отладки, с рабочим кодом для платформы 8.3.

Что такое параметр сеанса и где он живёт

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

Ключевые свойства:

  • 🔒 Только сервер. Обратиться к ПараметрыСеанса можно из серверного кода: общих модулей с флагом «Сервер», процедур формы с директивами &НаСервере и &НаСервереБезКонтекста, модулей объектов и менеджеров. В клиентском коде коллекции нет.
  • ⏳ Только на время сеанса. После выхода пользователя значение исчезает. Новый сеанс, в том числе фоновое задание или сеанс по HTTP-сервису, заполняет параметр заново.
  • 🛡️ Под контролем прав. Для каждой роли задаются два права: «Получение» и «Установка».
  • 🧩 Доступ в ограничениях RLS. В тексте ограничения доступа на уровне записей параметр сеанса указывают через амперсанд: &ТекущийСклад. Это главный исторический сценарий использования.

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

В обычном запросе параметр сеанса сам не подставится. Передайте его явно: Запрос.УстановитьПараметр("Склад", ПараметрыСеанса.ТекущийСклад). Подстановка &Имя без УстановитьПараметр работает только в ограничениях доступа.

Как создать параметр сеанса в конфигураторе

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

Шаг 1. Добавьте объект метаданных

  1. Откройте Конфигурация → Открыть конфигурацию.
  2. В дереве раскройте ветку Общие и найдите Параметры сеанса.
  3. Правой кнопкой по ветке → Добавить.
  4. Заполните Имя латиницей или кириллицей без пробелов, например ТекущийСклад, и Синоним для людей.

Шаг 2. Выберите тип

В поле «Тип» укажите, что будет храниться. Варианты:

Что хранитьКакой тип выбрать
Ссылку на элемент справочникаСправочникСсылка.Склады и т.п.
Флаг, число, строку, датупримитивный тип
Несколько ссылок для RLSФиксированныйМассив
Набор именованных настроекФиксированнаяСтруктура
Произвольные данныеХранилищеЗначения

Изменяемые коллекции вроде Массив, Структура или ТаблицаЗначений в тип параметра не выбрать. Если нужна коллекция, собирайте обычный массив и присваивайте Новый ФиксированныйМассив(Массив).

Шаг 3. Дайте права в ролях

Без прав параметр есть, но код упадёт при обращении к нему под обычным пользователем.

  1. Откройте нужную роль (Общие → Роли).
  2. В списке объектов роли найдите ветку Параметры сеанса и ваш параметр.
  3. Отметьте право «Получение» — для всех, кто будет читать значение. Сюда относится и чтение в RLS.
  4. Право «Установка» давайте только тем ролям, которым действительно нужно менять значение из своего кода. Для заполнения в модуле сеанса оно не требуется: модуль сеанса выполняется в привилегированном режиме.

Шаг 4. Обновите конфигурацию базы данных

Нажмите F7 или Конфигурация → Обновить конфигурацию базы данных. Параметр сеанса не меняет таблиц базы, поэтому обновление проходит быстро.

Расширение с новым параметром сеанса после подключения нужно применить, а пользователям — перезапустить сеанс. В уже открытых сеансах параметр не появится.

Заполнение значения в модуле сеанса

Платформа сама вызывает процедуру УстановкаПараметровСеанса из модуля сеанса. Открыть модуль : правой кнопкой по корню конфигурации → Открыть модуль сеанса.

Вызовов два вида:

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

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

Пример модуля сеанса для конфигурации без БСП

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

    Если ТребуемыеПараметры = Неопределено Тогда
        // Старт сеанса: заполняем только то, что нужно всегда.
        ПараметрыСеанса.ВнешнийСеанс = Ложь;
        Возврат;
    КонецЕсли;

    Для Каждого ИмяПараметра Из ТребуемыеПараметры Цикл

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

        ИначеЕсли ИмяПараметра = "РазрешенныеСклады" Тогда
            ПараметрыСеанса.РазрешенныеСклады = РазрешенныеСкладыПользователя();

        ИначеЕсли ИмяПараметра = "ВнешнийСеанс" Тогда
            ПараметрыСеанса.ВнешнийСеанс = Ложь;

        КонецЕсли;

    КонецЦикла;

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

Функция ОсновнойСкладПользователя()

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |    Настройки.Склад КАК Склад
    |ИЗ
    |    РегистрСведений.СкладыПользователей КАК Настройки
    |ГДЕ
    |    Настройки.ИмяПользователя = &ИмяПользователя
    |    И Настройки.Основной";
    Запрос.УстановитьПараметр("ИмяПользователя", ИмяПользователя());

    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        Возврат Выборка.Склад;
    КонецЕсли;

    Возврат Справочники.Склады.ПустаяСсылка();

КонецФункции

Функция РазрешенныеСкладыПользователя()

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Настройки.Склад КАК Склад
    |ИЗ
    |    РегистрСведений.СкладыПользователей КАК Настройки
    |ГДЕ
    |    Настройки.ИмяПользователя = &ИмяПользователя";
    Запрос.УстановитьПараметр("ИмяПользователя", ИмяПользователя());

    Массив = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Склад");
    Возврат Новый ФиксированныйМассив(Массив);

КонецФункции

Регистр СкладыПользователей здесь — пример собственного объекта с измерениями ИмяПользователя и Склад и ресурсом-флагом Основной. Подставьте свой источник данных.

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

Если в конфигурации есть БСП

Типовые конфигурации (Бухгалтерия, ЗУП, УТ) построены на Библиотеке стандартных подсистем. Там модуль сеанса не правят: он передаёт управление библиотеке. Свой параметр регистрируют в переопределяемом модуле ОбщегоНазначенияПереопределяемый, в процедуре ПриДобавленииОбработчиковУстановкиПараметровСеанса:

Процедура ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики) Экспорт

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

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

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

Чтение и проверка параметра сеанса в коде

Чтение — обычное обращение к свойству:

&НаСервереБезКонтекста
Функция СкладПоУмолчанию()
    Возврат ПараметрыСеанса.ТекущийСклад;
КонецФункции

Если параметр ещё не заполнен, платформа в этот момент сама вызовет УстановкаПараметровСеанса с его именем. Поэтому «просто посмотреть, заполнен ли параметр» нельзя: любое чтение запускает инициализацию.

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

Если Метаданные.ПараметрыСеанса.Найти("ТекущийСклад") <> Неопределено Тогда
    Склад = ПараметрыСеанса.ТекущийСклад;
КонецЕсли;

Проверить право на чтение у текущего пользователя:

ЕстьПраво = ПравоДоступа("Получение", Метаданные.ПараметрыСеанса.ТекущийСклад);

Как передать значение на клиент

С клиента параметр не прочитать. Варианты:

  1. Серверная функция без контекста возвращает значение, клиент кэширует его у себя.
  2. Общий модуль с повторным использованием возвращаемых значений «На время сеанса» — второй вызов не пойдёт на сервер.
  3. В управляемой форме: значение кладут в реквизит формы в ПриСозданииНаСервере.

Не тяните на клиент ФиксированныйМассив из тысяч ссылок. Передавайте то, что форме реально нужно, — например, одну ссылку или флаг.

Установка значения из обычного кода

Менять значение можно не только в модуле сеанса. Например, при смене склада пользователем:

&НаСервере
Процедура СменитьСкладНаСервере(НовыйСклад)
    УстановитьПривилегированныйРежим(Истина);
    ПараметрыСеанса.ТекущийСклад = НовыйСклад;
    УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры

Привилегированный режим нужен, если у роли нет права «Установка». Оставляйте его на минимальном участке кода и обязательно проверяйте, что НовыйСклад пользователю разрешён. Иначе любой обход RLS через параметр станет возможен.

Сброс и повторное заполнение параметров сеанса

Удалить параметр из сеанса нельзя: он существует, пока есть в метаданных. Зато значение можно сбросить. Метод ПараметрыСеанса.Сбросить() очищает значения, и при следующем обращении платформа снова вызовет УстановкаПараметровСеанса.

// Сбросить конкретные параметры
Имена = Новый Массив;
Имена.Добавить("ТекущийСклад");
Имена.Добавить("РазрешенныеСклады");
ПараметрыСеанса.Сбросить(Имена);

// Сбросить все параметры сеанса
ПараметрыСеанса.Сбросить();

Когда это нужно:

  • 🔄 администратор поменял настройки пользователя, и новые права должны сработать без перезапуска;
  • 🔄 пользователь переключил основную организацию;
  • 🔄 тест или обработка меняет параметр и должна вернуть исходное состояние.

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

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

Ошибки при работе с параметрами сеанса и отладка

Диагностика: выберите симптом

Как отлаживать модуль сеанса

Точку останова в УстановкаПараметровСеанса поставить можно, но отладчик должен успеть подключиться к сеансу до его старта. Включите в конфигураторе автоматическое подключение отладчика к новым сеансам (Отладка → Подключение, затем настройка автоматического подключения) и запустите предприятие из конфигуратора.

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

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

Параметры сеанса или другие способы хранения

Параметр сеанса — не единственное место для данных «на время работы». Выбор зависит от того, кто читает значение и сколько оно должно жить.

СпособГде доступноСколько живётКогда брать
Параметр сеансасервер, RLSсеансзначение нужно в ограничениях доступа или в серверном коде многих модулей
Общий модуль с повторным использованием «На время сеанса»там, где модульсеанс, кэш может очиститься раньшенужен кэш вычислений, без прав и RLS
Константасервер и клиент через серверпостоянноодно значение на всю базу
ХранилищеОбщихНастроексерверпостоянноличные настройки пользователя между сеансами
Временное хранилищеклиент и сервер по адресудо закрытия формы или сеансапередать большой объём между клиентом и сервером
Глобальная переменная клиента в модуле приложенияклиентсеансфлаги интерфейса, которые серверу не нужны

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

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

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

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