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

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

Как получить элемент формы в 1С

Как получить элемент формы в 1С: коллекция Элементы, ЭлементыФормы, НайтиЭлемент, обращение по имени, типовые ошибки и примеры кода для управляемых и обычных форм.

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

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

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

Как устроено обращение к элементам формы

Каждый элемент, добавленный на форму в конфигураторе или созданный программно, получает уникальное имя в пределах формы. Именно по этому имени элемент ищется в коллекции. Имя можно посмотреть в конфигураторе: откройте форму, выделите элемент и посмотрите свойство «Имя» в палитре свойств.

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

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

Получение элемента в управляемой форме

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

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

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

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

Безопасное получение через Найти

Метод Найти предпочтителен, когда элемент мог быть удалён программно, скрыт функциональной опцией или отсутствовать в данной роли интерфейса:

ЭлементФормы = Элементы.Найти("СуммаДокумента");

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

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

КонецЕсли;

bsl
ЭлементФормы = Элементы.Найти("Комментарий");
Если ЭлементФормы <> Неопределено Тогда
    ЭлементФормы.Видимость = Ложь;
Иначе
    Сообщить("Элемент не найден на форме");
КонецЕсли;

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

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

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

Элемент = ЭлементыФормы.Найти("Комментарий");

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

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

Управляемая форма (Элементы)

Основной вариант для современных конфигураций. Работает в тонком и веб-клиенте. Свойства элемента ограничены декларативной моделью.

Обычная форма (ЭлементыФормы)

Используется в старых конфигурациях и толстом клиенте. Больше прямого доступа к свойствам, но не работает в веб-клиенте.

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

Если элемент добавлен программно через Элементы.Добавить() или Элементы.Вставить(), получить его можно по тому же имени, которое указали при создании:

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

НовыйЭлемент.ПутьКДанным = "ОтборОрганизация";

// позже в другом обработчике:

ТотЖеЭлемент = Элементы.Найти("ПолеОтбора");

При динамическом создании элементов сохраняйте их имена в реквизитах формы или структуре, если планируете обращаться к ним из разных обработчиков. Это надёжнее, чем формировать имена «на лету» и надеяться, что они совпадут.

Обращение к элементам таблицы и групп

Колонки таблицы формы — тоже элементы, и их имена формируются от имени таблицы. Например, для таблицы Товары колонка цены может называться ТоварыЦена. Обращение стандартное: Элементы.ТоварыЦена.Видимость = Ложь;.

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

Для Каждого Элемент Из Элементы Цикл

Сообщить(Элемент.Имя + " — " + ТипЗнч(Элемент));

КонецЦикла;

Группы формы (ГруппаФормы) также доступны через Элементы. У группы можно менять видимость, заголовок, поведение сворачивания — это удобный способ скрывать сразу блок полей, не перечисляя каждый элемент.

Типичные ошибки при получении элементов

Ошибка «Поле объекта не обнаружено» почти всегда означает одно из трёх: опечатка в имени элемента, обращение к Элементы в обычной форме (или к ЭлементыФормы в управляемой), либо обращение к элементу из контекста, где форма недоступна.

Ещё одна распространённая ситуация — попытка изменить элемент в обработчике, который выполняется до создания формы. Свойства элементов безопасно менять начиная с события ПриСозданииНаСервере, а на клиенте — начиная с ПриОткрытии.

Типичные ошибки
01
Обращение Элементы.Имя без проверки — если элемента нет, код падает с исключением; используйте Элементы.Найти()
02
Смешение Элементы и ЭлементыФормы при переносе кода между управляемыми и обычными формами
03
Попытка изменить элемент из общего модуля без ссылки на форму — коллекция Элементы существует только в контексте формы
04
Изменение данных вместо элемента: Элементы.Комментарий.Видимость скрывает поле, но не очищает реквизит Объект.Комментарий
05
Добавление элемента на клиенте — в управляемой форме Элементы.Добавить работает только на сервере

Проверка результата и отладка

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

Для отладки удобно выводить состояние элемента в сообщение или смотреть его в отладчике: остановитесь на строке после получения элемента и проверьте, что переменная содержит объект нужного типа (ПолеФормы, КнопкаФормы и т. д.), а не Неопределено.

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

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

Переменная после Элементы.Найти
Норма

Содержит объект типа ПолеФормы, КнопкаФормы или другой элемент

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

Неопределено — элемент с таким именем отсутствует на форме

Изменение видимости
Норма

Поле исчезло или появилось в пользовательском режиме

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

Ничего не изменилось — проверьте функциональные опции и родительскую группу

Тип формы
Норма

В управляемой форме используется Элементы, в обычной — ЭлементыФормы

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

Ошибка «Поле объекта не обнаружено» при корректном имени элемента

Итог

Что важно запомнить

В управляемой форме элемент получают через Элементы.Имя или Элементы.Найти("Имя"), в обычной — через ЭлементыФормы. Метод Найти безопаснее, так как возвращает Неопределено вместо исключения. Элемент — это отображение данных, а не сами данные: изменение его свойств не затрагивает реквизиты объекта.

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

Как получить элемент формы, если код находится в общем модуле?

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

Чем отличается Элементы.Имя от Элементы.Найти("Имя")?

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

Почему Элементы.Найти возвращает Неопределено, хотя элемент есть на форме?

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

Как получить все элементы формы списком?

Переберите коллекцию в цикле: Для Каждого Элемент Из Элементы Цикл. У каждого элемента доступны свойства Имя, Вид, Родитель. Это удобно для массовой установки видимости или поиска элементов по шаблону имени.

Можно ли получить элемент формы другого открытого окна?

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

Как изменить элемент таблицы динамического списка на форме?

Элементы динамического списка (колонки) получают так же, через Элементы.ИмяКолонки. Однако состав колонок динамического списка часто формируется автоматически по запросу, поэтому надёжнее управлять отображением через настройки списка и условное оформление, а не через свойства элементов.