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

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

Модуль сеанса в 1С: где выполняется код и как это работает

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

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

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

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

Что такое модуль сеанса и зачем он нужен

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

// Процедура - обработчик события УстановкаПараметровСеанса

//

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

// Код инициализации параметров сеанса

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

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

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

Где именно выполняется код: серверный контекст

В клиент-серверном варианте работы модуль сеанса исполняется в рабочем процессе сервера 1С:Предприятия (rphost). Клиентское приложение лишь инициирует создание сеанса, а вся логика инициализации отрабатывает на стороне сервера. Это означает, что обращения к базе данных из модуля сеанса выполняются без сетевых вызовов между клиентом и сервером.

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

Из серверного контекста модуля сеанса разрешено вызывать экспортные процедуры общих модулей с флагом «Сервер», обращаться к менеджерам объектов, выполнять запросы. Нельзя вызывать общие модули, работающие только на клиенте, если у них не установлен флаг «Вызов сервера» и соответствующий контекст.

СобытиеУстановкаПараметровСеанса

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

КонтекстТолько сервер

Недоступны формы, интерфейс, интерактивные диалоги, клиентские общие модули

Файловый режимСервер эмулируется

Даже без физического сервера код работает в серверном контексте

Порядок вызова события и ленивая инициализация

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

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

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

// Требуются все параметры

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

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

КонецЕсли;

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

Типовые задачи, решаемые в модуле сеанса

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

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

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

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

Как отладить модуль сеанса

Отладка модуля сеанса имеет особенность: код выполняется на сервере, поэтому в конфигураторе нужно включить отладку на сервере и подключиться к серверному процессу. В клиент-серверном режиме сервер должен быть запущен с ключом отладки (-debug), иначе точки останова в серверном коде не сработают.

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

Альтернативный способ диагностики — запись в журнал регистрации через ЗаписьЖурналаРегистрации(). Это работает даже без отладчика и позволяет увидеть, какие параметры требовались и какие значения были установлены. Для временной диагностики это удобнее, чем перезапуск сервера с отладкой.

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

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

Вход в базу после изменения модуля
Норма

Сеанс стартует без ошибок, параметры доступны

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

Ошибка о превышении попыток установки параметров — обработчик не устанавливает запрошенный параметр

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

ПараметрыСеанса.ИмяПараметра возвращает ожидаемое значение

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

Возвращается Неопределено или пустое значение — проверьте логику поиска

Скорость входа
Норма

Вход занимает обычное время

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

Заметная пауза при старте — в модуле сеанса тяжёлые запросы или циклы

Типичные ошибки и ограничения

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

Вторая ошибка — тяжёлый код: обход больших таблиц, вызовы веб-сервисов, обмены данными в момент старта сеанса. Это замедляет вход всех пользователей и может вызывать тайм-ауты при массовом подключении. Третья — отсутствие ветки «значение не найдено»: если пользователь удалён из справочника, а код не устанавливает параметр, сеанс упадёт с ошибкой, и никто не сможет войти.

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

Типичные ошибки
01
Вызов Предупреждение() или ОткрытьФорму() — модуль работает на сервере, интерактивные вызовы недоступны и вызовут ошибку
02
Не установлен параметр при отсутствии данных — платформа циклически вызывает обработчик, сеанс аварийно завершается
03
Тяжёлые запросы и циклы при старте — вход в базу тормозит у всех пользователей
04
Ожидание, что изменения подействуют сразу — старые сеансы работают со старыми параметрами до перезахода

Когда модуль сеанса не подходит

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

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

Куда поместить код инициализации

Модуль сеанса

Параметры сеанса, текущий пользователь, RLS, разделители. Только серверный код, без интерфейса

Модуль управляемого приложения

Интерфейсная логика при старте: напоминания, открытие форм, проверки с диалогами. Клиентский контекст

Общий серверный модуль

Переиспользуемая бизнес-логика, вызываемая по требованию, а не при старте сеанса

Итог

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

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

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

Почему в файловом режиме модуль сеанса тоже «серверный»?

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

Сколько раз вызывается УстановкаПараметровСеанса?

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

Как сообщить пользователю об ошибке из модуля сеанса?

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

Применятся ли изменения модуля сеанса для уже работающих пользователей?

Нет. Параметры устанавливаются при старте сеанса и хранятся до его завершения. Чтобы изменения вступили в силу, пользователь должен завершить сеанс и войти заново.

Можно ли вызывать из модуля сеанса общие модули?

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

Как ускорить вход, если модуль сеанса тормозит?

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