Работа с системой 1С:Предприятие часто требует гибкой настройки под конкретные нужды пользователя или организации. Одним из мощнейших инструментов, позволяющих передавать данные между клиентом и сервером, а также управлять поведением приложения в runtime, являются параметры сеанса. Это не просто переменные, а механизм, который позволяет изолировать контекст выполнения для каждого подключенного пользователя.
Многие начинающие разработчики путают обычные глобальные переменные и параметры сеанса, что приводит к ошибкам многопоточности или некорректному отображению данных в отчетах. Понимание того, как создать параметры сеанса 1С, открывает двери к созданию сложных алгоритмов фильтрации, динамических прав доступа и персонализированных интерфейсов. В этой статье мы подробно разберем технические нюансы работы с этим объектом.
Процесс инициализации может происходить как на этапе запуска приложения, так и в произвольный момент работы системы. Важно различать контексты: некоторые параметры доступны только при старте, другие можно менять «на лету». Неправильное управление этими значениями может привести к тому, что пользователь увидит чужие данные или потеряет доступ к необходимым функциям.
Что такое параметры сеанса и зачем они нужны
Параметры сеанса представляют собой коллекцию имен и значений, которые хранятся в памяти текущего сеанса работы пользователя. Они доступны во всех контекстах: на клиенте, на сервере, в обычных и управляемых приложениях. Ключевая особенность заключается в том, что эти данные уникальны для каждого запущенного сеанса 1С:Предприятие.
Основное назначение — передача контекстной информации без использования глобальных переменных модуля. Например, если вам нужно отфильтровать список документов по конкретному складу, выбранному при входе в систему, именно параметр сеанса станет идеальным носителем этого значения. Это обеспечивает безопасность и производительность запросов к базе данных.
⚠️ Внимание: Параметры сеанса не сохраняются после завершения работы программы. Если пользователю необходимо, чтобы значение сохранялось между сеансами, его нужно записывать в регистр сведений или профиль пользователя.
Использование параметров позволяет реализовать механизм RLS (Record Level Security) на уровне запросов. Когда вы формируете запрос к базе данных, система может автоматически подставлять значения из параметров сеанса в условия отбора. Это критически важно для многопользовательских систем, где разные менеджеры должны видеть только свои заказы.
Используйте префиксы в именах параметров (например, "Сессия_Склад"), чтобы избежать конфликтов имен с параметрами, создаваемыми сторонними обработками или расширениями.
Создание параметров при запуске приложения
Самый распространенный сценарий — инициализация параметров в момент подключения пользователя к базе. Для этого используется событие ПриНачалеРаботыСистемы в общем модуле с глобальным контекстом. Здесь вы можете запросить данные у пользователя или вычислить их на основе его прав доступа.
Для установки значения используется метод УстановитьПараметрСеанса. Он принимает два аргумента: имя параметра (строка) и его значение (любой тип данных, поддерживаемый платформой).
Процедура ПриНачалеРаботыСистемы()
// Получаем текущего пользователя
ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
// Устанавливаем параметр с именем пользователя
УстановитьПараметрСеанса("ИмяПользователя", ТекущийПользователь.Описание);
// Вычисляем рабочий склад на основе настроек пользователя
РабочийСклад = ПолучитьРабочийСклад(ТекущийПользователь);
УстановитьПараметрСеанса("ТекущийСклад", РабочийСклад);
КонецПроцедуры
Если параметр не был установлен при старте, попытка обратиться к нему через объект Сеанс вернет значение Неопределено. Это может привести к ошибкам выполнения, если код не предусм.атривает такую ситуацию. Поэтому хорошей практикой считается явная инициализация всех критически важных параметров в начале работы.
☑️ Инициализация при старте
Динамическое изменение параметров в runtime
Часто возникает ситуация, когда значение параметра должно измениться в процессе работы, например, при переключении организации в интерфейсе или смене периода анализа. В этом случае метод УстановитьПараметрСеанса вызывается непосредственно в обработчиках событий форм или команд.
При изменении параметра важно учитывать, что это действие может повлиять на открытые формы и запросы. Некоторые элементы интерфейса, привязанные к параметрам через механизмы динамических списков, могут потребовать обновления. Платформа 1С обычно отслеживает эти изменения автоматически, но в сложных случаях требуется явный вызов обновления.
Рассмотрим пример смены периода в отчете. Пользователь выбирает новую дату в форме, и мы должны обновить параметр, чтобы последующие выборки данных учитывали новый интервал.
&НаКлиенте
Процедура КнопкаСменитьПериод(Команда)
НовыйПериод = ПолучитьПериодОтПользователя();
Если НовыйПериод = Неопределено Тогда
Возврат;
КонецЕсли;
// Обновляем параметр сеанса
УстановитьПараметрСеанса("ПериодОтчета", НовыйПериод);
// Сообщаем пользователю об успехе
Сообщить("Период анализа изменен на " + Формат(НовыйПериод, "ДФ='dd.MM.yyyy'"));
КонецПроцедуры
⚠️ Внимание: Изменение параметров сеанса на клиенте возможно только если у пользователя есть соответствующие права. В некоторых конфигурациях эта операция может требовать вызова серверной процедуры.
Динамическое обновление позволяет создавать очень отзывчивые интерфейсы, где фильтрация данных происходит мгновенно без перезагрузки всей формы. Однако злоупотребление частой сменой параметров может создать нагрузку на сервер, если каждое изменение триггерит тяжелые запросы.
Работа с объектом Сеанс и чтение значений
Для чтения ранее установленных значений используется объект глобального контекста Сеанс. Он предоставляет свойство ПараметрыСеанса, которое возвращает коллекцию значений, или позволяет обращаться к конкретному параметру по имени как к свойству объекта.
Обращение к несуществующему параметру не вызывает ошибку, а возвращает Неопределено. Это удобно для проверки наличия значения, но требует аккуратности при использовании в арифметических операциях или сравнениях. Всегда проверяйте тип полученного значения перед его использованием.
Пример безопасного чтения параметра:
Функция ПолучитьТекущийСклад()
ЗначениеСклада = Сеанс.ПараметрыСеанса.ТекущийСклад;
Если ЗначениеСклада = Неопределено Тогда
// Возвращаем первый доступный склад по умолчанию
Возврат Склады.НайтиПоКоду("00001");
Иначе
Возврат ЗначениеСклада;
КонецЕсли;
КонецФункции
Также существует метод ПараметрСеанса, который позволяет получить значение по строковому имени. Это полезно, когда имя параметра формируется динамически или хранится в переменной. Синтаксис выглядит как Сеанс.ПараметрСеанса("ИмяПараметра").
Особенности типов данных
В параметры сеанса можно записывать любые типы, поддерживаемые 1С, включая ссылки, перечисления, структуры и массивы. Однако сложные объекты (например, формы или запросы) передавать нельзя.
Использование в запросах и СКД
Одной из самых мощных возможностей параметров сеанса является их прямое использование в языке запросов 1С. Вы можете обращаться к ним в тексте запроса, используя префикс &. Это позволяет писать универсальные запросы, которые автоматически фильтруют данные под текущего пользователя.
В системах компоновки данных (СКД) параметры сеанса часто используются как настройки отчета. Пользователь может не видеть явного поля ввода, но отчет будет строиться исходя из значения, заданного в сеансе. Это упрощает интерфейс и снижает вероятность ошибки ввода.
Пример запроса с использованием параметра:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДокументРеализацияТоваровУслуг.Ссылка КАК Ссылка,
| ДокументРеализацияТоваровУслуг.Дата КАК Дата
|ИЗ
| Документ.РеализацияТоваровУслуг КАК ДокументРеализацияТоваровУслуг
|ГДЕ
| ДокументРеализацияТоваровУслуг.Склад = &ПараметрСклада";
// Платформа автоматически подставит значение из сеанса
Запрос.УстановитьПараметр("ПараметрСклада", Сеанс.ПараметрыСеанса.ТекущийСклад);
Результат = Запрос.Выполнить();
При использовании в СКД важно правильно настроить набор полей и связи параметров. Если параметр сеанса используется для отбора, убедитесь, что он имеет корректный тип данных, совпадающий с типом поля в источнике данных.
| Метод доступа | Синтаксис | Возвращаемое значение | Особенности |
|---|---|---|---|
| Свойство объекта | Сеанс.ПараметрыСеанса.Имя |
Значение параметра | Удобно для статических имен |
| Метод коллекции | Сеанс.ПараметрыСеанса.Получить("Имя") |
Значение параметра | Позволяет перебор в цикле |
| Прямой метод | Сеанс.ПараметрСеанса("Имя") |
Значение параметра | Классический способ обращения |
| В запросе | &ИмяПараметра |
Подставляется в SQL | Требует регистрации в тексте |
Использование параметров в запросах через символ & является наиболее производительным способом фильтрации, так как оптимизатор запросов 1С учитывает их при построении плана выполнения.
Типичные ошибки и ограничения платформы
Несмотря на простоту использования, разработчики часто сталкиваются с подводными камнями. Одна из частых ошибок — попытка изменить параметр сеанса в фоновом задании или потоке, где контекст пользователя может отличаться от основного. Это приводит к тому, что изменение не видно в основном окне программы.
Другая проблема связана с объемом данных. Хотя платформа не накладывает жестких ограничений на размер одного параметра, передача огромных массивов или таблиц значений через параметры сеанса может существенно замедлить работу системы. Для больших объемов данных лучше использовать временные таблицы или регистры.
⚠️ Внимание: Не используйте параметры сеанса для хранения паролей или чувствительных персональных данных в открытом виде. Они хранятся в оперативной памяти и могут быть доступны при отладке или анализе дампа памяти.
Также стоит помнить о конфликтах имен. Если вы разрабатываете обработку, которая будет работать в разных конфигурациях, избегайте простых имен вроде "Склад" или "Дата". Используйте уникальные префиксы, характерные для вашей разработки, чтобы не перезаписать системные параметры конфигурации.
Конфликты в расширениях
При работе с расширениями конфигурации будьте осторожны: параметр, установленный в основной конфигурации, может быть перезаписан расширением, если они используют одинаковые имена.
Часто задаваемые вопросы (FAQ)
Можно ли создать параметр сеанса с пустым именем?
Нет, имя параметра сеанса должно быть непустой строкой. Попытка установить параметр с именем "" (пустая строка) приведет к ошибке выполнения. Также имя не должно содержать спецсимволов, недопустимых для идентификаторов в 1С.
Сколько параметров сеанса можно создать?
Технического ограничения на количество параметров нет, но стоит руководствоваться здравым смыслом. Сотни параметров усложняют отладку и поддержку кода. Рекомендуется группировать связанные данные в одну Структуру и передавать её как один параметр.
Доступны ли параметры сеанса в внешних обработках?
Да, если внешняя обработка подключена к той же информационной базе и запущена в рамках того же сеанса пользователя, она будет видеть те же параметры. Однако при запуске обработки как отдельного приложения параметры не наследуются.
Как удалить параметр сеанса?
Для удаления параметра используется метод УдалитьПараметрСеанса("Имя"). После вызова этого метода обращение к параметру вернет Неопределено. Это полезно для сброса настроек к состоянию по умолчанию.
Влияет ли смена параметра на открытых пользователей?
Нет, параметры сеанса изолированы. Изменение параметра в вашем сеансе никак не влияет на других пользователей, работающих в базе в тот же момент времени. Каждый видит только свои значения.