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