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