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

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

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

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

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

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

Кроме прямого обращения по имени, существуют программные способы поиска элементов, работа с динамически создаваемыми элементами и доступ к данным формы через реквизиты. Ниже разобраны основные сценарии с примерами кода, типичные ошибки и способы проверить результат.

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

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

&НаКлиенте

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

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

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

Через точку после имени элемента доступны его свойства: Видимость, Доступность, Заголовок, ТолькоПросмотр, ЦветТекста и другие. Набор свойств зависит от типа элемента — у поля ввода и у кнопки он различается.

Важно понимать разницу между элементом формы и данными, которые он отображает. Свойство Элементы.Контрагент — это само поле на форме. Значение, которое в нём находится, хранится в реквизите формы или объекте: Объект.Контрагент. Изменение элемента не меняет данные, и наоборот.

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

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

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

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

ЭлементыФормы.Комментарий.Доступность = Ложь;

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

В обычной форме у поля ввода есть прямой доступ к значению через свойство Значение, тогда как в управляемой форме значение читается только из связанного реквизита. Это частая причина путаницы при переносе кода между типами форм.

Определить тип формы можно по директивам компиляции: в управляемой форме процедуры помечены &НаКлиенте и &НаСервере, в обычной форме таких директив нет.

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

Когда имя элемента известно только в виде строки — например, оно сформировано динамически или передано параметром — используется метод Найти:

&НаКлиенте

Процедура НайтиЭлементПоИмени(ИмяЭлемента)

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

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

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

Иначе

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

КонецЕсли;

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

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

Для обхода всех элементов формы используется цикл по коллекции. Это удобно, например, для массового сброса оформления:

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

// обработка каждого элемента

КонецЦикла;

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

Доступ к элементам табличной части и динамическим спискам

Табличная часть документа на форме — это отдельный элемент типа «таблица», связанный с данными. Обращение к самому элементу и к его текущей строке выполняется по-разному:

&НаКлиенте

Процедура РаботаСТаблицей()

// Элемент формы — сама таблица

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

// Текущая строка таблицы

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

Если ТекущаяСтрока <> Неопределено Тогда

Сообщить(ТекущаяСтрока.Номенклатура);

КонецЕсли;

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

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

Для динамических списков (например, списка документов) доступ к данным строки выполняется аналогично через ТекущиеДанные, но изменять данные напрямую нельзя — список отображает данные базы, а редактирование выполняется через открытие объекта.

Типичные ошибки
01
Обращение к Элементы.ИмяЭлемента до создания формы — в обработчике ПриСозданииНаСервере элементы ещё могут быть недоступны в ожидаемом виде при определённых условиях
02
Попытка изменить данные через элемент: Элементы.Контрагент = Значение — так меняется не значение, а сам объект элемента, что вызывает ошибку
03
Использование ЭлементыФормы в управляемой форме — код не скомпилируется
04
Обращение к несуществующему имени без проверки Найти — ошибка выполнения в момент обращения

Программное создание и изменение элементов

Если элемент нужно создать динамически — например, добавить поле по условию — используется метод Элементы.Добавить (на сервере) или Элементы.Вставить. Перед этим обычно добавляют реквизит формы через ИзменитьРеквизиты:

&НаСервере

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

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

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

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

НовыйЭлемент.Заголовок = "Добавленное поле";

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

Ключевое свойство здесь — ПутьКДанным: оно связывает элемент с реквизитом формы. Без корректной связи поле отобразится, но не будет показывать и сохранять данные.

Программно созданные элементы не сохраняются между сеансами — при каждом открытии формы код создания выполняется заново. Если элемент нужен постоянно, правильнее добавить его в конфигураторе, а не генерировать динамически.

Контекст выполнения: клиент, сервер и директивы

Доступ к Элементы возможен и в клиентских, и в серверных процедурах управляемой формы, но есть ограничения. В клиентском контексте недоступны некоторые операции с данными (например, запросы к базе), а в серверном контексте без контекста формы (&НаСервереБезКонтекста) обращение к Элементы невозможно вовсе — объекта формы там нет.

Для работы с элементами на сервере используйте директиву &НаСервере (с контекстом). Если логика меняет только данные, а не интерфейс, предпочтительнее серверный вызов без контекста с последующим обновлением отображения — это снижает объём передаваемых данных.

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

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

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

Элемент найден
Норма

Элементы.Найти(Имя) вернул объект, свойства читаются без ошибок

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

Возвращено Неопределено — проверьте имя в конфигураторе

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

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

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

Элемент остаётся видимым — возможно, код выполняется не в том событии или переопределяется другим обработчиком

Связь с данными
Норма

Изменение реквизита отражается в поле формы

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

Поле пустое — проверьте свойство ПутьКДанным

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

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

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

Почему Элементы.ИмяЭлемента возвращает ошибку «Поле объекта не обнаружено»?

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

Как изменить заголовок элемента формы программно?

Установите свойство Заголовок: Элементы.Контрагент.Заголовок = "Покупатель". Изменение действует только в текущем сеансе работы формы и не меняет конфигурацию.

Как получить значение, которое пользователь ввёл в поле?

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

Можно ли обратиться к элементу по его заголовку?

Нет, поиск методом Найти выполняется только по имени элемента. Заголовок — это отображаемый текст, он не уникален и может меняться. Если нужно найти элемент по заголовку, придётся перебирать коллекцию Элементы в цикле и сравнивать свойство Заголовок у каждого элемента.

Чем отличается Доступность от ТолькоПросмотр у элемента?

Доступность = Ложь делает элемент неактивным (серым): его видно, но нельзя ни изменить, ни поставить курсор. ТолькоПросмотр = Истина разрешает выделять и копировать содержимое поля, но запрещает редактирование. Для полей с данными обычно предпочтительнее ТолькоПросмотр.

Итог

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

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