Как правильно инициализировать параметры сеанса в 1С и избежать ошибки «Несоответствие типов»

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

Параметры сеанса в системе 1С:Предприятие 8 являются важнейшим механизмом для хранения глобальных данных, доступных на протяжении всей работы пользователя с базой. Однако их использование часто вызывает вопросы у начинающих разработчиков, особенно когда дело касается мобильных приложений или «самописных» конфигураций без использования БСП (Библиотеки стандартных подсистем). Проанализируем, как устроена инициализация этих параметров, и выясним, почему может возникать досадная ошибка «Несоответствие типов» при попытке присвоить значение.

Где происходит инициализация параметров сеанса

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

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

Двухэтапный механизм вызова обработчика

Платформа 1С вызывает процедуру УстановкаПараметровСеанса в двух принципиально разных ситуациях:

  1. При старте сеанса: В этот момент параметр ИменаПараметровСеанса имеет значение Неопределено. Здесь мы должны инициализировать «базовые» параметры, которые нужны системе сразу после запуска.
  2. По требованию (On-demand): Если в процессе работы программы код обращается к параметру сеанса, который еще не был установлен (имеет пустое значение по умолчанию), система автоматически вызывает этот же обработчик, но в ИменаПараметровСеанса передается Массив с именами конкретных параметров, к которым идет обращение.

Рассмотрим пример правильной структуры в модуле сеанса:


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

Разбор причины ошибки «Несоответствие типов»

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

Выясним причину: в 1С строки бывают двух видов — переменной длины и фиксированной длины. Если в конфигураторе для параметра сеанса установлен тип Строка и взведен флаг «Фиксированная длина» (например, 20 символов), то попытка записать в него обычную строку "" или строку другой длины вызовет ошибку Несоответствие типов.

Решение проблемы: В свойствах параметра сеанса в дереве метаданных необходимо снять галочку «Фиксированная длина». Это позволит платформе гибко работать со строковыми данными, автоматически приводя их к нужному виду без жесткой проверки на количество символов.

Инициализация по требованию и групповая установка

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

Посмотрим на пример реализации логики «по требованию»:


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

КонецПроцедуры

Особенности мобильной платформы

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

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

← На главную