К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как инициализировать параметр сеанса в 1С

Разбираем, как создать и инициализировать параметр сеанса 1С: модуль сеанса, обработчик УстановкаПараметровСеанса, примеры кода, типовые ошибки и проверка результата.

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

Инициализация выполняется в специальном обработчике УстановкаПараметровСеанса модуля сеанса. Платформа вызывает этот обработчик автоматически при первом обращении к любому параметру сеанса (или при старте сеанса, если параметры используются в ролях с RLS). Задача разработчика — корректно заполнить требуемые параметры и обязательно пометить их как установленные, чтобы избежать зацикливания.

Ниже разобран полный цикл: от создания объекта метаданных до проверки результата, включая типовые ошибки, которые приводят к бесконечной рекурсии обработчика и ошибкам «Параметр сеанса не установлен».

Шаг 1. Создайте параметр сеанса в конфигураторе

Откройте конфигурацию в режиме «Конфигуратор» и в дереве метаданных перейдите в ветку Общие → Параметры сеанса. Добавьте новый объект и задайте имя, например ТекущийПользователь или РаботатьВРежимеОтладки.

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

Если параметр будет использоваться в ограничении доступа к данным (RLS), он должен иметь тип, соответствующий полю, по которому строится ограничение. Например, для отбора документов по организации параметр должен иметь тип СправочникСсылка.Организации.

Шаг 2. Напишите обработчик УстановкаПараметровСеанса

Обработчик располагается в модуле сеанса (корень дерева конфигурации → контекстное меню → «Открыть модуль сеанса»). Если модуля ещё нет, платформа создаст его автоматически при добавлении обработчика через палитру событий.

Минимальный рабочий пример инициализации одного параметра:

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

Если ТребуемыеПараметры = Неопределено

Или ТребуемыеПараметры.Найти("ТекущийПользователь") <> Неопределено Тогда

ПараметрыСеанса.ТекущийПользователь =

Справочники.Пользователи.НайтиПоНаименованию(ИмяПользователя());

ПараметрыСеанса.УстановленныеПараметры.Добавить("ТекущийПользователь");

КонецЕсли;

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

Ключевой момент — строка ПараметрыСеанса.УстановленныеПараметры.Добавить(...). Именно она сообщает платформе, что параметр инициализирован. Если её опустить, при следующем обращении к параметру обработчик будет вызван снова, что приведёт к рекурсии и ошибке «Обнаружено зацикливание при установке параметров сеанса».

Шаг 3. Разберитесь с параметром ТребуемыеПараметры

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

Рекомендуемый шаблон — проверять каждый параметр отдельно:

Если ТребуемыеПараметры = Неопределено Тогда

// Инициализируем все параметры сразу

ИначеЕсли ТребуемыеПараметры.Найти("ТекущееПодразделение") <> Неопределено Тогда

// Инициализируем только запрошенный

КонецЕсли;

В типовых конфигурациях (БСП) логика вынесена в переопределяемые процедуры, где инициализация регистрируется через подписки на события. Если вы внедряете свой параметр в типовую конфигурацию, изучите существующую структуру обработчика и добавляйте код по принятому в ней шаблону, а не заменяйте обработчик целиком.

Порядок действий
  1. 1
    Создайте параметр в ветке «Общие → Параметры сеанса» и задайте тип
  2. 2
    Откройте модуль сеанса и добавьте обработчик УстановкаПараметровСеанса
  3. 3
    Присвойте значение через ПараметрыСеанса.ИмяПараметра
  4. 4
    Добавьте имя в ПараметрыСеанса.УстановленныеПараметры
  5. 5
    Обновите конфигурацию базы данных и перезапустите сеанс
  6. 6
    Проверьте значение через отладчик или сообщение

Шаг 4. Инициализируйте параметры для RLS и фоновых заданий

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

Если параметр используется в шаблоне ограничения доступа роли (например, #ПараметрСеанса("ТекущийПользователь")), платформа запросит его при первом же обращении к защищённой таблице. Ошибка инициализации в этом случае проявится как ошибка при входе пользователя в систему, поэтому код инициализации должен корректно отрабатывать для всех учётных записей, включая служебных пользователей и пользователя с пустым именем.

Фоновые задания и внешние соединения

Фоновое задание наследует параметры сеанса родительского сеанса в момент запуска — отдельно инициализировать их внутри фонового задания не нужно. А вот при подключении через COM-соединение или веб-сервис создаётся самостоятельный сеанс, и обработчик УстановкаПараметровСеанса отработает в нём заново. Убедитесь, что логика инициализации не зависит от интерактивного контекста (например, от настроек клиентского приложения).

Частая причина «падения» веб-сервиса — обработчик инициализации, который ищет пользователя по имени интерактивного сеанса. Для сервисных подключений предусмотрите ветку с безопасным значением по умолчанию, например Неопределено или пустой ссылкой.
ПЗ
Практическое замечание

Шаг 5. Проверьте результат и обработайте ошибки

Самый быстрый способ проверки — отладчик. Поставьте точку останова в обработчике УстановкаПараметровСеанса, запустите сеанс под отладкой и убедитесь, что обработчик вызывается ровно один раз для каждого параметра и значение присваивается корректно.

Второй способ — временный код в любом доступном месте, например при открытии начальной страницы:

Сообщить("Параметр сеанса: " + ПараметрыСеанса.ТекущийПользователь);

Признаки корректной работы: сеанс стартует без ошибок, обращение к параметру возвращает ожидаемое значение, повторные обращения не вызывают обработчик снова. Если видите ошибку «Параметр сеанса не установлен» — значение не было присвоено; если «зацикливание при установке параметров сеанса» — не заполнен список УстановленныеПараметры или в коде инициализации есть обращение к другому неустановленному параметру.

Контрольные точки

Как проверить результат

Запуск сеанса
Норма

Вход выполняется без ошибок

Тревожный признак

Ошибка установки параметров при входе

Вызов обработчика
Норма

Один вызов на параметр

Тревожный признак

Повторные вызовы, зацикливание

Значение параметра
Норма

Ожидаемая ссылка или значение

Тревожный признак

Неопределено там, где нужна ссылка

Типичные ошибки и как их избежать

Первая и самая частая ошибка — пропущенный вызов УстановленныеПараметры.Добавить(). Внешне всё выглядит рабочим, но при первом обращении к параметру сеанс аварийно завершается с ошибкой зацикливания.

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

Третья группа проблем — изменение параметра «на лету» с расчётом, что он применится для RLS. Ограничения доступа могут кэшироваться в рамках сеанса; надёжнее устанавливать значение до начала работы с данными, а при смене контекста (например, смене организации) учитывать, что часть механизмов потребует переоткрытия форм или перезапуска сеанса.

Типичные ошибки
01
Нет УстановленныеПараметры.Добавить() — рекурсия и ошибка зацикливания
02
Игнорирование ТребуемыеПараметры — лишние запросы при каждом старте сеанса
03
Обращение к неустановленному параметру внутри обработчика — рекурсивный вызов
04
Инициализация через интерактивный контекст — сбой веб-сервисов и COM-подключений
05
Слишком широкий составной тип — лишние расходы на сериализацию значения

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

Можно ли изменить параметр сеанса после инициализации?

Да, значение можно перезаписать в любой момент обычным присваиванием: ПараметрыСеанса.ИмяПараметра = НовоеЗначение. Повторно добавлять имя в УстановленныеПараметры не требуется. Учитывайте, что уже открытые формы и кэшированные ограничения доступа могут не подхватить новое значение автоматически.

Чем параметр сеанса отличается от константы?

Константа хранится в базе данных и общая для всех пользователей, а параметр сеанса существует только в памяти конкретного сеанса и у каждого пользователя свой. Для настройки «для всех и навсегда» используйте константу, для контекста конкретного входа — параметр сеанса.

Почему возникает ошибка «Параметр сеанса не установлен»?

Код обратился к параметру, которому ни разу не присвоили значение. Проверьте, что обработчик УстановкаПараметровСеанса существует, что ветка для нужного параметра реально выполняется (часто мешает неверная проверка ТребуемыеПараметры) и что присваивание не обёрнуто в условие, которое не срабатывает.

Наследуются ли параметры сеанса в фоновых заданиях?

Да, фоновое задание получает копию параметров сеанса родителя на момент запуска. Изменения, сделанные в родительском сеансе после запуска задания, в нём не отразятся, и наоборот.

Можно ли хранить в параметре сеанса таблицу значений?

Технически тип можно указать, но это не рекомендуется: значение сериализуется и хранится для каждого сеанса, что при больших объёмах даёт заметный расход памяти на сервере. Для объёмных данных лучше подходят хранилище значения в базе, временное хранилище или повторное вычисление по ключу.

Нужно ли инициализировать параметр, если он используется только в RLS?

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

Итог

Что важно запомнить

Параметр сеанса создаётся в метаданных, а значение ему присваивается в обработчике УстановкаПараметровСеанса модуля сеанса. Всегда добавляйте имя параметра в УстановленныеПараметры, учитывайте ТребуемыеПараметры и проверяйте, что инициализация безопасна для фоновых заданий и сервисных подключений.