Как устроены параметры сеанса в 1С и где их задавать в коде

· 9 мин

Содержание

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

Значение задаётся в модуле сеанса, живёт в памяти, пока сеанс открыт, и исчезает при выходе. В базе данных оно не сохраняется. Механизм общий для платформы 8.3 и не зависит от конфигурации; отличаются только готовые параметры, которые заложены в типовых решениях.

Что такое сеанс и параметр сеанса в архитектуре 1С

Сеанс — это один активный пользователь информационной базы. Каждое подключение получает свой номер: тонкий клиент, Конфигуратор, фоновое задание, COM-соединение, обращение к HTTP-сервису.

Параметр сеанса — это «переменная уровня сеанса», объявленная в метаданных. У неё есть:

  • 📌 имя — по нему к ней обращаются в коде: ПараметрыСеанса.ТекущийСотрудник;
  • 🧩 тип — ссылка, примитив или фиксированная коллекция;
  • 🔐 права в ролях — «Получение» и «Установка».

Главное отличие от глобальной переменной в модуле приложения: параметр сеанса доступен на сервере, его значение одно на весь сеанс, а читать и менять его можно только при наличии прав.

Какие типы допустимы

Тип значенияПример использования
Ссылка (СправочникСсылка.*)текущий пользователь, организация по умолчанию
Строка, Число, Дата, Булевокод региона, флаг режима обмена
ФиксированныйМассивсписок разрешённых складов для RLS
ФиксированнаяСтруктуранабор настроек сеанса
ХранилищеЗначениясложные данные, которые не нужно разбирать в запросах

Обычный Массив или Структуру присвоить нельзя: платформа выдаст ошибку о недопустимом типе. Перед присвоением коллекцию оборачивают: Новый ФиксированныйМассив(Склады).

Объект справочника (СправочникОбъект) в параметр сеанса не кладут. Храните ссылку, а реквизиты читайте запросом, когда они понадобятся.

Системные сведения о сеансе: номер, приложение, пользователь

Часто под «параметрами сеанса» имеют в виду не объекты метаданных, а системные характеристики текущего подключения. Их задаёт платформа, разработчик только читает.

Основные функции глобального контекста:

  • 🔢 НомерСеансаИнформационнойБазы() — номер текущего сеанса;
  • 📋 ПолучитьТекущийСеансИнформационнойБазы() — объект СеансИнформационнойБазы с подробностями;
  • 👥 ПолучитьСеансыИнформационнойБазы() — массив всех активных сеансов базы.

У объекта СеансИнформационнойБазы полезны свойства:

СвойствоЧто содержит
НомерСеансаномер сеанса в базе
ИмяПриложениятип клиента: 1CV8C (тонкий), 1CV8 (толстый), WebClient, Designer, BackgroundJob, COMConnection
Пользовательпользователь информационной базы
ИмяКомпьютеракомпьютер, с которого подключились
НачалоСеансадата и время входа

Читаемое название приложения даёт функция ПредставлениеПриложения(ИмяПриложения) — например, «Тонкий клиент».

&НаСервере
Процедура ПоказатьДанныеСеансаНаСервере()
    Сеанс = ПолучитьТекущийСеансИнформационнойБазы();
    Сообщить(СтрШаблон("Сеанс № %1, приложение: %2, компьютер: %3, вход: %4",
        Формат(Сеанс.НомерСеанса, "ЧГ=0"),
        ПредставлениеПриложения(Сеанс.ИмяПриложения),
        Сеанс.ИмяКомпьютера,
        Формат(Сеанс.НачалоСеанса, "ДЛФ=DT")));
КонецПроцедуры

Это удобно, когда код должен вести себя по-разному в фоновом задании и в интерактивном сеансе: проверка ИмяПриложения = "BackgroundJob" отключает вывод диалогов.

Как задать и прочитать параметры сеанса в коде

Шаг 1. Создать параметр в Конфигураторе

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

Шаг 2. Заполнить значение в модуле сеанса

Модуль сеанса открывается через контекстное меню корня конфигурации: Открыть модуль сеанса. В нём один обработчик — УстановкаПараметровСеанса(ТребуемыеПараметры).

Платформа вызывает его дважды по смыслу:

  • ⏱ при старте сеанса — с ТребуемыеПараметры = Неопределено;
  • 🔁 при первом обращении к параметру, которому ещё не присвоено значение, — с массивом имён таких параметров.

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

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

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

    Для Каждого ИмяПараметра Из ТребуемыеПараметры Цикл
        Если ИмяПараметра = "ТекущийСотрудник" Тогда
            ПараметрыСеанса.ТекущийСотрудник = НайтиСотрудникаПользователя();
        ИначеЕсли ИмяПараметра = "РазрешенныеСклады" Тогда
            ПараметрыСеанса.РазрешенныеСклады = Новый ФиксированныйМассив(СкладыПользователя());
        КонецЕсли;
    КонецЦикла;

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

Функции НайтиСотрудникаПользователя() и СкладыПользователя() — ваши, они возвращают ссылку и массив ссылок соответственно.

Модуль сеанса выполняется в привилегированном режиме на сервере. Код в нём видит все данные независимо от ролей пользователя. Не помещайте туда ничего, что зависит от прав текущего пользователя.

Шаг 3. Читать значение

На сервере достаточно обращения по имени:

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

В тонком и веб-клиенте свойство ПараметрыСеанса недоступно. С формы значение получают серверным вызовом, как в примере выше.

В запросе значение передают явно:

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

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

В типовых конфигурациях на Библиотеке стандартных подсистем (БП 3.0, ЗУП 3.1, УТ 11) модуль сеанса уже заполнен. Свои параметры добавляют не правкой типового обработчика, а через обработчики БСП или расширение — так меньше конфликтов при обновлении. Текущего пользователя в таких базах берут функцией Пользователи.ТекущийПользователь(), а не напрямую из параметра сеанса.

Параметры запуска и командная строка 1cv8

Параметры запуска — третье, что путают с параметрами сеанса. Это ключи, с которыми стартует 1cv8.exe. Они задаются в ярлыке, в свойствах базы в окне запуска («Дополнительные параметры запуска») или в скрипте.

КлючНазначение
ENTERPRISE / DESIGNERрежим: пользовательский или Конфигуратор
/F"путь"файловая база
/S"сервер\база"клиент-серверная база
/N"имя" и /P"пароль"пользователь и пароль
/C"строка"произвольный текст, доступный в коде
/DisableStartupDialogsбез диалогов при запуске
/ClearCacheочистка клиентского кэша

Пример запуска тонкого клиента с передачей строки в код:

"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /S"srv1c\buh" /N"Обмен" /C"РежимОбмена"

Ключ /C — единственный, значение которого конфигурация читает сама. Оно попадает в свойство глобального контекста ПараметрЗапуска:

Процедура ПриНачалеРаботыСистемы()
    Если СтрНайти(ПараметрЗапуска, "РежимОбмена") > 0 Тогда
        // запустить обмен и завершить работу без участия пользователя
    КонецЕсли;
КонецПроцедуры

Типовые конфигурации тоже реагируют на /C. Самый известный пример — /C"ЗапуститьОбновлениеИнформационнойБазы" для фонового обновления после загрузки новой конфигурации.

Пароль в ключе /P виден в ярлыке и в списке процессов. Для регламентных запусков используйте отдельного пользователя с минимальными правами или аутентификацию операционной системы.

Как посмотреть активные сеансы и управлять ими

В пользовательском режиме

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

В Конфигураторе

Администрирование → Активные пользователи. Показывает тот же список, но только для просмотра.

В консоли кластера

Для клиент-серверной базы самый полный инструмент — консоль администрирования серверов 1С: Кластер → Информационные базы → <база> → Сеансы. Здесь видны:

  • 🖥 рабочий процесс и соединение, которое обслуживает сеанс;
  • ⌛ время вызова, объём прочитанных данных, захваченные блокировки;
  • 🔑 полученная лицензия.

Из командной строки то же даёт утилита rac:

rac cluster list
rac session list --cluster=<id_кластера> --infobase=<id_базы>
rac session list --cluster=<id_кластера> --licenses

Остальные подкоманды смотрите в справке rac help session.

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

Файловый и клиент-серверный вариант: в чём разница

Механизм параметров сеанса одинаков в обоих вариантах. Различается, где хранится значение и как видны сеансы.

Файловая базаКлиент-серверная база
Где выполняется серверный кодв процессе клиента (или веб-сервера)в рабочих процессах кластера
Где хранится значение параметрав памяти этого процессав данных сеанса на сервере 1С
Как посмотреть сеансы«Активные пользователи» в базеконсоль кластера, rac, «Активные пользователи»
Принудительное завершениезакрытием клиента на компьютере пользователяиз консоли кластера или формы БСП

В клиент-серверном варианте один сеанс могут по очереди обслуживать разные рабочие процессы. Поэтому значение параметра сеанса не теряется при переключении: платформа держит данные сеанса в службе данных сеансов кластера.

Из этого следует практический вывод. Если в клиент-серверной базе вход стал медленным, а в модуле сеанса тяжёлые запросы при ТребуемыеПараметры = Неопределено, переведите их на ленивую инициализацию — выигрыш заметен на каждом входе.

Параметр сеанса или кэш общего модуля

Для значений «на весь сеанс» есть альтернатива — общий модуль с повторным использованием возвращаемых значений «На время сеанса».

  • ✅ Параметр сеанса — когда значение нужно в RLS или его нельзя менять пользователю.
  • ✅ Кэш общего модуля — для справочной информации, которую не жалко пересчитать: платформа может сбросить такой кэш, а параметр сеанса — нет.

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

Главное применение параметров сеанса — ограничение доступа на уровне записей. В тексте ограничения роли к параметру сеанса обращаются через амперсанд, как к параметру запроса:

ГДЕ Склад В (&РазрешенныеСклады)

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

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

  • 🔒 право «Установка» дают только тем ролям, которым действительно нужно менять значение после старта (обычно — никому, кроме полных прав);
  • 🧱 значения, от которых зависит RLS, задают только в модуле сеанса или в привилегированном общем модуле;
  • 🙈 пароли и ключи интеграций в параметрах сеанса в открытом виде не храните: при отладке значение видно в окне выражений;
  • 🧪 после изменения ролей проверяйте доступ под тестовым пользователем без полных прав — у администратора RLS не работает , и ошибка в ограничении незаметна.

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

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

Большинство проблем видно сразу по тексту исключения. Ниже — что встречается в разработке.

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

Ещё одна ловушка — рекурсия. Если при заполнении параметра А код обращается к параметру Б, который тоже не заполнен, платформа снова вызовет обработчик. Обычно это работает, но при взаимной зависимости А и Б получится бесконечный цикл. Заполняйте зависимые параметры в одной ветке, в нужном порядке.

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

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