При открытии форм (например, формы рабочего стола или начальной страницы) разработчики и пользователи платформы 1С:Предприятие 8.3 могут столкнуться с исключением вида: «Ошибка при получении значения атрибута контекста: Попытка получения неинициализированного значения параметра сеанса». Разберем по шагам, почему возникает эта ошибка и какими способами ее можно устранить.
Параметры сеанса в платформе 1С представляют собой глобальные переменные, сохраняющие свои значения в рамках сеанса конкретного пользователя. В отличие от обычных переменных, к параметру сеанса нельзя обратиться до тех пор, пока ему явно не присвоено значение нужного типа. Попытка прочитать неинициализированный параметр сеанса не возвращает Неопределено или Null, а сразу вызывает аварийное завершение с генерацией исключения.
Проанализируем типичные ситуации, приводящие к данной ошибке:
ТекущаяСтруктурнаяЕдиница) должен заполняться из настроек по умолчанию текущего пользователя (основной склад, подразделение или организация), а эти настройки в справочнике или регистре не заданы, алгоритм может пропустить установку значения.УстановкаПараметровСеанса не присваивает ему значение, возникает ошибка.Модуль сеанса.Если конфигурация типовая или доработанная, в первую очередь проверим настройки текущей учетной записи в режиме «1С:Предприятие»:
Рассмотрим правильный подход к инициализации параметров сеанса в конфигураторе. Откроем Модуль сеанса и перейдем к предопределенной процедуре УстановкаПараметровСеанса. Параметру обязательно должно быть присвоено значение — даже если настройка у пользователя не задана, следует установить хотя бы пустую ссылку соответствующего типа.
Посмотрим на пример реализации инициализации:
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
// Проверяем необходимость инициализации конкретного параметра
Если ТребуемыеПараметры = Неопределено
Или ТребуемыеПараметры.Найти("ТекущаяСтруктурнаяЕдиница") <> Неопределено Тогда
УстановитьПривилегированныйРежим(Истина);
ЗначениеПараметра = ПолучитьОсновнуюСтруктурнуюЕдиницуПользователя(ПараметрыСеанса.ТекущийПользователь);
Если ЗначениеПараметра = Неопределено Тогда
ПараметрыСеанса.ТекущаяСтруктурнаяЕдиница = Справочники.СтруктурныеЕдиницы.ПустаяСсылка();
Иначе
ПараметрыСеанса.ТекущаяСтруктурнаяЕдиница = ЗначениеПараметра;
КонецЕсли;
УстановитьПривилегированныйРежим(Ложь);
КонецЕсли;
КонецПроцедуры
Обратим внимание на вызов метода УстановитьПривилегированныйРежим(Истина). Это гарантирует, что чтение настроек пользователя выполнится без ошибок, даже если для его роли настроены строгие ограничения доступа на уровне записей (RLS).
Если инициализация параметра распределена по общим модулям, найдем проблемный участок с помощью отладчика платформы:
ПриНачалеРаботыСистемы модуля управляемого приложения или в обработчике УстановкаПараметровСеанса модуля сеанса.ПараметрыСеанса.ТекущаяСтруктурнаяЕдиница.В платформе 1С нельзя проверить состояние параметра сеанса функцией ЗначениеЗаполнено(ПараметрыСеанса.ИмяПараметра) без риска получить ошибку, если он еще не инициализирован. Если в коде формы рабочего стола или обработки требуется прочитать параметр с гарантией защиты от сбоя, применим конструкцию Попытка ... Исключение:
Попытка
Объект.СтруктурнаяЕдиница = ПараметрыСеанса.ТекущаяСтруктурнаяЕдиница;
Исключение
Объект.СтруктурнаяЕдиница = Справочники.СтруктурныеЕдиницы.ПустаяСсылка();
КонецПопытки;
Таким образом, явная установка значения в Модуле сеанса с использованием привилегированного режима и корректное заполнение персональных настроек пользователя полностью исключают возникновение данной ошибки.