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