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