Параметры сеанса в 1С 8.3: объект метаданных, модуль сеанса и ограничения доступа
Содержание
Параметр сеанса создают в конфигураторе: ветка Общие → Параметры сеанса, кнопка «Добавить», затем задают имя и тип. Значение ему присваивают кодом на сервере, обычно в процедуре УстановкаПараметровСеанса(ТребуемыеПараметры) модуля сеанса. Читают его так же, через глобальное свойство ПараметрыСеанса.ИмяПараметра.
Механизм одинаков для любой конфигурации на платформе 8.3: Бухгалтерии, ЗУП, УТ или собственной разработки. Разница только в том, куда вписать свой код: в основную конфигурацию или в расширение.
Зачем нужны параметры сеанса и чем они отличаются от констант
Параметр сеанса — это переменная, которая живёт ровно столько, сколько живёт сеанс пользователя. У каждого сеанса своё значение. Бухгалтер Иванова и кладовщик Петров могут одновременно работать с разными значениями одного и того же параметра.
Типичные задачи:
- 👤 Текущий пользователь как ссылка на элемент справочника. Её ищут один раз при входе, а потом берут готовой.
- 🏢 Список доступных организаций или складов для ограничения доступа на уровне записей (RLS).
- ⚙️ Флаги режима работы: «идёт обмен», «работает регламентное задание», «включена отладка».
- 🌐 Данные о рабочем месте: код подразделения или филиала, к которому привязан компьютер.
Чем параметр сеанса отличается от соседних механизмов:
| Механизм | Где хранится значение | Видно другим сеансам | Когда подходит |
|---|---|---|---|
| Параметр сеанса | В памяти сервера, отдельно для каждого сеанса | Нет | Нужен в RLS или должен быть единым для всего сеанса |
| Константа | В базе данных | Да | Общая настройка для всей базы |
| Общий модуль с повторным использованием «На время сеанса» | В кэше сеанса | Нет | Кэш результатов функций, не нужен в RLS |
| Реквизит формы или переменная модуля | В форме или модуле | Нет | Значение нужно только в одной форме |
Главный довод в пользу параметра сеанса — ограничения доступа к данным. Текст условия RLS не умеет вызывать функции общих модулей, а параметры сеанса видит напрямую.
Как создать параметр сеанса в конфигураторе
Конфигурация должна быть доступна для изменения. Если она на поддержке поставщика, сначала придётся включить возможность изменения, а потом учитывать правки модуля сеанса при каждом обновлении. Для типовых баз удобнее делать всё в расширении (об этом ниже).
Шаги создания
- Откройте конфигуратор и дерево конфигурации:
Конфигурация → Открыть конфигурацию. - Раскройте ветку
Общиеи найдите в нейПараметры сеанса. - Выделите ветку и нажмите «Добавить» (или клавишу
Insert). - В палитре свойств заполните Имя, например
ТекущаяОрганизация, и Синоним. - В свойстве Тип выберите тип значения.
- Сохраните конфигурацию и обновите конфигурацию базы данных (
F7).
Имя выбирайте так, чтобы оно читалось в тексте ограничений доступа: ДоступныеСклады понятнее, чем Склады1. Префикс вроде Мой_ или аббревиатура компании помогает отличить свои объекты от типовых. Переименовать параметр позже можно, но придётся править все роли и модули, где он упомянут, а глобальный поиск по строке в RLS-условиях легко что-то пропустить.
Какой тип выбрать
Параметр сеанса не может иметь произвольный тип. Допустимы:
- 🔤 примитивные:
Строка,Число,Дата,Булево; - 🔗 ссылки на объекты:
СправочникСсылка.Организации,ДокументСсылка.…и другие; - 📦
ФиксированныйМассивиФиксированнаяСтруктура; - 🗄
ХранилищеЗначенияиУникальныйИдентификатор.
Составной тип тоже разрешён. А вот обычный Массив, Структура или ТаблицаЗначений записать в параметр нельзя: платформа требует неизменяемые значения. Нужен список — оберните его в Новый ФиксированныйМассив(Массив).
Для RLS чаще всего нужен ФиксированныйМассив ссылок. Тогда условие пишется как Организация В (&ДоступныеОрганизации), и одно правило покрывает и одного, и десять разрешённых объектов.
Права в ролях
У каждого параметра сеанса в роли есть два права:
| Право | Что разрешает |
|---|---|
| Получение | Читать значение из кода без привилегированного режима |
| Установка | Присваивать значение из кода без привилегированного режима |
Откройте нужную роль, в списке объектов найдите ветку параметров сеанса и отметьте права. Роль с полными правами получает их автоматически. Пользовательским ролям обычно дают только «Получение», а установку выполняют в привилегированном режиме.
Модуль сеанса работает в привилегированном режиме сам по себе. Поэтому, если параметр заполняется только там, право «Установка» пользователям не нужно вовсе.
Установка параметров сеанса при старте: модуль сеанса
Модуль сеанса открывают из контекстного меню корня конфигурации: пункт «Открыть модуль
сеанса». Внутри размещают обработчик УстановкаПараметровСеанса. Платформа вызывает его в двух случаях:
- 🚀 при старте сеанса — с параметром
ТребуемыеПараметры = Неопределено; - 🔍 при первом обращении к ещё не заполненному параметру — с массивом имён тех параметров, которые понадобились.
Второй случай даёт «ленивую» инициализацию. Сеанс стартует быстрее, а тяжёлые вычисления выполняются только тогда, когда значение действительно запросили.
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
Если ТребуемыеПараметры = Неопределено Тогда
// Старт сеанса: ничего не считаем заранее,
// каждый параметр заполнится при первом обращении.
Возврат;
КонецЕсли;
Для Каждого ИмяПараметра Из ТребуемыеПараметры Цикл
Если ИмяПараметра = "ТекущийПользователь" Тогда
ПараметрыСеанса.ТекущийПользователь = НайтиПользователяСправочника();
ИначеЕсли ИмяПараметра = "ДоступныеОрганизации" Тогда
ПараметрыСеанса.ДоступныеОрганизации = ПолучитьДоступныеОрганизации();
ИначеЕсли ИмяПараметра = "РежимОбмена" Тогда
ПараметрыСеанса.РежимОбмена = Ложь;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция НайтиПользователяСправочника()
ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
Найденный = Справочники.Пользователи.НайтиПоРеквизиту(
"ИдентификаторПользователяИБ", ПользовательИБ.УникальныйИдентификатор);
Возврат Найденный;
КонецФункции
Функция ПолучитьДоступныеОрганизации()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Доступ.Организация КАК Организация
|ИЗ
| РегистрСведений.ДоступКОрганизациям КАК Доступ
|ГДЕ
| Доступ.Пользователь = &Пользователь";
Запрос.УстановитьПараметр("Пользователь", ПараметрыСеанса.ТекущийПользователь);
Массив = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Организация");
Возврат Новый ФиксированныйМассив(Массив);
КонецФункции
Справочник Пользователи с реквизитом ИдентификаторПользователяИБ и регистр ДоступКОрганизациям здесь условные: подставьте объекты своей конфигурации.
Посмотрите на функцию ПолучитьДоступныеОрганизации. Она сама читает ПараметрыСеанса.ТекущийПользователь. Если этот параметр ещё пуст, платформа повторно вызовет обработчик для него, и цепочка разрешится сама.
Если обработчик получил имя параметра в ТребуемыеПараметры и не присвоил ему значение, код, который к нему обратился, упадёт с ошибкой. Каждая ветка Если обязана что-то записать, хотя бы пустую ссылку или Ложь.
Типовые конфигурации на БСП
В Бухгалтерии, ЗУП, УТ и других типовых решениях на Библиотеке стандартных подсистем модуль сеанса уже занят. Обработчик передаёт управление подсистемам, а те заполняют свои параметры.
Свой параметр в такой базе правильнее добавлять в расширении конфигурации:
- Создайте в расширении новый параметр сеанса (собственный объект расширения).
- Дайте права на него в роли расширения.
- В модуле сеанса расширения добавьте
УстановкаПараметровСеансаи заполните там только свой параметр.
Так обновление типовой не затрёт вашу доработку.
Изменение параметра сеанса во время работы
Параметр можно перезаписать в любой момент, но только в серверном коде. Пример: пользователь сменил основную организацию в настройках, и это должно сразу повлиять на подбор данных.
&НаСервереБезКонтекста
Процедура СменитьОрганизациюНаСервере(НоваяОрганизация)
УстановитьПривилегированныйРежим(Истина);
ПараметрыСеанса.ТекущаяОрганизация = НоваяОрганизация;
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Привилегированный режим включают, когда у роли пользователя нет права «Установка». Держите его включённым только на одной строке присваивания, а не на всю процедуру.
Сброс значений
Метод ПараметрыСеанса.Сбросить() очищает значения. Ему передают массив имён параметров, которые нужно сбросить. При следующем обращении к сброшенному параметру платформа снова вызовет УстановкаПараметровСеанса, и значение пересчитается.
Это удобный приём после изменения прав: администратор поменял доступ, а пересчитать список организаций в текущем сеансе можно без перезапуска.
ИменаПараметров = Новый Массив;
ИменаПараметров.Добавить("ДоступныеОрганизации");
ПараметрыСеанса.Сбросить(ИменаПараметров);
Новое значение видит только текущий сеанс. Остальные пользователи продолжают работать со своими значениями, пока их сеансы не пересчитают параметры или не перезапустятся.
Чтение параметров сеанса и информация о самом сеансе
Чтение — обычное обращение к свойству:
Организация = ПараметрыСеанса.ТекущаяОрганизация;
Свойство ПараметрыСеанса доступно на сервере, в толстом клиенте и во внешнем соединении. В управляемой форме на тонком клиенте или в веб-клиенте прямого доступа нет: нужна серверная функция.
&НаСервереБезКонтекста
Функция ТекущаяОрганизацияНаСервере()
Возврат ПараметрыСеанса.ТекущаяОрганизация;
КонецФункции
Перебрать все параметры конфигурации можно через метаданные: Для Каждого Параметр Из Метаданные.ПараметрыСеанса Цикл. Это пригодится для отладочной обработки, которая показывает текущие значения. Учтите: обращение к каждому параметру вызовет его ленивую инициализацию.
Как посмотреть значения в отладчике
Самый быстрый способ проверить параметры — точка останова в любом серверном коде. В окне «Вычислить выражение» (Shift+F9) введите ПараметрыСеанса.ТекущаяОрганизация и посмотрите результат. Для фиксированного массива раскройте значение в табло: видно и количество элементов, и сами ссылки.
Если отладчик недоступен, например в рабочей базе, запишите значения в журнал регистрации:
ЗаписьЖурналаРегистрации("Отладка.ПараметрыСеанса",
УровеньЖурналаРегистрации.Информация, , ,
"Организация: " + Строка(ПараметрыСеанса.ТекущаяОрганизация));
После проверки удалите эту строку, чтобы не засорять журнал при каждом входе пользователей.
Объект СеансИнформационнойБазы
Технические данные о сеансе хранятся не в параметрах сеанса, а в объекте СеансИнформационнойБазы. Его возвращает функция ПолучитьТекущийСеансИнформационнойБазы().
Сеанс = ПолучитьТекущийСеансИнформационнойБазы();
НомерСеанса = Сеанс.НомерСеанса;
Приложение = Сеанс.ИмяПриложения; // например, "ThinClient" или "BackgroundJob"
Начало = Сеанс.НачалоСеанса;
Эти свойства задаёт платформа, менять их нельзя. Хотите хранить что-то своё на время сеанса — заводите параметр сеанса.
Список всех сеансов базы возвращает ПолучитьСеансыИнформационнойБазы(). Через него, например, проверяют, не запущен ли уже обмен в другом сеансе.
Параметры сеанса в запросах, RLS и схеме компоновки
Обычный запрос
В тексте запроса нельзя напрямую сослаться на параметр сеанса. Значение передают как обычный параметр запроса:
Запрос.УстановитьПараметр("Организация", ПараметрыСеанса.ТекущаяОрганизация);
В англоязычном синтаксисе это Query.SetParameter() и SessionParameters. Отсюда встречающееся в описаниях название SetParameter.
Ограничение доступа к данным (RLS)
Здесь параметры сеанса подставляются сами. В роли, в ограничении права «Чтение» для документа, пишут:
ГДЕ Организация В (&ДоступныеОрганизации)
Имя после & совпадает с именем параметра сеанса. Платформа подставит значение текущего сеанса при каждом обращении к таблице.
Если ограничение ссылается на параметр, который в сеансе не удалось заполнить, пользователь получит ошибку при открытии списка. Проверяйте RLS под учётной записью с урезанной ролью, а не под администратором: у роли с полными правами ограничения обычно не настроены.
Схема компоновки данных
В СКД значение тоже передают из кода. Например, в модуле отчёта перед формированием:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(
"Организация", ПараметрыСеанса.ТекущаяОрганизация);
КонецПроцедуры
Параметр Организация должен быть объявлен на закладке «Параметры» схемы. Если в отчёте пользователь не должен его менять, снимите у параметра флажок доступности в пользовательских настройках или ограничьте его использование.
Ограничения и частые ошибки
Что платформа не позволит сделать:
- ❌ записать в параметр изменяемую коллекцию (
Массив,Структура,ТаблицаЗначений); - ❌ установить значение на клиенте;
- ❌ задать значение по умолчанию в свойствах объекта: начальное значение даёт только код;
- ❌ сохранить значение между сеансами: после перезахода всё считается заново.
Ещё одна ловушка — бесконечная рекурсия. Если функция заполнения параметра А читает параметр Б, а заполнение Б читает А, сеанс зависнет на старте или упадёт. Стройте зависимости в одну сторону: «пользователь → организации → склады».
Не храните в параметрах сеанса большие объёмы. Каждый сеанс держит свою копию в памяти сервера. Массив из тысяч ссылок, умноженный на сотню пользователей, заметно нагрузит рабочие процессы.