Практически в любой типовой конфигурации 1С — будь то Бухгалтерия, УТ, КА или ERP — можно встретить объект «Параметры сеанса». Для начинающего разработчика это часто выглядит как ещё один вид глобальных переменных, и на первый взгляд разница не очевидна. На деле параметры сеанса — это отдельный механизм платформы со своими правилами инициализации, кэширования и использования, и если их не понимать, легко получить либо избыточные запросы к базе, либо ошибку «Параметр сеанса не установлен» в самый неподходящий момент. Разберём, что это за объект, как правильно его инициализировать и как использовать на практике — вплоть до конкретного примера, полезного в УТ 11, КА 2 и ERP.
Что такое параметры сеанса и зачем они нужны
Параметры сеанса — это объект конфигурации 1С, который задаётся в конфигураторе в ветке «Общие → Параметры сеанса». В этой ветке для каждого параметра указывается его имя и тип значения — точно так же, как для реквизита справочника или документа. После этого параметр становится доступен в коде через глобальную коллекцию ПараметрыСеанса.
Главная особенность параметров сеанса — то, что их значение вычисляется один раз за сеанс работы пользователя и затем кэшируется. Пока сеанс открыт, повторное обращение к параметру не требует повторного вычисления — платформа просто отдаёт уже сохранённое значение. Это удобно для данных, которые не меняются в течение сеанса, но получение которых требует обращения к базе: например, текущая организация пользователя по умолчанию, его роль, привязанный склад или набор часто используемых констант. Вместо того чтобы на каждое обращение выполнять запрос к базе, программа один раз вычисляет значение и дальше работает с ним из памяти — это заметно снижает нагрузку на сервер в конфигурациях с большим числом пользователей.
Как инициализируются параметры сеанса
Значения параметров сеанса не присваиваются «где попало» в коде — для этого предусмотрено специальное место: модуль сеанса. Это отдельный программный модуль конфигурации, в котором размещается экспортная процедура УстановкаПараметровСеанса(ИменаПараметров, ТребуемыеПараметры).
Платформа вызывает эту процедуру автоматически — но не при каждом старте сеанса «на всякий случай», а в момент, когда код впервые обращается к параметру, значение которого ещё не установлено. В процедуру передаётся параметр ТребуемыеПараметры — массив с именами именно тех параметров, которые сейчас запрошены и нуждаются в вычислении. Здесь кроется важное правило: в процедуре нужно устанавливать значения только запрошенных параметров, проверяя их наличие в этом массиве, а не вычислять и присваивать сразу все параметры сеанса подряд. Если игнорировать этот принцип и на каждый вызов процедуры пересчитывать все параметры целиком, часть из них будет вычисляться впустую — это увеличивает время старта сеанса и создаёт лишнюю нагрузку на сервер.
Пример процедуры в модуле сеанса, которая устанавливает параметр только тогда, когда он реально запрошен:
Процедура УстановкаПараметровСеанса(ИменаПараметров, ТребуемыеПараметры) Экспорт Если ТребуемыеПараметры.Найти("ТекущийПользователь") <> Неопределено Тогда ПараметрыСеанса.ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь(); КонецЕсли; КонецПроцедуры
Чтение и установка параметров сеанса: примеры кода
После того как параметр объявлен в конфигураторе и его установка предусмотрена в модуле сеанса, работать с ним из остального кода конфигурации очень просто — обращение выглядит как обращение к реквизиту обычной структуры.
Установка значения параметра (как правило, выполняется внутри процедуры УстановкаПараметровСеанса, но в некоторых случаях платформа допускает установку и вне её, например в привилегированном режиме):
ПараметрыСеанса.ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
Чтение значения параметра — доступно в любом месте серверного кода после его установки:
ТекущийПользователь = ПараметрыСеанса.ТекущийПользователь;
Обратите внимание: параметры сеанса рассчитаны на серверный код. Попытка обратиться к ним напрямую из клиентского контекста, минуя серверные вызовы, приведёт к ошибке — если значение параметра нужно на клиенте, его получают через серверную процедуру или функцию и передают на клиент как обычное значение.
Пример: отключение контроля остатков через параметр сеанса
Отдельный практический случай, с которым сталкиваются разработчики, дорабатывающие типовые конфигурации на базе Управления торговлей 11, Комплексной автоматизации 2 или ERP, — это временное отключение контроля остатков при технических операциях, например при свёртке информационной базы. Для этого в указанных конфигурациях используется специальный параметр сеанса ПараметрыОбработчикаОбновления, который можно установить программно:
// Включение специального параметра сеанса, чтобы не срабатывал контроль остатков. ПараметрыСеанса.ПараметрыОбработчикаОбновления = Новый ФиксированнаяСтруктура(Новый Структура("РежимВыполнения", "СверткаИБ"));
Здесь важны два технических момента. Во-первых, значение параметра сеанса — фиксированная структура (ФиксированнаяСтруктура), а не обычная изменяемая структура. Это не случайность и не стиль написания: платформа 1С в принципе не позволяет хранить в параметрах сеанса изменяемые коллекции — массивы, структуры или списки значений в их обычном виде. Причина — в самом механизме кэширования параметров: значение параметра должно оставаться неизменным на всё время его хранения в кэше сеанса, а обычная структура могла бы быть изменена где-то в коде уже после установки, что нарушило бы целостность кэша. Поэтому для сложных значений всегда используются фиксированные аналоги — ФиксированныйМассив, ФиксированнаяСтруктура, ФиксированноеСоответствие.
Во-вторых, важно не забывать возвращать параметр сеанса в исходное состояние после завершения технической операции, для которой контроль остатков отключался — иначе повышенный риск того, что контроль остатков останется выключенным и для последующих обычных операций пользователей, что может привести к появлению отрицательных остатков в учёте.
Лайфхаки по работе с параметрами сеанса
- Значение доступно только для чтения снаружи модуля сеанса, если так решил разработчик конфигурации. Хотя платформа технически позволяет устанавливать параметры сеанса из любого серверного кода, хорошей практикой считается инициализировать их только в процедуре
УстановкаПараметровСеанса, а из остального кода — только читать. Это делает поведение параметров предсказуемым и облегчает отладку. - Сброс параметров сеанса требует перезапуска сеанса. Если значение параметра было закэшировано, обычным присвоением нового значения «на лету» его не всегда удастся корректно изменить для всех уже открытых сеансов других пользователей — если нужно гарантированно обновить параметр везде, часто проще завершить сеанс и открыть заново (например, через принудительное завершение сеансов из списка активных пользователей).
- Не храните в параметрах сеанса то, что часто меняется. Если значение должно обновляться в течение одного сеанса (например, состояние текущей формы), параметры сеанса — неподходящее место: они рассчитаны на данные, стабильные весь сеанс. Для изменяемых в течение работы данных используют другие механизмы — реквизиты форм, временное хранилище, регистры сведений.
- Ошибка «Параметр сеанса не установлен» почти всегда означает одно из двух: либо в процедуре
УстановкаПараметровСеансане предусмотрена ветка для этого параметра, либо обращение к параметру происходит до момента, когда он мог быть корректно вычислен (например, слишком рано при старте системы, когда ещё недоступны нужные для вычисления данные). - Параметры сеанса помогают разгрузить типовые конфигурации, но не заменяют кэш многократного использования. Если данные нужно кэшировать не на весь сеанс, а на более короткий срок или с автоматическим обновлением при изменении данных, в 1С для этого есть отдельный механизм — модули с признаком повторного использования возвращаемых значений, и в ряде задач он подходит лучше, чем параметры сеанса.
Заключение
Параметры сеанса — простой, но не всегда очевидный по правилам использования механизм 1С: их удобно применять для стабильных в рамках сеанса данных, но важно правильно инициализировать их в модуле сеанса, устанавливать только запрошенные значения и помнить об ограничении на хранение только фиксированных коллекций. Отдельный практический пример — параметр ПараметрыОбработчикаОбновления в УТ 11, КА 2 и ERP, который позволяет программно отключить контроль остатков на время технических операций, если аккуратно вернуть его в исходное состояние после завершения работы.
Если в вашей конфигурации возникают ошибки, связанные с параметрами сеанса, или нужна помощь в доработке типового кода — команда Sky1c поможет разобраться и подскажет решение под вашу конкретную задачу.
