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

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

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

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

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

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

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

Чем элемент формы отличается от реквизита объекта

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

Чтобы изменить данные документа, работайте с реквизитом: Объект.Комментарий = "Проверено";. Чтобы изменить оформление поля на форме — с элементом: Элементы.Комментарий.Видимость = Ложь;. Попытка записать значение напрямую в элемент формы либо не сработает, либо приведёт к ошибке, потому что у поля ввода нет свойства, напрямую дублирующего значение реквизита.

Обращение к элементу в управляемой форме

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

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

Элементы.Контрагент.Доступность = Истина;

Элементы.Контрагент.Заголовок = "Покупатель";

Элементы.ГруппаДополнительно.Видимость = НЕ Объект.ЕстьДопСоглашение;

Имя элемента может не совпадать с именем реквизита. Например, поле, отображающее реквизит «Сумма», может называться «СуммаДокумента» или «ТоварыИтогСумма». Точное имя смотрите в конфигураторе: откройте форму документа, найдите нужный элемент в дереве и проверьте свойство «Имя».

Если нужно обратиться к элементу, имя которого формируется динамически, используйте метод Найти() коллекции элементов:

НайденныйЭлемент = Элементы.Найти("Поле_" + ИмяПоказателя);

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

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

КонецЕсли;

bsl
// Управляемая форма: скрыть поле и сделать недоступной кнопку
Элементы.Комментарий.Видимость = Ложь;
Элементы.ФормаПровестиИЗакрыть.Доступность = Ложь;
// Безопасный поиск элемента по имени
Эл = Элементы.Найти("СуммаДокумента");
Если Эл <> Неопределено Тогда
    Эл.Заголовок = "Итого";
КонецЕсли;

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

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

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

ЭлементыФормы.Товары.ТолькоПросмотр = Истина;

ЭлементыФормы.НадписьИтог.Заголовок = "Итого: " + СуммаДокумента;

Обычные формы встречаются в старых конфигурациях и внешних обработках, написанных под них. Если вы дорабатываете такую обработку, помните, что свойства управляемых и обычных элементов не полностью совместимы: например, ТолькоПросмотр в управляемой форме есть и у реквизитов формы, а механизм условного оформления реализован принципиально иначе.

Управляемая и обычная форма

Элементы (управляемая форма)

Современный режим «Такси». Обращение: Элементы.Имя.Свойство. Код выполняется на клиенте и сервере с учётом директив компиляции.

ЭлементыФормы (обычная форма)

Старые конфигурации и обработки. Обращение: ЭлементыФормы.Имя.Свойство. Код выполняется только на клиенте (толстый клиент).

Типовые сценарии: что именно меняют у элемента

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

Скрытие и показ поля

Свойство Видимость полностью убирает элемент с формы. Типичный случай — поле актуально только при определённом виде операции:

Процедура ВидОперацииПриИзменении(Элемент)

Элементы.СкладОтправитель.Видимость =

(Объект.ВидОперации = Перечисления.ВидыОпераций.Перемещение);

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

Важно: скрытие элемента не очищает значение реквизита. Если поле скрыто, но в реквизите остались данные, они сохранятся в документе. При необходимости очищайте реквизит явно.

Блокировка редактирования

Свойство Доступность оставляет поле видимым, но запрещает ввод. ТолькоПросмотр визуально показывает, что поле заблокировано. Для блокировки всей формы целиком удобнее установить ТолькоПросмотр у самой формы, а не перебирать элементы.

Изменение заголовка и оформления

Заголовок меняют, когда смысл поля зависит от контекста: например, «Плательщик»/«Получатель» в зависимости от вида платежа. Цвет фона и шрифт в управляемой форме задаются через свойства ЦветФона, Шрифт элемента либо через условное оформление формы — второй способ предпочтительнее для сложных условий.

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

Работа с элементами табличной части

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

// Получить текущую строку табличной части

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

Если ТекущиеДанные <> Неопределено Тогда

ТекущиеДанные.Сумма = ТекущиеДанные.Количество * ТекущиеДанные.Цена;

КонецЕсли;

Колонки таблицы — это вложенные элементы, к ним обращаются так же по имени: Элементы.ТоварыЦена.Видимость = Ложь;. Имена колонок в типовых конфигурациях обычно образованы от имени таблицы и реквизита, но всегда проверяйте в конфигураторе.

Для управления доступностью колонки в зависимости от данных строки используйте события таблицы (ПриАктивизацииСтроки, ПриНачалеРедактирования) либо условное оформление — прямое переключение свойств в обработчике ПриИзменении поля часто приводит к мерцанию и лишним серверным вызовам.

В каком событии обращаться к элементам

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

  • ПриСозданииНаСервере — для начальной настройки видимости и доступности после чтения объекта;
  • ПриОткрытии (на клиенте) — для настроек, требующих клиентского контекста;
  • обработчики ПриИзменении полей — для реакции на действия пользователя;
  • ПослеЗаписи, ПриПовторномОткрытии — для обновления состояния формы после изменений данных.

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

Типичные ошибки и их диагностика

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

Ошибка «Значение не является значением объектного типа» возникает, когда код обращается к свойству переменной, равной Неопределено — например, когда Элементы.Найти() не нашёл элемент, а проверка результата не выполнена. Всегда проверяйте результат Найти() перед использованием.

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

Типичные ошибки
01
Путать имя реквизита и имя элемента формы — они не обязаны совпадать, обращение по имени реквизита даёт ошибку
02
Записывать значение через элемент формы вместо реквизита объекта — данные не сохранятся
03
Обращаться к Элементы.Товары.ТекущиеДанные на сервере — свойство доступно только на клиенте
04
Не проверять результат Элементы.Найти() — при отсутствии элемента код падает с ошибкой
05
Обращаться к элементам до создания формы — коллекция ещё не заполнена

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

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

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

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

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

Поле скрывается по условию
Норма

При смене условия поле исчезает и появляется без перезапуска формы

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

Поле остаётся видимым или пропадает навсегда до переоткрытия

Значение реквизита
Норма

Данные записываются через Объект.ИмяРеквизита и сохраняются в документе

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

Значение пытаются записать через Элементы — после записи данные теряются

Выполнение без ошибок
Норма

Документ открывается, записывается и проводится без сообщений об ошибках

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

При открытии появляется «Поле объекта не обнаружено»

Итог

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

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

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

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

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

Почему код Элементы.ИмяПоля не работает в модуле объекта?

Элементы формы существуют только в контексте модуля формы. Модуль объекта работает с данными документа и ничего не знает о визуальном представлении. Логику оформления перенесите в модуль формы, а логику данных оставьте в модуле объекта.

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

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

Как скрыть сразу несколько элементов?

Переберите их в цикле по списку имён: создайте массив имён и для каждого выполните Элементы.Найти(ИмяЭлемента) с проверкой на Неопределено, затем установите Видимость = Ложь. Если элементы сгруппированы, проще скрыть всю группу — вложенные элементы скроются автоматически.

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

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

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

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