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