Как правильно перенести "глобальную переменную" на управляемые формы в 1С:Предприятии 8.3 и избежать проблем?

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

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

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

1. Реквизиты формы как способ хранения данных

Реквизиты формы — это основной способ хранения и работы с данными, которые использует ваша форма. Мы можем рассматривать их как локальные "глобальные" переменные, доступные в пределах одной формы.

  1. Назначение и видимость: Реквизиты формы предназначены для хранения данных, с которыми работает форма, и являются основным способом взаимодействия с данными на управляемых формах. К реквизитам формы можно обращаться напрямую в коде формы, как на клиенте, так и на сервере (через свойства объекта формы).
  2. Флаг "Использовать всегда": Если реквизит формы должен быть всегда доступен на стороне клиента, независимо от того, отображается ли он на форме, для него устанавливается флаг "Использовать всегда". Однако, важно отметить, что этот флаг нельзя установить для реквизитов с типами, которые не передаются автоматически с сервера на клиент (например, ХранилищеЗначения).
  3. Передача данных без отображения: Мы можем использовать реквизит формы для передачи таблиц значений с сервера на клиент. При этом нам не нужно указывать его в скобках или передавать как функцию через возврат; он передается через этот служебный реквизит, который не обязательно выводить на форму.
  4. Автоматическое сохранение: Управляемые формы позволяют настроить автоматическое сохранение данных реквизитов формы. При этом форма сохранит данные, введенные в поля, соответствующие реквизитам, при закрытии, а при последующем открытии информация в этих полях восстановится автоматически. Для этого нам необходимо установить свойство формы "Автоматическое сохранение данных в настройках" в значение "Использовать" и отметить флажками в колонке "Сохранение" нужные реквизиты.

2. Дополнительные свойства объекта (ДополнительныеСвойства)

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

  1. Назначение и применение: ДополнительныеСвойства — это специальная конструкция встроенного языка 1С:Предприятие, предназначенная для передачи или временного хранения значений, связанных с текущим объектом, без изменения конфигурации. Эта конструкция доступна для всех объектных метаданных, то есть тех, которые можно записать (например, документы, справочники). Одним из ярких примеров является использование ДополнительныеСвойства при проведении документов, когда нам нужно передать какие-то временные флаги или значения из формы в модуль объекта.
  2. Механизм работы: ДополнительныеСвойства представляют собой структуру, которую разработчик может заполнять по своему усмотрению. Для добавления элемента мы используем метод Вставить(), а для проверки наличия и получения значения можем использовать метод Свойство() или более безопасную функцию ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры из БСП.
  3. Примеры использования:

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

    
    &НаСервере
    Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
        // Предполагаем, что переменная "ФлИзмененОператор" или "МояПрелесть"
        // объявлена как реквизит формы или локальная переменная формы.
        ТекущийОбъект.ДополнительныеСвойства.Вставить("ФлИзмененОператор", ФлИзмененОператор);
        ТекущийОбъект.ДополнительныеСвойства.Вставить("МояПрелесть", МояПрелесть);
        // Здесь может быть еще какой-либо код
    КонецПроцедуры
    

    Далее, в модуле объекта (например, в процедуре ПередЗаписью()), мы можем получить это значение:

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

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

    
    // Возвращает значение свойства структуры.
    // Параметры:
    //   Структура          - Структура | ФиксированнаяСтруктура - объект, из которого необходимо прочитать значение ключа.
    //   Ключ               - Строка - имя свойства структуры, для которого необходимо прочитать значение.
    //   ЗначениеПоУмолчанию - Произвольный - возвращается когда в структуре нет значения по указанному ключу.
    //       Для скорости рекомендуется передавать только быстро вычисляемые значения (например примитивные типы),
    //       а инициализацию более тяжелых значений выполнять после проверки полученного значения (только если это
    //       требуется).
    // Возвращаемое значение:
    //   Произвольный - значение свойства структуры. ЗначениеПоУмолчанию если в структуре нет указанного свойства.
    МояПрелесть = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДополнительныеСвойства, "МояПрелесть", Ложь);
    

    Использование этой функции позволяет нам получить значение по умолчанию, если свойство отсутствует, что делает код более устойчивым к ошибкам.

3. Параметры сеанса

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

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

4. Временное хранилище

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

  1. Назначение: Временное хранилище используется для передачи больших объемов данных между клиентом и сервером, а также между различными формами и модулями. Это особенно актуально для таблиц значений, двоичных данных или других объектов, которые нежелательно передавать напрямую по сети.
  2. Механизм: Данные помещаются во временное хранилище на сервере, и клиенту передается только адрес этого хранилища (УникальныйИдентификатор). Чтение и запись данных из временного хранилища должны выполняться на сервере, используя переданный адрес.

5. Передача параметров в серверные вызовы

При взаимодействии клиента и сервера мы должны придерживаться определенных принципов для оптимизации производительности и надежности. Рассмотрим эти принципы.

  1. Принцип оптимизации: Для передачи данных с клиента на сервер мы должны передавать только необходимые данные, избегая передачи всей формы или избыточных данных. Это позволяет минимизировать сетевой трафик и количество серверных вызовов, что положительно сказывается на производительности приложения.
  2. Использование функций для возврата данных: Мы рекомендуем использовать функции для возврата требуемых данных с сервера на клиент, а не пытаться возвращать значения параметров обратно. Функции явно указывают, что они возвращают результат, делая код более читаемым и предсказуемым.
  3. Ограничения передачи формы: Важно помнить, что мы не можем напрямую передать объект формы с клиентского кода в серверный общий модуль. Для этого необходимо сначала вызвать серверный метод формы, который уже может передать необходимые данные (но не саму форму) в серверный общий модуль.

Общие рекомендации при работе с данными в управляемых формах

Подводя итоги, давайте сформулируем общие рекомендации, которые помогут нам эффективно работать с данными в управляемых формах 1С:Предприятия 8.3.

  1. Избегайте традиционных глобальных переменных: В управляемых формах 1С мы должны избегать использования глобальных переменных в традиционном понимании, так как они не сохраняют свое значение между серверными вызовами и могут привести к непредсказуемому поведению.
  2. Используйте специализированные механизмы: Для передачи данных между клиентом и сервером, а также для сохранения состояния, мы рекомендуем использовать реквизиты формы, ДополнительныеСвойства объектов, параметры сеанса (с осторожностью) и временное хранилище.
  3. Оптимизируйте взаимодействие: Мы должны оптимизировать количество серверных вызовов и объем передаваемых данных для улучшения производительности приложения.
  4. Тщательно продумывайте архитектуру: Нам следует тщательно продумывать архитектуру передачи данных, чтобы избежать излишнего дублирования кода, обеспечить модульность и упростить поддержку системы.

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

← К списку