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