Как создать общую форму для установки параметров сеанса и избежать ошибок при записи

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

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

Разбор ситуации: Переменная или Параметр сеанса?

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

Если при попытке присвоения значения кодом ПараметрыСеанса.ВашеИмя = Значение; система выдает ошибку, это означает одну из трех проблем:

  1. Объект не создан в дереве метаданных конфигурации.
  2. У текущего пользователя нет прав на "Установку" этого параметра.
  3. Тип данных, который вы пытаетесь записать, не соответствует типу, указанному в настройках параметра.

Шаг 1. Создание параметра сеанса в конфигураторе

Прежде чем писать код в форме, мы должны подготовить почву в конфигураторе. Рассмотрим этот процесс по шагам:

  1. Откроем конфигуратор и перейдем в ветку Общие.
  2. Найдем подраздел Параметры сеанса и добавим новый объект, например, с именем ТекущаяКасса.
  3. В свойстве Тип крайне важно указать правильный тип данных. Если мы работаем с кассами, выбираем СправочникСсылка.Кассы. Если оставить тип "Любая ссылка" или ошибиться, система будет выдавать ошибку несоответствия типов при каждой попытке записи.

Шаг 2. Настройка прав доступа

Выясним важную деталь: параметры сеанса — это объекты, на которые распространяется система прав доступа (роли). Рассмотрим, как их настроить:

Для каждой роли, которая будет использовать данную форму, необходимо зайти в настройки и найти наш новый параметр ТекущаяКасса. В правой колонке обязательно должны стоять галочки напротив пунктов Получение и Установка. Без права "Установка" любая попытка записи значения из формы приведет к критическому сбою программы.

Шаг 3. Инициализация в модуле сеанса

Параметры сеанса должны быть инициализированы при запуске системы, иначе при первом же обращении к ним программа "вылетит" с ошибкой. Проанализируем правильный подход — использование процедуры УстановкаПараметровСеанса в Модуле сеанса.

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


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

Шаг 4. Создание общей формы и программная логика

Теперь, когда инфраструктура готова, разберем создание самой формы КассаПоУмолчанию. В обычных формах алгоритм работы будет следующим:

При открытии формы мы должны считать текущее значение, чтобы пользователь видел, что выбрано сейчас. В процедуре нажатия кнопки "ОК" мы фиксируем выбор. Рассмотрим пример кода для модуля формы:


Перем ВыбраннаяКасса;

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

Процедура ОсновныеДействияФормыОК(Кнопка)
    // Важнейшая строка: запись в глобальный параметр сеанса
    Попытка
        ПараметрыСеанса.ТекущаяКасса = ВыбраннаяКасса;
        Закрыть();
    Исключение
        Сообщить("Ошибка при установке кассы: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Процедура ОсновныеДействияФормыОтмена(Кнопка)
    Закрыть();
КонецПроцедуры

Почему это удобно?

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

ГДЕ Касса = &ПараметрСеанса.ТекущаяКасса

Система 1С сама подставит актуальное значение из памяти сервера, что значительно ускоряет разработку и выполнение кода.

Типичные ошибки, которых следует избегать

Рассмотрим несколько моментов, на которых часто спотыкаются новички:

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

← На главную