К статье
Практический материал

Разработка и Конфигурация · 11 мин

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

Как обратиться к элементу формы в 1С: через Элементы, ЭтаФорма, программное создание и изменение свойств. Примеры кода для управляемых и обычных форм.

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

Главная сложность для начинающих разработчиков — понимание разницы между данными формы (реквизитами) и элементами формы (визуальным отображением). Элемент формы — это только «витрина», связанная с данными через свойство ПутьКДанным. Меняя свойства элемента, вы управляете отображением, а меняя реквизит — данными. Путаница между этими уровнями — причина большинства ошибок.

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

Чем элемент формы отличается от реквизита формы

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

Практическое следствие: чтобы изменить значение, которое видит пользователь, нужно записать его в реквизит, а не в элемент. Чтобы скрыть поле или запретить редактирование — меняют свойства элемента. Попытка присвоить значение свойству элемента, которое относится к данным, приведёт либо к ошибке, либо к тому, что изменение не сохранится при записи объекта.

Обращение к элементу в управляемой форме

В управляемых формах (основной режим современных конфигураций) коллекция элементов доступна через свойство Элементы объекта формы. Внутри модуля формы обращение выглядит так:

Элементы.Контрагент.Видимость = Ложь;

Элементы.Комментарий.ТолькоПросмотр = Истина;

Элементы.КнопкаСохранить.Заголовок = "Записать и закрыть";

Если имя элемента хранится в переменной или формируется динамически, используйте обращение через квадратные скобки — это универсальный и безопасный способ:

ИмяЭлемента = "Поле" + НомерСтроки;

Элементы[ИмяЭлемента].Доступность = Ложь;

Из другого контекста (например, из модуля объекта, куда форма передана параметром) обращение идёт через переменную формы: Форма.Элементы.ИмяЭлемента. Внутри модуля самой формы также допустимо писать ЭтаФорма.Элементы, но короткая форма Элементы общепринята.

Обращение к элементу в обычной форме

Обычные формы встречаются в старых конфигурациях (режим обычного приложения). Там коллекция называется ЭлементыФормы, а синтаксис похож:

ЭлементыФормы.СуммаДокумента.ТолькоПросмотр = Истина;

ЭлементыФормы["ТабличноеПоле1"].Значение.Добавить();

Ключевое отличие обычных форм: элементы там могут напрямую хранить значение (свойство Значение), и граница между данными и отображением размыта. Тем не менее правильный подход тот же — работать с данными объекта, а элемент использовать для управления отображением.

Управляемая и обычная форма

Управляемая форма

Коллекция Элементы, данные отделены от отображения, код делится на клиентский и серверный контекст. Современный подход.

Обычная форма

Коллекция ЭлементыФормы, элементы могут хранить значения напрямую. Встречается в устаревших конфигурациях, миграция требует переработки кода.

Проверка существования элемента перед обращением

Если элемента с указанным именем нет на форме, обращение Элементы.ИмяЭлемента вызовет ошибку «Поле объекта не обнаружено». Это частая причина падения кода после переименования элемента в конфигураторе или при работе с формами, состав которых меняется динамически.

Безопасный вариант — метод Найти, который возвращает элемент или Неопределено:

Элемент = Элементы.Найти("ГруппаДополнительно");

Если Элемент <> Неопределено Тогда

Элемент.Видимость = Ложь;

КонецЕсли;

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

Изменение свойств: видимость, доступность, только просмотр

Три самых востребованных свойства при доработке форм — Видимость, Доступность и ТолькоПросмотр. Разница между ними принципиальна: невидимый элемент не отображается совсем, недоступный виден, но «затенён» и не реагирует на ввод, а элемент с признаком «только просмотр» выглядит обычно, но не редактируется.

Типовой пример — управление формой в зависимости от значения реквизита:

&НаКлиенте

Процедура ВидОперацииПриИзменении(Элемент)

ЭтоВозврат = (Объект.ВидОперации = ПредопределенноеЗначение(

"Перечисление.ВидыОпераций.Возврат"));

Элементы.ДокументОснование.Видимость = ЭтоВозврат;

Элементы.ДокументОснование.АвтоОтметкаНезаполненного = ЭтоВозврат;

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

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

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

Программное создание и поиск элементов

Элементы можно не только менять, но и создавать динамически — например, добавлять поля для дополнительных реквизитов. Перед добавлением обычно создают реквизит формы через ИзменитьРеквизиты, затем добавляют элемент:

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

НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;

НовыйЭлемент.ПутьКДанным = "Скидка";

НовыйЭлемент.Заголовок = "Скидка, %";

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

Обращение к элементам табличной части и текущей строке

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

СтрокаТаблицы = Элементы.Товары.ТекущиеДанные;

Если СтрокаТаблицы <> Неопределено Тогда

СтрокаТаблицы.Сумма = СтрокаТаблицы.Количество * СтрокаТаблицы.Цена;

КонецЕсли;

Проверка на Неопределено обязательна: если в таблице нет активной строки (она пуста или фокус не установлен), ТекущиеДанные вернёт Неопределено, и обращение к полям вызовет ошибку. Также полезны свойства ТекущаяСтрока (идентификатор строки) и ВыделенныеСтроки (массив идентификаторов при множественном выделении).

Контрольные точки

Как проверить результат

Обращение к элементу
Норма

Код выполняется без ошибки, свойство меняется визуально на форме

Тревожный признак

Ошибка «Поле объекта не обнаружено» — имени нет в дереве элементов формы

Изменение данных через реквизит
Норма

Значение сохраняется после записи и переоткрытия объекта

Тревожный признак

Значение видно на форме, но пропадает после записи — менялся элемент, а не реквизит

Работа с текущей строкой таблицы
Норма

Расчёт выполняется для активной строки, пустая таблица не вызывает ошибку

Тревожный признак

Ошибка при пустой таблице — отсутствует проверка ТекущиеДанные на Неопределено

Частые вопросы

Как обратиться к элементу формы из модуля объекта?

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

Чем Элементы.Имя отличается от Элементы["Имя"]?

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

Почему изменение свойства элемента не сохраняется после переоткрытия формы?

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

Как узнать точное имя элемента на форме?

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

Можно ли обратиться к элементу формы списка или формы выбора?

Да, принцип тот же: в модуле соответствующей формы доступна коллекция Элементы. У формы списка основной элемент — динамический список (обычно именуется «Список»), у него доступны свойства ТекущаяСтрока и ТекущиеДанные, а настройки отбора меняются через реквизит Список, а не через элемент.

Как обратиться к элементу на чужой открытой форме?

Нужно получить саму форму: например, через Оповестить/ОбработкаОповещения между формами или передав ссылку на форму при открытии (параметр при ОткрытьФорму). После этого обращение стандартное — Форма.Элементы.ИмяЭлемента. Прямого глобального поиска открытых форм по имени в управляемом приложении нет.