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