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

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

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

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

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

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

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

Где находится коллекция элементов управляемой формы

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

Коллекция существует только в контексте формы. Если вы пишете код в модуле объекта, модуле менеджера или общем модуле, свойства Элементы там нет — обращение вызовет ошибку «Переменная не определена». Чтобы управлять формой извне, нужно сначала получить саму форму (например, через ПолучитьФорму() или через параметр в обработчике оповещения), а затем обращаться к её свойству Элементы.

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

Получение элемента по имени через Элементы

Самый распространённый способ — прямое обращение по имени элемента, заданному в конфигураторе в свойстве «Имя»:

&НаКлиенте

Процедура СкрытьПолеКомментария(Команда)

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

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

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

Альтернатива — метод Найти(), который возвращает найденный элемент или Неопределено, если элемента нет. Это безопаснее, когда существование элемента зависит от условий (например, элемент добавлен программно не всегда):

&НаСервере

Процедура НастроитьФорму()

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

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

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

КонецЕсли;

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

bsl
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Элемент = ЭтаФорма.Элементы.Найти("Номенклатура");
    Если Элемент <> Неопределено Тогда
        Элемент.Доступность = Ложь;
    КонецЕсли;
КонецПроцедуры

Обращение к элементу через ЭтаФорма и из внешнего кода

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

Из внешнего кода (например, из общего модуля или из другой формы) элемент получают через полученный объект формы:

ФормаДокумента = ПолучитьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта");

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

Учтите ограничение: ПолучитьФорму() создаёт форму, но не открывает её. Если форма уже открыта у пользователя, вы получите новый экземпляр, и изменения не отразятся на видимой форме. Для работы с уже открытой формой используйте оповещения (Оповестить / ОбработкаОповещения) или передавайте форму как параметр при открытии.

Работа с динамически созданными элементами

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

&НаСервере

Процедура ДобавитьПолеПрограммно()

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

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

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

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

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

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

После программного добавления элемент доступен в коллекции наравне с созданными в конфигураторе: Элементы.Найти("ПолеСкидка") вернёт его до тех пор, пока форма не будет пересоздана.

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

Элементы таблицы формы и подчинённые элементы

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

&НаКлиенте

Процедура НастроитьКолонку()

// Прямое обращение по имени колонки

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

// Через подчинённые элементы таблицы

ТаблицаТовары = Элементы.Товары;

Для Каждого Подчиненный Из ТаблицаТовары.ПодчиненныеЭлементы Цикл

// обход колонок

КонецЦикла;

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

Обратите внимание: имя колонки по умолчанию формируется как имя таблицы плюс имя реквизита (ТоварыЦена), но разработчик мог его переименовать. Перед написанием кода сверьтесь с именем в конфигураторе.

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

Сравнение вариантов

Элементы.ИмяЭлемента

Быстрый и читаемый способ. Подходит, когда элемент гарантированно существует. При отсутствии элемента вызывает ошибку времени выполнения.

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

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

Обход ПодчиненныеЭлементы

Подходит для поиска по типу или свойству, а не по имени. Медленнее и сложнее, используется для массовой настройки группы элементов.

Проверка результата и типичные ошибки

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

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

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

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

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

Элемент найден через Найти()
Норма

Переменная содержит объект, ТипЗнч() возвращает ПолеФормы, ТаблицаФормы и т.п.

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

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

Изменение свойства применилось
Норма

Видимость/доступность/заголовок изменились в интерфейсе сразу после выполнения кода

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

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

Обращение по имени
Норма

Элементы.Имя возвращает объект без исключения

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

Ошибка «Поле объекта не обнаружено» — проверьте имя в конфигураторе

FAQ

Чем отличается Элементы от ЭлементыФормы в 1С?

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

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

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

Как получить значение поля, а не сам элемент?

Элемент формы — это визуальное отображение, данные хранятся в реквизитах формы. Значение читают через реквизит: Объект.Сумма или ЭтаФорма.ИмяРеквизита. У самого элемента данных нет, он лишь привязан к ним через свойство ПутьКДанным.

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

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

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

Да, коллекцию Элементы можно перебрать в цикле «Для Каждого Элемент Из Элементы Цикл». Внутри цикла доступны имя, тип и свойства каждого элемента. Это удобно для массовой настройки — например, установить ТолькоПросмотр всем полям формы.

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

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

Итог

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

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