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

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

Когда инициируются параметры сеанса в 1С

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

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

Инициализация происходит в момент старта сеанса — при входе пользователя в информационную базу, при запуске фонового задания, при подключении через веб-сервис или COM-соединение. Платформа вызывает обработчик УстановкаПараметровСеанса модуля сеанса, передавая в него массив имён требуемых параметров. Разработчик обязан присвоить значения всем запрошенным параметрам либо явно удалить их имя из массива, иначе платформа выдаст ошибку.

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

Что такое параметры сеанса и где они объявляются

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

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

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

Когда именно вызывается обработчик УстановкаПараметровСеанса

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

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

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

bsl
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры) Экспорт
	Если ТребуемыеПараметры = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Если ТребуемыеПараметры.Найти("ТекущийПользователь") <> Неопределено Тогда
		ПараметрыСеанса.ТекущийПользователь = НайтиПользователя();
		ТребуемыеПараметры.Удалить(ТребуемыеПараметры.Найти("ТекущийПользователь"));
	КонецЕсли;
КонецПроцедуры

Сценарии инициализации для разных типов сеансов

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

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

Каждое фоновое задание выполняется в отдельном сеансе, поэтому обработчик вызывается и для него. При этом ИмяПользователя() может вернуть имя служебного пользователя или пользователя, запустившего задание — это зависит от способа запуска. Код, жёстко привязанный к интерактивному пользователю, в фоновом сеансе часто работает неправильно.

Веб-сервисы, HTTP-сервисы и внешние соединения

При обращении к веб-сервису или HTTP-сервису создаётся сеанс с аутентификацией, указанной в публикации или в запросе. Обработчик выполняется для каждого такого сеанса. При COM-соединении и соединении через внешнее соединение инициализация также происходит — в сеансе внешнего соединения.

Регламентные задания и сеанс планировщика

Регламентные задания выполняются в сеансах, создаваемых планировщиком заданий, обычно под служебным пользователем или без пользователя. Если логика обработчика требует обязательного пользователя (например, ищет элемент справочника «Пользователи»), для таких сеансов нужно предусмотреть ветку с безопасным значением по умолчанию.

Интерактивный входПосле аутентификации, до открытия интерфейса

Ошибка обработчика блокирует вход пользователя

Фоновое заданиеПри старте каждого задания

Проверяйте, кто является пользователем сеанса

Веб- и HTTP-сервисыПри каждом вызове или по пулу сеансов

Учитывайте пользователя публикации

Внешнее соединениеПри установке COM/V83.COMConnector соединения

Обработчик работает в сеансе соединения

Порядок установки значений и требования платформы

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

Тяжёлые операции — сложные запросы, чтение больших данных, обращения к внешним ресурсам — в обработчике нежелательны. Обработчик выполняется при каждом создании сеанса, а в системах с веб-сервисами сеансов может быть много. Если значение вычисляется дорого, но нужно не всем сеансам, лучше устанавливать его лениво — при первом реальном обращении из прикладного кода.

Ещё одно требование: обработчик выполняется в привилегированном контексте по отношению к установке параметров, но код внутри него работает с правами текущего пользователя сеанса, если не включён привилегированный режим. Если пользователю не хватает прав на чтение справочника, из которого берётся значение, установка завершится ошибкой — для таких случаев используют УстановитьПривилегированныйРежим(Истина) с последующим отключением.

Порядок написания обработчика
  1. 1
    Откройте модуль сеанса и создайте экспортную процедуру УстановкаПараметровСеанса с параметром ТребуемыеПараметры
  2. 2
    Добавьте проверку: если ТребуемыеПараметры = Неопределено — выйти из процедуры
  3. 3
    Для каждого параметра проверьте наличие его имени в массиве через Найти()
  4. 4
    Установите значение через ПараметрыСеанса.ИмяПараметра и удалите имя из массива методом Удалить()
  5. 5
    Предусмотрите ветку для фоновых и служебных сеансов со значением по умолчанию
  6. 6
    Протестируйте вход интерактивным пользователем и запуск фонового задания

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

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

Вторая частая проблема — обращение к параметру сеанса из кода, который сам вызывается при установке параметров. Например, функция поиска пользователя внутри себя читает ПараметрыСеанса.ТекущийПользователь. Возникает рекурсивная инициализация и ошибка. Лечение — не читать параметры сеанса в коде, участвующем в их установке.

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

Типичные ошибки
01
Не удалено имя из ТребуемыеПараметры — сеанс не создаётся, вход невозможен
02
Обращение к параметру сеанса внутри кода его установки — циклическая инициализация и ошибка сеанса
03
Тяжёлые запросы в обработчике — замедление каждого входа и каждого фонового задания
04
Отсутствие ветки для сеансов без пользователя — падение регламентных заданий и веб-сервисов
05
Чтение данных без привилегированного режима — ошибка прав доступа у рядовых пользователей

Как проверить и отладить инициализацию

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

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

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

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

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

Вход пользователя
Норма

Пользователь входит, параметры доступны в коде

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

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

Фоновое задание
Норма

Задание выполняется, журнал без ошибок сеанса

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

Задание падает сразу после запуска

Журнал регистрации
Норма

Нет записей об ошибках установки параметров

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

Повторяющиеся ошибки инициализации

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

Соответствует текущему пользователю/контексту

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

Пустая ссылка или данные другого пользователя

Ограничения и альтернативные подходы

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

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

В типовых конфигурациях значительная часть параметров устанавливается в подсистеме «Базовая функциональность» через переопределяемые обработчики. При доработке типовой конфигурации не редактируйте модуль сеанса напрямую — используйте предусмотренные программные интерфейсы, иначе изменения будут потеряны при обновлении.

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

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

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

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

Вызывается ли обработчик при каждом обращении к параметру сеанса?

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

Почему пользователь не может войти в базу сразу после обновления конфигурации?

Наиболее вероятная причина — ошибка в обработчике УстановкаПараметровСеанса: неустановленный параметр, исключение при поиске данных или нехватка прав. Текст ошибки смотрите в журнале регистрации, а для восстановления входа верните прежнюю версию модуля сеанса.

Как установить параметр сеанса для фонового задания, где нет интерактивного пользователя?

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

Можно ли изменить параметр сеанса в середине работы?

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

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

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

Нужен ли привилегированный режим в обработчике установки параметров?

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