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