Как правильно использовать параметры сеанса в 1С и передавать их в фоновые задания?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Многие разработчики, особенно начинающие работать с платформой 1С:Предприятие 8.3, воспринимают параметры сеанса как обычные глобальные переменные. Однако это не совсем так. Параметры сеанса — это специализированные объекты метаданных, имеющие свой жизненный цикл, жесткие правила инициализации и особенности поведения в клиент-серверной архитектуре. Рассмотрим подробнее, как работает этот механизм, почему возникают ошибки при чтении и как подружить параметры сеанса с фоновыми заданиями.

Концепция параметров сеанса: почему это не просто переменная

В отличие от глобальных переменных, которые существовали в старых версиях платформы или в обычных формах, параметры сеанса живут на стороне сервера приложений. Они предназначены для хранения информации, которая должна быть доступна в течение всего времени работы пользователя с базой данных, но при этом изолирована от других пользователей.

Основные правила работы:

  1. Типизация: Тип параметра сеанса жестко задается в конфигураторе.
  2. Защита от чтения: Вы не можете прочитать значение параметра, пока он не был явно инициализирован. Попытка обращения к пустому параметру вызовет исключение.
  3. Область видимости: Параметр доступен из любого серверного контекста (общие модули, модули объектов), а также может быть получен на клиенте (хотя это требует неявного серверного вызова).

Механизм инициализации: Модуль сеанса

Для управления состоянием параметров существует специальный Модуль сеанса. В нем предопределена процедура УстановкаПараметровСеанса. Проанализируем, как она работает.

Платформа реализует так называемую "ленивую инициализацию". Это означает, что параметры не обязательно заполнять все сразу при старте системы. Рассмотрим код в модуле сеанса:


Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
    
    // Если ТребуемыеПараметры = Неопределено, значит идет старт системы
    Если ТребуемыеПараметры = Неопределено Тогда
        // Здесь инициализируем только критически важные параметры
        ПараметрыСеанса.ТекущийПользователь = НайтиТекущегоПользователя();
    Иначе
        // Платформа запрашивает конкретные параметры при первом обращении к ним
        Для Каждого ИмяПараметра Из ТребуемыеПараметры Цикл
            Если ИмяПараметра = "КлючШифрования" Тогда
                ПараметрыСеанса.КлючШифрования = ""; // Инициализируем значением по умолчанию
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
    
КонецПроцедуры

Важно понимать: если в коде программы вы обращаетесь к ПараметрыСеанса.МойПараметр, и он еще не заполнен, платформа автоматически вызовет УстановкаПараметровСеанса, передав в массив ТребуемыеПараметры имя вашего параметра. Если после выполнения процедуры параметр так и останется неинициализированным, система выдаст ошибку.

Параметры сеанса и фоновые задания

Разберем ситуацию, которая часто ставит разработчиков в тупик: почему в форме параметр сеанса заполнен, а в отчете (который формируется в фоне) он оказывается пустым или вызывает ошибку? Выясним причину.

Когда 1С запускает фоновое задание, создается новый сеанс. Этот сеанс изолирован от вашего основного пользовательского сеанса. У него свой Модуль сеанса и своя процедура УстановкаПараметровСеанса. Значения параметров из "родительского" сеанса в фоновый не копируются автоматически (за исключением параметров разделения данных).

Следовательно, когда фоновый отчет пытается прочитать ПараметрыСеанса.КлючШифрования, для него запускается процедура установки параметров сеанса "с нуля". Если ваш ключ был введен пользователем вручную и хранился только в памяти родительского сеанса, фоновое задание о нем ничего не узнает.

Как передать данные в фоновый отчет СКД?

Если вам необходимо использовать в отчете данные, которые не хранятся в базе данных постоянно (например, пароль или временный ключ), у вас есть два основных пути.

Способ 1: Передача через параметры СКД

Проанализируем этот вариант как наиболее надежный. Мы можем передать значение ключа непосредственно в схему компоновки данных перед запуском формирования.

  1. В схеме СКД создаем параметр (например, ВнешнийКлюч).
  2. В коде формы перед вызовом формирования устанавливаем этот параметр.

Способ 2: Программная компоновка и отказ от фонового режима

Если автоматический фоновый режим мешает работе бизнес-логики, мы можем выполнить компоновку программно в том же сеансе. Однако помните, что это заблокирует интерфейс пользователя на время формирования отчета. Рассмотрим пример программного вывода:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь; // Отключаем стандартный механизм
    
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
КонецПроцедуры

Важный нюанс: Чтобы в таком отчете продолжали работать расшифровки (открытие ссылок по двойному клику), необходимо обязательно использовать объект ДанныеРасшифровки и правильно инициализировать ПроцессорКомпоновкиДанных. Обратите внимание на четвертый параметр метода Инициализировать — он отвечает за возможность использования внешних функций, что критично при работе со сложными схемами.

Рекомендации по безопасности и производительности

При работе с параметрами сеанса придерживайтесь следующих советов:

Таким образом, параметры сеанса — это мощный инструмент управления контекстом, если понимать разницу между сеансом пользователя и сеансом фонового задания. Используйте Модуль сеанса для грамотной инициализации и не забывайте про программную передачу параметров в те процессы, которые запускаются платформой асинхронно.

← На главную