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

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

Как найти элемент формы в 1С: способы и примеры

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

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

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

Как устроен доступ к элементам формы

Каждый элемент формы (поле ввода, кнопка, таблица, группа) имеет уникальное имя в пределах формы. Именно по имени платформа идентифицирует элемент. Увидеть имя можно двумя способами: открыть форму в конфигураторе и посмотреть палитру свойств, либо в режиме предприятия нажать Alt+F2 (в типовых конфигурациях с включённой технической информацией) и посмотреть путь к элементу.

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

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

Если имя элемента известно, самый простой вариант — прямое обращение:

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

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

Если имя хранится в переменной (например, приходит параметром или формируется динамически), используйте метод Найти:

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

НайденныйЭлемент = Элементы.Найти(ИмяЭлемента);

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

НайденныйЭлемент.Видимость = Истина;

Иначе

Сообщить("Элемент не найден: " + ИмяЭлемента);

КонецЕсли;

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

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

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

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

НайденныйЭлемент = ЭлементыФормы.Найти("НадписьИтог");

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

НайденныйЭлемент.Заголовок = "Итого: " + Сумма;

КонецЕсли;

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

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

Когда имя неизвестно — например, нужно найти все табличные поля формы или все кнопки определённой группы — используется перебор коллекции:

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

Если ТипЗнч(Элемент) = Тип("ТаблицаФормы") Тогда

Сообщить("Найдена таблица: " + Элемент.Имя);

КонецЕсли;

КонецЦикла;

Типы элементов управляемой формы: ПолеФормы, КнопкаФормы, ТаблицаФормы, ГруппаФормы, ДекорацияФормы. Для поля формы можно дополнительно проверить вид: Элемент.Вид = ВидПоляФормы.ПолеВвода.

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

Порядок действий
  1. 1
    Откройте форму в конфигураторе и узнайте точное имя нужного элемента
  2. 2
    В модуле формы обратитесь к элементу через Элементы.Найти("Имя") или Элементы.Имя
  3. 3
    Проверьте результат на Неопределено перед обращением к свойствам
  4. 4
    Установите нужные свойства: Видимость, Доступность, ТолькоПросмотр, Заголовок
  5. 5
    Проверьте работу в режиме предприятия под всеми релевантными ролями

Доступ к текущему элементу и элементу строки таблицы

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

АктивныйЭлемент = Элементы.Найти(ТекущийЭлемент.Имя);

// или проще — само свойство уже содержит элемент

Сообщить("Активен элемент: " + ТекущийЭлемент.Имя);

Для табличных частей важно различать элемент формы (таблицу) и данные строки. Чтобы получить текущую строку таблицы Товары:

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

Если ТекущиеДанные <> Неопределено Тогда

Сообщить("Номенклатура: " + ТекущиеДанные.Номенклатура);

КонецЕсли;

Обращение к колонке таблицы как к элементу выполняется по её имени, например Элементы.ТоварыЦена.ТолькоПросмотр = Истина;. Имена колонок тоже смотрятся в конфигураторе в дереве элементов формы.

Поиск элемента на чужой форме и извне

Иногда элемент нужно найти не в собственном модуле формы, а извне — например, из обработки, открывшей форму, или из расширения. В расширениях конфигурации доступ к элементам заимствованной формы выполняется через тот же объект Элементы в подключаемых обработчиках. Учтите, что элементы, добавленные расширением, и элементы основной конфигурации находятся в одной коллекции.

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

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

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

Вторая ошибка — путаница между именем реквизита и именем элемента. Реквизит формы Объект.Сумма и элемент формы СуммаДокумента, отображающий этот реквизит, — разные сущности. Обращение Элементы.Сумма не сработает, если элемент назван иначе.

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

Как проверить, что элемент найден и изменён

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

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

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

Результат Элементы.Найти()
Норма

Возвращён объект, обращение к свойствам работает

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

Неопределено — имени нет в коллекции или код выполняется до создания элементов

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

Элемент исчез или появился на форме

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

Свойство меняется, но визуально ничего не происходит — изменён не тот элемент

Работа под разными ролями
Норма

Поведение одинаково предсказуемо

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

У части пользователей элемент отсутствует из-за функциональных опций или прав

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

Чем отличается Элементы.Найти() от прямого обращения Элементы.Имя?

Прямое обращение быстрее и короче, но если элемента с таким именем нет, возникает ошибка исполнения. Метод Найти() возвращает Неопределено, что позволяет безопасно проверить существование элемента. Для динамически формируемых имён используйте только Найти().

Как найти элемент формы, если я не знаю его имя?

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

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

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

Можно ли найти элемент формы из модуля объекта документа?

Нет. Модуль объекта выполняется на сервере и не имеет доступа к клиентской форме. Передайте нужные данные в форму через параметры открытия или реализуйте логику в модуле формы.

Как обратиться к элементу формы в расширении конфигурации?

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

Как найти все поля ввода на форме?

Переберите коллекцию Элементы в цикле и отфильтруйте по типу: ТипЗнч(Элемент) = Тип("ПолеФормы"). Дополнительно можно проверить вид поля через Элемент.Вид = ВидПоляФормы.ПолеВвода, чтобы отсечь флажки и поля надписей.

Итог

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

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