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