Параметры сеанса в 1С 8.3: модуль сеанса, ленивая инициализация и передача значений при запуске
Содержание
Параметры сеанса в 1С заполняются в модуле сеанса, в обработчике УстановкаПараметровСеанса(ИменаПараметров). Открыть его можно в конфигураторе: правой кнопкой по корню дерева конфигурации → Открыть модуль сеанса. Других «официальных» мест у платформы нет: ни ini-файл, ни окно запуска, ни настройки пользователя значения параметров сеанса не хранят.
Частое заблуждение — путать параметры сеанса с параметрами запуска. Ключ /C в командной строке, строка соединения и персональные настройки — это разные вещи. Но значение из командной строки можно передать в параметр сеанса, и ниже показано, как сделать это правильно.
Что такое параметры сеанса и где они живут
Параметр сеанса — объект метаданных из ветки Общие → Параметры сеанса. У него есть имя и тип. Значение существует только в рамках одного сеанса: пользователь вышел — значение исчезло, новый вход — всё заполняется заново.
Зачем они нужны:
- 🔐 ограничения доступа на уровне записей (RLS) — в тексте ограничения параметр пишут через амперсанд, например
&ТекущийПользователь; - ⚡ быстрый доступ к часто нужным данным — текущий пользователь, его организация, режим работы, без запроса к базе на каждое обращение;
- 🧭 флаги режима работы — например, признак того, что сеанс запущен для обмена или под служебным пользователем.
Что важно знать про устройство:
| Свойство | Как работает |
|---|---|
| Где доступны | Только на сервере: серверные процедуры, внешнее соединение, фоновые задания. Из клиентского кода напрямую не видны |
| Срок жизни | Один сеанс. В базе значения не сохраняются |
| Типы | Примитивные, ссылочные, фиксированные коллекции (ФиксированныйМассив, ФиксированнаяСтруктура, ФиксированноеСоответствие). Обычный Массив или Структура выбрать нельзя |
| Права | В роли для каждого параметра есть права Получение и Установка |
| Модуль сеанса | Выполняется в привилегированном режиме, поэтому права ролей на установку внутри него не проверяются |
Параметры сеанса и файлы настроек запуска: в чём разница
На форумах часто советуют «поправить параметры в ini-файле». Это про другое: файлы настроек управляют запуском платформы, а не значениями внутри сеанса.
| Что | Где лежит | За что отвечает |
|---|---|---|
1CEStart.cfg | %APPDATA%\1C\1CEStart\ | Настройки окна запуска и пути к спискам баз |
ibases.v8i | %APPDATA%\1C\1CEStart\ | Список баз: строки соединения, версия платформы, дополнительные параметры запуска |
conf.cfg | папка bin\conf установленной платформы | Общие настройки платформы на компьютере |
| Параметр сеанса | память сервера, в рамках сеанса | Значение, которое вычисляет код конфигурации |
Связь между ними одна: дополнительные параметры запуска из ibases.v8i (тот же ключ /C) можно прочитать кодом и превратить в значение параметра сеанса. Записать значение параметра сеанса в какой-либо файл и «подложить» его при входе нельзя.
Модуль сеанса: главное место заполнения
Порядок действий в конфигураторе:
- В дереве метаданных откройте
Общие → Параметры сеансаи добавьте параметр. Задайте имя (например,ОсновнаяОрганизация) и тип (СправочникСсылка.Организации). - Откройте роли, которым параметр нужен, и отметьте право
Получение. ПравоУстановкадавайте только если параметр меняют вне модуля сеанса. - Щёлкните правой кнопкой по корню конфигурации и выберите
Открыть модуль сеанса. - В модуле создайте процедуру
УстановкаПараметровСеанса(ИменаПараметров)— платформа вызывает её сама. - Выполните
Обновить конфигурацию базы данных(F7) и проверьте значения в отладке.
Как платформа вызывает обработчик
Обработчик срабатывает в двух ситуациях:
- 🚪 при старте сеанса — параметр
ИменаПараметровравенНеопределено; - 🔎 при первом обращении к незаполненному параметру — в
ИменаПараметровприходит массив имён тех параметров, которые нужны прямо сейчас.
Второй режим называют ленивой инициализацией. Он позволяет не считать всё подряд при входе пользователя, а заполнять параметр только тогда, когда к нему впервые обратился код или ограничение доступа.
Пример модуля сеанса
Процедура УстановкаПараметровСеанса(ИменаПараметров)
Если ИменаПараметров = Неопределено Тогда
// Старт сеанса: заполняем только дешёвые параметры
ПараметрыСеанса.ИмяПользователяИБ = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
Возврат;
КонецЕсли;
// Ленивая инициализация: заполняем то, что запросили
Для Каждого ИмяПараметра Из ИменаПараметров Цикл
Если ИмяПараметра = "ДоступныеОрганизации" Тогда
ПараметрыСеанса.ДоступныеОрганизации = ПолучитьДоступныеОрганизации();
ИначеЕсли ИмяПараметра = "РежимСклада" Тогда
ПараметрыСеанса.РежимСклада = 0; // значение по умолчанию
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ПолучитьДоступныеОрганизации()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Организации.Ссылка КАК Ссылка
|ИЗ
| Справочник.Организации КАК Организации
|ГДЕ
| НЕ Организации.ПометкаУдаления";
Массив = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
Возврат Новый ФиксированныйМассив(Массив);
КонецФункции
Тип ДоступныеОрганизации здесь — ФиксированныйМассив. Если присвоить обычный Массив, платформа выдаст ошибку несоответствия типа.
Типовые конфигурации на БСП: куда добавлять свой параметр
В БП 3.0, ЗУП 3.1, УТ 11 и других конфигурациях на Библиотеке стандартных подсистем модуль сеанса почти пустой. Он передаёт управление в БСП, а та раскладывает работу по обработчикам подсистем.
Для своего параметра правильный путь такой:
- Создайте параметр сеанса в расширении конфигурации, а не в основной конфигурации. Так типовое обновление не затрёт доработку.
- Обработчик регистрируют в процедуре
ПриДобавленииОбработчиковУстановкиПараметровСеансаобщего модуляОбщегоНазначенияПереопределяемый. В расширении это делается через аннотацию&Послек этой процедуре. - В соответствие
Обработчикидобавьте пару: имя параметра → полное имя процедуры, которая его заполнит, например"МоиПараметры.УстановитьРежимСклада". - Процедура-обработчик принимает имя параметра и массив уже установленных параметров. Точную сигнатуру сверьте с комментарием к переопределяемой процедуре в вашей версии БСП.
Не правьте модуль сеанса типовой конфигурации напрямую: снимается поддержка с объекта, а каждое обновление превращается в ручное сравнение-объединение.
Посмотреть, какие параметры уже есть в конфигурации, просто: раскройте Общие → Параметры сеанса в конфигураторе. В типовых их десятки — от ТекущийПользователь до служебных параметров обмена и ограничения доступа.
Передача значения при запуске: ключ /C и окно запуска
Значение из командной строки напрямую в параметр сеанса не попадает. Ключ /C кладёт строку в глобальное свойство ПараметрЗапуска, а оно доступно только на клиенте. Чтобы заполнить параметр сеанса, строку нужно передать на сервер.
Строка запуска:
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F"D:\Bases\Sklad" /N"Кладовщик" /C"РежимСклада=2"
Ту же строку можно не писать в ярлык, а указать в свойствах базы в окне запуска: Изменить → последний шаг мастера → поле Дополнительные параметры запуска. Туда вписывают /C"РежимСклада=2".
Клиентская часть, модуль управляемого приложения:
Процедура ПриНачалеРаботыСистемы()
Если ЗначениеЗаполнено(ПараметрЗапуска) Тогда
МоиПараметрыВызовСервера.ПрименитьПараметрЗапуска(ПараметрЗапуска);
КонецЕсли;
КонецПроцедуры
Серверная часть, общий модуль МоиПараметрыВызовСервера с флажками Сервер, Вызов сервера и Привилегированный:
Процедура ПрименитьПараметрЗапуска(СтрокаПараметров) Экспорт
Для Каждого Часть Из СтрРазделить(СтрокаПараметров, ";", Ложь) Цикл
Позиция = СтрНайти(Часть, "=");
Если Позиция = 0 Тогда
Продолжить;
КонецЕсли;
Ключ = СокрЛП(Лев(Часть, Позиция - 1));
Значение = СокрЛП(Сред(Часть, Позиция + 1));
Если Ключ = "РежимСклада" И СтрДлина(Значение) > 0 И СтрНайти("0123456789", Лев(Значение, 1)) > 0 Тогда
ПараметрыСеанса.РежимСклада = Число(Значение);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Строку /C пользователь может подменить в своём ярлыке. Не используйте её для того, что влияет на права доступа. Для настройки интерфейса и режима работы — нормально, для RLS — нельзя.
Неочевидные места, где параметры сеанса тоже заполняются
Модуль сеанса выполняется не только при входе пользователя в тонкий клиент. Это часто упускают при отладке.
| Где стартует сеанс | Что происходит с параметрами |
|---|---|
| Фоновое и регламентное задание | Отдельный сеанс, модуль сеанса отрабатывает. Код задания не должен полагаться на то, что параметр «уже заполнен где-то в интерфейсе» |
| Внешнее соединение (COM) | Модуль сеанса выполняется, клиентского ПриНачалеРаботыСистемы нет. Ключ /C здесь не работает |
| HTTP- и веб-сервисы | Каждый вызов идёт в сеансе, обработчик срабатывает. Тяжёлая инициализация при старте замедляет каждый запрос |
| Обмен через планы обмена | Выполняется в сеансе пользователя обмена, значения считаются для него |
Отсюда два практических правила:
- 🐢 при старте сеанса (
ИменаПараметров = Неопределено) заполняйте только то, что считается мгновенно, остальное — лениво; - 🧩 код обработчика не должен вызывать клиентские методы и формы: в фоновом задании и веб-сервисе их нет.
Ещё одна неочевидная вещь — запуск с ключом /UsePrivilegedMode. Он нужен для отладки и работает только у пользователя с правом администрирования. В таком сеансе права ролей не проверяются, поэтому ошибки «не хватает права Получение» в нём не воспроизведутся. Тестируйте права под обычным пользователем.
Почему параметр не заполняется: ошибки и проверка
Как посмотреть фактическое значение:
- Запустите базу в режиме отладки из конфигуратора (F5).
- Поставьте точку останова в серверной процедуре, которая читает параметр.
- В окне вычисления выражения (Shift+F9) введите
ПараметрыСеанса.ИмяПараметра.
Если отладку на сервере включить нельзя, временно выведите значение в журнал регистрации через ЗаписьЖурналаРегистрации и посмотрите запись в Администрирование → Обслуживание → Журнал регистрации (в типовых на БСП) или в конфигураторе через Администрирование → Журнал регистрации.
Практические сценарии настройки
Сценарий 1. Ограничить пользователю список организаций
- Параметр
ДоступныеОрганизации, типФиксированныйМассив. - Заполнение — лениво, запросом по настройкам пользователя (своему регистру сведений или справочнику связей).
- В роли — ограничение на справочник и документы:
Организация В (&ДоступныеОрганизации). - Право
Получение— у роли;Установка— ни у кого, заполняет только модуль сеанса.
Сценарий 2. Признак служебного сеанса обмена
- Параметр
ЭтоСеансОбмена, типБулево. - При старте сеанса —
Ложь. - Перед загрузкой данных код обмена в привилегированном модуле ставит
Истина. - Подписки на события проверяют флаг и не запускают лишние проверки при загрузке.
Сценарий 3. Режим рабочего места по ярлыку
Тот самый /C"РежимСклада=2" из раздела про запуск. Ярлык кладовщика открывает упрощённый набор команд, ярлык менеджера — полный. Права при этом задаются ролями, а параметр меняет только удобство.