Не так давно мне попалась задача по доработке Кабинета сотрудника. Это было мое первое знакомство с Элементом и с Кабинетом сотрудника. Задача стояла разработать функционал интеграции со сторонним сервисом подписания документов, но сейчас не об этом.
В процессе решения задачи мне требовалось хранить для каждого сеанса некоторые параметры, которые актуальны только для текущего сеанса пользователя (маркер доступа, время его жизни и т.п.). В 1С 8 можно было бы использовать параметры сеанса, например, и я стал искать что-то похожее в Элементе.
И вот что я выяснил. Для хранения подобных данных, вместо параметров сеанса, в восьмерке в элементе удобно использовать свойства клиентского приложения (конкретно в случае с кабинетом сотрудника это компонент интерфейса типа СтандартноеКлиентскоеПриложениеСРазделами, найти его можно по пути llc_1c\ess\СтандартноеПриложение\ОсновноеПриложение.yaml).
Оно существует, пока существует сам сеанс пользователя, и соответственно его свойства тоже.
Затем, разбираясь уже с самим Кабинетом сотрудника, я обнаружил, что в нем существует механизм для работы с параметрами сеанса, реализованный с помощью контрактов. В самом приложении создано одно свойство ХранилищеПараметровСеанса с типом Соответствие<Строка, Объект> и с помощью контракта ПараметрыСеансаПоставщик в него в разных подсистемах добавляются различные параметры. И есть ещё один контракт ПараметрыСеансаСервис, который используется для получения значений, его никуда добавлять не нужно, он реализуется только в одной подсистеме (СтандартноеПриложение) и используется для получения значений параметров сеанса.
Вот про этот механизм я и хочу рассказать. Как добавить свои параметры сеанса и как их использовать. Разработка велась на версии Кабинета сотрудника 8.1, версия Элемента 5.3.
При реализации задачи я создал отдельную подсистему, в которой и делал свои доработки. У меня в ней имеется модуль доступный в проекте с окружением КлиентИСервер (назовем его ИнтеграцияКриптоПроDSS), и по примеру других типовых подсистем я создал общий модуль РеализацияКонтрактовСервер с областью видимости ВПодсистеме и окружением Сервер. Этот модуль, судя по названию, используется для реализации контрактов, видимо чтобы отделить эти методы от всех остальных.
Итак, первым делом в своем модуле ИнтеграцияКриптоПроDSS (который не для реализации контрактов) я описываю структуру параметров сеанса, которые мне необходимы. Это не обязательно должна быть структура, как понятно из типа свойства ХранилищеПараметровСеанса (Соответствие<Строка, Объект>) туда можно сунуть почти что угодно, но мне подходит именно структура.
@ВПроекте
структура ПараметрыСеанса
пер МаркерДоступа: Строка
пер ВремяЖизниМаркераДоступа: Число
пер МоментПолученияМаркераДоступа: Момент
пер ИдентификаторСертификата: Число
пер ПИНКодСертификата: Строка
;
И тут же описываю константу с именем параметров сеанса (ключ соответствия). По этому ключу я смогу обращаться к своим параметрам в хранилище.
@ВПодсистеме
конст КЛЮЧ_ПАРАМЕТРОВ_СЕАНСА: Строка = "ИнтеграцияКриптоПроDSSПараметрыСеанса"
Тут же описываем метод, который будет возвращать нам наши параметры сеанса, нашу описанную выше структуру из хранилища.
@ВПроекте
@НаКлиенте
метод ПараметрыСеанса(): ПараметрыСеанса
возврат ПараметрыСеансаСервис.ПолучитьСервис().ПараметрПоКлючу(КЛЮЧ_ПАРАМЕТРОВ_СЕАНСА) как ПараметрыСеанса
;
Тут мы как раз и используем второй контракт ПараметрыСеансаСервис. Он вызывает метод из подсистем СтандартноеПриложение, который по переданному нами ключу получает из хранилища параметров сеанса нужный нам параметр.
Теперь в наш модуль реализация контрактов в свойства мы добавляем настройки типа и указываем там нужный нам контракт ПараметрыСеансаПоставщик (контракт имеет область видимости ВПроекте так что проблем быть не должно).
Текст yaml файла:
ВидЭлемента: ОбщийМодуль
Ид: 32413428-81fa-432a-ad96-0b8234931dbe
Имя: РеализацияКонтрактовСервер
ОбластьВидимости: ВПодсистеме
Импорт:
- СтандартноеПриложение
НастройкиТипа:
Контракты:
- ПараметрыСеансаПоставщик
Окружение: Сервер
В самом модуле нам нужно описать метод реализации контракта. Метод инициализирует параметры сеанса, создает пустую переменную с нужным нам типом и возвращает соответствие, в которое помещает наши параметры по нашему ключу. При необходимости заполнить параметры перед помещением мы можем это сделать тут же.
// Контракт ПараметрыСеансаПоставщик
@ВПроекте
@Реализация
метод КоллекцияПараметровСеанса(МобильныйИнтерфейс: Булево): Соответствие<Строка, Объект>
пер ПараметрыСеанса = новый ИнтеграцияКриптоПроDSS.ПараметрыСеанса()
возврат {ИнтеграцияКриптоПроDSS.КЛЮЧ_ПАРАМЕТРОВ_СЕАНСА: ПараметрыСеанса}
;
// Конец ПараметрыСеансаПоставщик
И теперь при необходимости, используя метод ИнтеграцияКриптоПроDSS.ПараметрыСеанса(), мы можем обращаться к созданным нами параметрам сеанса читать и изменять их.
Если поискать в проекте реализацию контракта ПараметрыСеансаПоставщик, можно найти, какие параметры добавляют другие подсистемы.
Вступайте в нашу телеграмм-группу Инфостарт