Как программно обращаться к элементам управляемой формы и использовать серверные вызовы без контекста в 1С

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

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

Коллекция Элементы: программное управление интерфейсом

Для того чтобы изменить свойства любого визуального компонента на форме (будь то кнопка, поле ввода, таблица или целая группа), мы используем специализированную коллекцию. Рассмотрим подробнее основные аспекты работы с ней.

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

  1. Реквизиты формы — это данные (значения переменных, объект справочника или документа). К ним мы обращаемся напрямую по имени, например: Объект.Дата.
  2. Элементы формы — это визуальные «окна» для этих данных. К ним мы обращаемся через коллекцию Элементы.

Проанализируем пример кода. Если нам необходимо программно скрыть поле «Физлицо» на форме при определенном условии, мы должны написать следующее:


// Пример управления видимостью элемента
Если УсловиеТогда
    Элементы.Физлицо.Видимость = Ложь;
КонецЕсли;

Обратим внимание, что элементы в коллекции могут быть организованы в иерархическую структуру (группы, страницы). Однако платформа позволяет обращаться к любому элементу напрямую через точку от коллекции Элементы, независимо от того, насколько глубоко в группах он спрятан. Это значительно упрощает написание кода.

Оптимизация вызовов: директива &НаСервереБезКонтекста

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

  1. Собирает все данные формы (весь контекст: реквизиты, значения, состояние элементов) в один пакет.
  2. Передает этот объемный пакет на сервер.
  3. На сервере восстанавливает состояние формы, выполняет процедуру.
  4. Снова упаковывает данные и отправляет их обратно клиенту.

Если форма «тяжелая» (например, содержит многострочную табличную часть), такой вызов может работать очень медленно. Для решения этой задачи мы используем директиву &НаСервереБезКонтекста.

Разберем по шагам преимущества и ограничения этой директивы:

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

Ограничения: Внутри такой процедуры или функции недоступны реквизиты формы и объект. Вы не можете написать Объект.Наименование или ЭтаФорма. Если вам нужны какие-то данные с формы для расчетов, их нужно передать как аргументы.

Посмотрим на пример правильного использования вызова без контекста:


&НаКлиенте
Процедура ПриИзмененииКоличества(Элемент)
    // Передаем только нужные данные, не гоняя всю форму
    Результат = ВычислитьСуммуНаСервере(Объект.Цена, Объект.Количество);
    Объект.Сумма = Результат;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ВычислитьСуммуНаСервере(Цена, Количество)
    // Здесь нет доступа к Объект, работаем только с параметрами
    Возврат Цена * Количество;
КонецФункции

Нюансы программного изменения формы

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

  1. Сначала мы должны добавить данные, используя метод ИзменитьРеквизиты().
  2. Затем мы добавляем визуальный элемент в коллекцию Элементы, связывая его с созданным реквизитом.

Пример программного добавления кнопки:


&НаСервере
Процедура ДобавитьКнопкуНаФорму()
    НовыйЭлемент = Элементы.Добавить("МояКнопка", Тип("КнопкаФормы"), Элементы.ГруппаКоманднаяПанель);
    НовыйЭлемент.Заголовок = "Нажми меня";
    НовыйЭлемент.ИмяКоманды = "МояКоманда";
КонецПроцедуры

Нужно помнить, что на стороне клиента (директива &НаКлиенте) коллекция Элементы доступна только для чтения и изменения существующих свойств (видимость, доступность, цвет текста). Создавать новые элементы или менять структуру формы на клиенте запрещено.

Итоги и рекомендации

Подводя итог нашему анализу, закрепим основные правила работы с управляемыми формами:

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

← На главную