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