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