Параметры сеанса в 1С 8.3: где задать значение, как прочитать и почему возникает ошибка
Содержание
Параметр сеанса в 1С устанавливают на сервере простым присваиванием: ПараметрыСеанса.ТекущаяОрганизация = Организация;. Штатное место для этого — процедура УстановкаПараметровСеанса(ТребуемыеПараметры) в модуле сеанса. Платформа вызывает её при старте сеанса и каждый раз, когда код читает параметр, которому ещё не присвоено значение.
Тема общая для платформы 1С:Предприятие 8.3 и не зависит от конфигурации. Сам параметр сначала создают в Конфигураторе: ветка Общие → Параметры сеанса, у него задают имя и тип. В типовых конфигурациях на БСП код установки пишут не в модуле сеанса напрямую, а через обработчики подсистемы. Об этом отдельный раздел ниже.
Что такое параметр сеанса и сколько он живёт
Параметр сеанса — это значение, которое принадлежит одному сеансу пользователя. Оно появляется при входе в программу и пропадает при выходе. Другие сеансы его не видят, даже если это тот же пользователь на соседнем компьютере.
Чем он отличается от похожих механизмов:
| Механизм | Где хранится | Кто видит | Сколько живёт |
|---|---|---|---|
| Параметр сеанса | на сервере, в данных сеанса | только этот сеанс | до завершения сеанса |
| Константа | в базе | все пользователи | пока не изменят |
| Глобальная переменная модуля приложения | на клиенте | только клиент этого сеанса | до закрытия клиента |
| Модуль с повторным использованием | кэш на клиенте или сервере | этот сеанс | по времени кэша или до конца сеанса |
| Хранилище настроек | в базе | по пользователю | пока не удалят |
Для чего параметры сеанса применяют на практике:
- 👤 текущий пользователь (ссылка на элемент справочника
Пользователи); - 🏢 организация или подразделение, с которыми человек работает весь день;
- 🔒 значения для ограничения доступа на уровне записей (RLS);
- ⚙️ признаки режима работы: обмен, загрузка данных, работа в модели сервиса.
Главное свойство, ради которого их заводят, — доступ из текста ограничений RLS. Константу или переменную модуля в шаблон ограничения не подставить, а параметр сеанса подставляется через &ИмяПараметра.
Как создать параметр в конфигураторе
Перед установкой значения параметр должен существовать в метаданных.
- Откройте конфигурацию:
Конфигурация → Открыть конфигурацию. - В дереве раскройте
Общие → Параметры сеанса. - Добавьте новый элемент, задайте имя латиницей или кириллицей без пробелов, например
ТекущаяОрганизация. - На закладке типа выберите тип значения: ссылку на справочник, строку, число, булево, дату.
- Откройте нужную роль и на объекте параметра отметьте права
Получениеи, если роль должна менять значение из своего кода,Установка. - Сохраните и выполните
Конфигурация → Обновить конфигурацию базы данных.
Если параметр должен хранить список значений, выберите тип ФиксированныйМассив или ФиксированнаяСтруктура. Обычный Массив и Структура присвоить нельзя: значение параметра сеанса не должно меняться «изнутри».
Права на параметр часто забывают. Модулю сеанса они не нужны, но код в общих модулях, который работает от имени пользователя, без права Получение упадёт с ошибкой доступа.
Модуль сеанса и процедура УстановкаПараметровСеанса
Модуль сеанса открывается через контекстное меню корня конфигурации: Открыть модуль сеанса. В нём одна предопределённая процедура-обработчик.
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
Если ТребуемыеПараметры = Неопределено Тогда
// Старт сеанса: ставим то, что дёшево и нужно всем
ПараметрыСеанса.РежимОбмена = Ложь;
Возврат;
КонецЕсли;
// Ленивая установка: платформа передала имена параметров,
// к которым обратились, но которые ещё пусты
Для Каждого ИмяПараметра Из ТребуемыеПараметры Цикл
Если ИмяПараметра = "ТекущаяОрганизация" Тогда
ПараметрыСеанса.ТекущаяОрганизация = ОрганизацияПоУмолчанию();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ОрганизацияПоУмолчанию()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Организации.Ссылка КАК Ссылка
|ИЗ
| Справочник.Организации КАК Организации
|ГДЕ
| НЕ Организации.ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
КонецЕсли;
Возврат Справочники.Организации.ПустаяСсылка();
КонецФункции
Как платформа вызывает обработчик:
| Момент | Значение ТребуемыеПараметры | Что делать |
|---|---|---|
| Начало сеанса | Неопределено | ставить только лёгкие и всегда нужные параметры |
| Первое чтение пустого параметра | массив строк с именами | установить каждый параметр из массива |
Модуль сеанса выполняется в привилегированном режиме. Поэтому внутри него не нужны ни права Установка, ни вызов УстановитьПривилегированныйРежим.
Если обработчик получил имя в массиве, но не присвоил этому параметру значение, чтение завершится ошибкой о том, что параметр сеанса не установлен. Каждая ветка Если должна заканчиваться присваиванием, даже пустой ссылки.
Синтаксис присваивания и смена значения в работе
Кроме модуля сеанса, значение можно поменять в любом серверном коде. Синтаксис тот же:
ПараметрыСеанса.ТекущаяОрганизация = НоваяОрганизация;
Типичная задача — пользователь выбрал на начальной странице другую организацию, и весь дальнейший учёт должен идти от неё. Клиентский код сам параметр не видит: в тонком клиенте и веб-клиенте объекта ПараметрыСеанса нет вообще. Нужен серверный вызов.
Общий модуль РаботаСПараметрамиСеанса, флажки Сервер и Вызов сервера:
Процедура УстановитьТекущуюОрганизацию(Организация) Экспорт
Если Не ЗначениеЗаполнено(Организация) Тогда
ВызватьИсключение НСтр("ru = 'Не выбрана организация'");
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
ПараметрыСеанса.ТекущаяОрганизация = Организация;
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Функция ТекущаяОрганизация() Экспорт
Возврат ПараметрыСеанса.ТекущаяОрганизация;
КонецФункции
Вызов из формы:
&НаКлиенте
Процедура ОрганизацияПриИзменении(Элемент)
РаботаСПараметрамиСеанса.УстановитьТекущуюОрганизацию(Объект.Организация);
КонецПроцедуры
Привилегированный режим здесь нужен, если у роли пользователя нет права Установка. Давать это право всем ролям хуже: тогда менять значение сможет любой серверный код, в том числе внешние обработки.
Не открывайте через «Вызов сервера» процедуру, которая записывает в параметр любое переданное значение без проверки, если этот параметр участвует в RLS. Иначе пользователь из внешней обработки подменит организацию и увидит чужие данные.
Как это работает в клиент-серверном варианте
Значения параметров сеанса хранит сервер 1С в данных сеанса. В файловом варианте логика та же, просто «сервер» работает внутри процесса клиента.
Что из этого следует для разработчика:
- 🖥️ Тонкий клиент и веб-клиент. Прямого доступа нет. Только через серверную функцию, как в примере выше.
- 🧱 Толстый клиент, обычное приложение.
ПараметрыСеансадоступны и в клиентском коде, но переносить такой код в управляемое приложение придётся с переделкой. Лучше сразу писать через сервер. - 🔁 Фоновые задания. Каждое задание — отдельный сеанс. Параметры родительского сеанса оно не наследует: для него снова сработает
УстановкаПараметровСеанса. Нужное значение передавайте в параметрах задания и при необходимости присваивайте в начале процедуры задания. - 🔌 Внешнее соединение, HTTP-сервисы, регламентные задания. Тоже самостоятельные сеансы со своей инициализацией. Пользователь в регламентном задании может быть не задан, поэтому код установки должен это переживать без ошибки.
Частая находка при отладке: в обычном сеансе всё работает, а фоновое задание падает на RLS. Причина почти всегда в том, что обработчик установки рассчитывает на интерактивного пользователя и не находит его.
Установка параметров сеанса в конфигурациях на БСП
В БП 3.0, ЗУП 3.1, УТ 11 и других конфигурациях на Библиотеке стандартных подсистем модуль сеанса уже занят. Он передаёт управление в СтандартныеПодсистемыСервер.УстановкаПараметровСеанса. Править модуль сеанса типовой конфигурации не нужно: это усложнит обновления.
Свой параметр подключают через обработчик. В общем модуле ОбщегоНазначенияПереопределяемый есть процедура ПриДобавленииОбработчиковУстановкиПараметровСеанса:
Процедура ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики) Экспорт
Обработчики.Вставить("ТекущаяОрганизация",
"МойМодульСервер.УстановкаПараметровСеанса");
КонецПроцедуры
Сам обработчик в своём серверном общем модуле:
Процедура УстановкаПараметровСеанса(ИмяПараметра, УстановленныеПараметры) Экспорт
Если ИмяПараметра = "ТекущаяОрганизация" Тогда
ПараметрыСеанса.ТекущаяОрганизация = Справочники.Организации.ПустаяСсылка();
УстановленныеПараметры.Добавить(ИмяПараметра);
КонецЕсли;
КонецПроцедуры
Добавление имени в УстановленныеПараметры сообщает БСП, что параметр готов. В ключе соответствия можно указать маску со звёздочкой, например "МойПрефикс*", тогда один обработчик будет отвечать за группу параметров.
В доработках через расширение параметр сеанса добавляют в самом расширении. Подписку на установку делают так же, через заимствованный ОбщегоНазначенияПереопределяемый и аннотацию &После к процедуре ПриДобавленииОбработчиковУстановкиПараметровСеанса. Типовой код остаётся нетронутым.
Параметр сеанса в запросах и ограничениях доступа
В тексте ограничения доступа на уровне записей параметр сеанса пишут через амперсанд:
ГДЕ Организация = &ТекущаяОрганизация
Платформа подставит значение сама. Если параметр пуст в момент проверки, сработает ленивая установка из модуля сеанса.
В обычном запросе автоматической подстановки нет. Значение передают явно:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Реализация.Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.Организация = &Организация";
Запрос.УстановитьПараметр("Организация", ПараметрыСеанса.ТекущаяОрганизация);
Если параметр меняется во время работы, а RLS на нём построен, открытые списки покажут новые данные только после обновления формы. Предупредите об этом пользователей.
Ошибки при установке и чтении параметров
Отлаживать установку удобно отладчиком конфигуратора: поставьте точку останова в УстановкаПараметровСеанса и запустите отладку. Для фоновых заданий включите в настройках отладки автоматическое подключение к фоновым заданиям, иначе точка останова не сработает.
Как не замедлить вход в программу
Обработчик при старте сеанса выполняется у каждого пользователя при каждом входе. Тяжёлый запрос там умножается на число входов за день.
Что помогает:
- Ленивая установка. При
ТребуемыеПараметры = Неопределеноставьте минимум. Остальное — по требованию, через массив имён. - Лёгкие значения. Храните ссылку, а не структуру с десятком полей. Реквизиты по ссылке дочитывайте там, где они нужны.
- Редкая запись. Каждое присваивание меняет данные сеанса на сервере. Не перезаписывайте параметр в цикле и не используйте его как счётчик.
- Кэш на клиенте. Если клиенту значение нужно часто, оберните чтение в общий модуль с повторным использованием возвращаемых значений на время сеанса. Тогда серверный вызов будет один. При смене значения кэш сбрасывают методом
ОбновитьПовторноИспользуемыеЗначения(). - Нет запросов к внешним системам. HTTP-запрос в обработчике установки при недоступном сервисе затянет вход на время таймаута.
Когда параметр сеанса НЕ нужен:
- значение требуется в одной форме — хватит реквизита формы;
- значение общее для всех пользователей — это константа;
- значение должно пережить перезапуск программы — это настройка пользователя в хранилище настроек.
Частые вопросы о параметрах сеанса
Можно ли задать значение параметра сеанса из внешней обработки?
Сохраняется ли значение после перезапуска 1С?
Как сбросить параметр сеанса без выхода из программы?
ОбновитьПовторноИспользуемыеЗначения().