Параметры сеанса в 1С 8.3: модуль сеанса, ленивая инициализация и передача значений при запуске

· 9 мин

Содержание

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

Частое заблуждение — путать параметры сеанса с параметрами запуска. Ключ /C в командной строке, строка соединения и персональные настройки — это разные вещи. Но значение из командной строки можно передать в параметр сеанса, и ниже показано, как сделать это правильно.

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

Параметр сеанса — объект метаданных из ветки Общие → Параметры сеанса. У него есть имя и тип. Значение существует только в рамках одного сеанса: пользователь вышел — значение исчезло, новый вход — всё заполняется заново.

Зачем они нужны:

  • 🔐 ограничения доступа на уровне записей (RLS) — в тексте ограничения параметр пишут через амперсанд, например &ТекущийПользователь;
  • ⚡ быстрый доступ к часто нужным данным — текущий пользователь, его организация, режим работы, без запроса к базе на каждое обращение;
  • 🧭 флаги режима работы — например, признак того, что сеанс запущен для обмена или под служебным пользователем.

Что важно знать про устройство:

СвойствоКак работает
Где доступныТолько на сервере: серверные процедуры, внешнее соединение, фоновые задания. Из клиентского кода напрямую не видны
Срок жизниОдин сеанс. В базе значения не сохраняются
ТипыПримитивные, ссылочные, фиксированные коллекции (ФиксированныйМассив, ФиксированнаяСтруктура, ФиксированноеСоответствие). Обычный Массив или Структура выбрать нельзя
ПраваВ роли для каждого параметра есть права Получение и Установка
Модуль сеансаВыполняется в привилегированном режиме, поэтому права ролей на установку внутри него не проверяются

Параметры сеанса и файлы настроек запуска: в чём разница

На форумах часто советуют «поправить параметры в ini-файле». Это про другое: файлы настроек управляют запуском платформы, а не значениями внутри сеанса.

ЧтоГде лежитЗа что отвечает
1CEStart.cfg%APPDATA%\1C\1CEStart\Настройки окна запуска и пути к спискам баз
ibases.v8i%APPDATA%\1C\1CEStart\Список баз: строки соединения, версия платформы, дополнительные параметры запуска
conf.cfgпапка bin\conf установленной платформыОбщие настройки платформы на компьютере
Параметр сеансапамять сервера, в рамках сеансаЗначение, которое вычисляет код конфигурации

Связь между ними одна: дополнительные параметры запуска из ibases.v8i (тот же ключ /C) можно прочитать кодом и превратить в значение параметра сеанса. Записать значение параметра сеанса в какой-либо файл и «подложить» его при входе нельзя.

Модуль сеанса: главное место заполнения

Порядок действий в конфигураторе:

  1. В дереве метаданных откройте Общие → Параметры сеанса и добавьте параметр. Задайте имя (например, ОсновнаяОрганизация) и тип (СправочникСсылка.Организации).
  2. Откройте роли, которым параметр нужен, и отметьте право Получение. Право Установка давайте только если параметр меняют вне модуля сеанса.
  3. Щёлкните правой кнопкой по корню конфигурации и выберите Открыть модуль сеанса.
  4. В модуле создайте процедуру УстановкаПараметровСеанса(ИменаПараметров) — платформа вызывает её сама.
  5. Выполните Обновить конфигурацию базы данных (F7) и проверьте значения в отладке.

Как платформа вызывает обработчик

Обработчик срабатывает в двух ситуациях:

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

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

Пример модуля сеанса

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

    Если ИменаПараметров = Неопределено Тогда
        // Старт сеанса: заполняем только дешёвые параметры
        ПараметрыСеанса.ИмяПользователяИБ = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
        Возврат;
    КонецЕсли;

    // Ленивая инициализация: заполняем то, что запросили
    Для Каждого ИмяПараметра Из ИменаПараметров Цикл
        Если ИмяПараметра = "ДоступныеОрганизации" Тогда
            ПараметрыСеанса.ДоступныеОрганизации = ПолучитьДоступныеОрганизации();
        ИначеЕсли ИмяПараметра = "РежимСклада" Тогда
            ПараметрыСеанса.РежимСклада = 0; // значение по умолчанию
        КонецЕсли;
    КонецЦикла;

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

Функция ПолучитьДоступныеОрганизации()

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

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

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

Тип ДоступныеОрганизации здесь — ФиксированныйМассив. Если присвоить обычный Массив, платформа выдаст ошибку несоответствия типа.

Типовые конфигурации на БСП: куда добавлять свой параметр

В БП 3.0, ЗУП 3.1, УТ 11 и других конфигурациях на Библиотеке стандартных подсистем модуль сеанса почти пустой. Он передаёт управление в БСП, а та раскладывает работу по обработчикам подсистем.

Для своего параметра правильный путь такой:

  1. Создайте параметр сеанса в расширении конфигурации, а не в основной конфигурации. Так типовое обновление не затрёт доработку.
  2. Обработчик регистрируют в процедуре ПриДобавленииОбработчиковУстановкиПараметровСеанса общего модуля ОбщегоНазначенияПереопределяемый. В расширении это делается через аннотацию &После к этой процедуре.
  3. В соответствие Обработчики добавьте пару: имя параметра → полное имя процедуры, которая его заполнит, например "МоиПараметры.УстановитьРежимСклада".
  4. Процедура-обработчик принимает имя параметра и массив уже установленных параметров. Точную сигнатуру сверьте с комментарием к переопределяемой процедуре в вашей версии БСП.

Не правьте модуль сеанса типовой конфигурации напрямую: снимается поддержка с объекта, а каждое обновление превращается в ручное сравнение-объединение.

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

Передача значения при запуске: ключ /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. Он нужен для отладки и работает только у пользователя с правом администрирования. В таком сеансе права ролей не проверяются, поэтому ошибки «не хватает права Получение» в нём не воспроизведутся. Тестируйте права под обычным пользователем.

Почему параметр не заполняется: ошибки и проверка

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

Как посмотреть фактическое значение:

  1. Запустите базу в режиме отладки из конфигуратора (F5).
  2. Поставьте точку останова в серверной процедуре, которая читает параметр.
  3. В окне вычисления выражения (Shift+F9) введите ПараметрыСеанса.ИмяПараметра.

Если отладку на сервере включить нельзя, временно выведите значение в журнал регистрации через ЗаписьЖурналаРегистрации и посмотрите запись в Администрирование → Обслуживание → Журнал регистрации (в типовых на БСП) или в конфигураторе через Администрирование → Журнал регистрации.

Практические сценарии настройки

Сценарий 1. Ограничить пользователю список организаций

  1. Параметр ДоступныеОрганизации, тип ФиксированныйМассив.
  2. Заполнение — лениво, запросом по настройкам пользователя (своему регистру сведений или справочнику связей).
  3. В роли — ограничение на справочник и документы: Организация В (&ДоступныеОрганизации).
  4. Право Получение — у роли; Установка — ни у кого, заполняет только модуль сеанса.

Сценарий 2. Признак служебного сеанса обмена

  1. Параметр ЭтоСеансОбмена, тип Булево.
  2. При старте сеанса — Ложь.
  3. Перед загрузкой данных код обмена в привилегированном модуле ставит Истина.
  4. Подписки на события проверяют флаг и не запускают лишние проверки при загрузке.

Сценарий 3. Режим рабочего места по ярлыку

Тот самый /C"РежимСклада=2" из раздела про запуск. Ярлык кладовщика открывает упрощённый набор команд, ярлык менеджера — полный. Права при этом задаются ролями, а параметр меняет только удобство.

Перед публикацией нового параметра сеанса
Выполнено: 0 / 6

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

Можно ли прочитать параметр сеанса на клиенте?
Напрямую нет. Нужна серверная функция с флажком «Вызов сервера», которая вернёт значение. Если значение нужно часто, закешируйте его в клиентском общем модуле с повторным использованием возвращаемых значений.
Сохраняется ли значение параметра сеанса между входами?
Нет. При каждом новом сеансе значение заполняется заново. Чтобы хранить выбор пользователя, используйте хранилище настроек или регистр сведений, а в модуле сеанса читайте оттуда.
Чем параметр сеанса отличается от константы?
Константа одна на всю базу и хранится в ней. Параметр сеанса у каждого сеанса свой и живёт в памяти. Константу удобно хранить как настройку, параметр сеанса — как значение «для этого пользователя прямо сейчас».
Где задать параметр сеанса пользователю без конфигуратора?
Нигде: значение вычисляет код. Пользователь или администратор меняет только исходные данные — настройки пользователя, состав групп доступа, ключ /C в ярлыке. Параметр подхватит их при следующем входе.
Можно ли менять значение параметра посреди сеанса?
Да, из кода с правом «Установка» или из привилегированного модуля. Учтите, что ограничения доступа сразу начнут работать с новым значением.