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

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

Как обратиться к полю на форме 1С

Как обратиться к полю на форме 1С: обращение через Элементы, реквизиты формы, данные объекта. Примеры кода для управляемых и обычных форм, типичные ошибки.

Обращение к полю на форме 1С — одна из базовых задач при доработке конфигураций. Разработчику нужно прочитать введённое пользователем значение, подставить данные программно, скрыть или заблокировать поле в зависимости от условий. Сложность в том, что в 1С «поле на форме» и «данные, которые оно показывает» — разные сущности, и обращаться к ним нужно по-разному.

В управляемых формах (платформа 8.2 и выше) действует разделение на клиентский и серверный контекст, а элементы формы и реквизиты формы живут по разные стороны этого разделения. Поэтому код вида Элементы.Поле1.Значение, который кажется очевидным, часто не работает или работает не так, как ожидается.

Ниже разобраны рабочие способы обращения к полям: через коллекцию Элементы, через реквизиты формы, через данные объекта, а также особенности обычных форм и типичные ошибки, из-за которых код падает с ошибкой или молча не делает ничего.

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

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

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

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

Обращение к элементу формы через коллекцию Элементы

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

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

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

Элементы.Сумма.ЦветТекста = WebЦвета.Красный;

Если имя элемента заранее неизвестно, используйте обращение через строку: Элементы["Поле" + Номер]. Это удобно при работе с динамически создаваемыми группами полей.

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

Как прочитать и изменить значение поля

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

Если поле связано с реквизитом формы, значение читается и записывается напрямую через имя реквизита:

// Чтение

ТекущееЗначение = ЭтаФорма.НаименованиеПолное;

// Запись

ЭтаФорма.НаименованиеПолное = "Новое наименование";

В модуле формы ключевое слово ЭтаФорма можно опускать: НаименованиеПолное = "...". Но явное указание делает код понятнее, особенно когда рядом используются локальные переменные с похожими именами.

Значение реквизита объекта

На форме документа или элемента справочника основной реквизит обычно называется Объект. Поля, связанные с реквизитами объекта, редактируются через него:

Объект.Организация = НоваяОрганизация;

СуммаДокумента = Объект.СуммаДокумента;

bsl
&НаКлиенте
Процедура ЗаполнитьПоУмолчанию(Команда)
	Если Не ЗначениеЗаполнено(Объект.Валюта) Тогда
		Объект.Валюта = ПолучитьВалютуПоУмолчанию();
	КонецЕсли;
КонецПроцедуры

Важно понимать: на клиенте Объект — это не настоящий объект базы данных, а структура данных формы (ДанныеФормыСтруктура). Запись в базу произойдёт только при вызове Записать() или при закрытии с сохранением.

Табличная часть и текущая строка

Для полей табличной части обращение идёт через текущую строку таблицы:

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

Если СтрокаТаблицы <> Неопределено Тогда

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

КонецЕсли;

На сервере табличная часть доступна как коллекция: Объект.Товары[0].Количество. Проверка на Неопределено обязательна — если таблица пустая или строка не выбрана, ТекущиеДанные вернёт Неопределено, и обращение к полю вызовет ошибку.

Как программно заполнить поле формы
  1. 1
    Откройте модуль формы в конфигураторе и определите, с чем связано поле: реквизит формы или реквизит объекта (смотрите ПутьКДанным в свойствах поля).
  2. 2
    Для реквизита объекта присвойте значение: Объект.ИмяРеквизита = Значение. Для реквизита формы — ЭтаФорма.ИмяРеквизита = Значение.
  3. 3
    Для поля табличной части сначала получите строку: Элементы.ИмяТаблицы.ТекущиеДанные, проверьте её на Неопределено.
  4. 4
    Запустите форму в режиме предприятия и проверьте, что значение появилось в поле и корректно сохраняется при записи.

Управление видимостью и доступностью поля

Частая задача — скрыть поле или запретить его редактирование по условию. Это делается через свойства элемента:

// Видимость — поле полностью скрыто

Элементы.ДатаОтгрузки.Видимость = (Объект.СпособДоставки = "ТранспортнаяКомпания");

// Доступность — поле видно, но неактивно

Элементы.Скидка.Доступность = ПользовательИмеетПраво;

// ТолькоПросмотр — значение видно, изменить нельзя

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

Разница между Доступность и ТолькоПросмотр: недоступное поле «сереет» целиком вместе с кнопками, а поле только для просмотра остаётся визуально активным, но не даёт редактировать значение. Для полей ввода чаще используют ТолькоПросмотр.

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

Если видимость поля зависит от роли пользователя, не полагайтесь только на скрытие элемента. Значение по-прежнему доступно в данных формы и через запросы. Для реальной защиты данных используйте права доступа на реквизиты и RLS.
ПЗ
Практическое замечание

Обращение к полю в обычных формах

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

// Обычная форма

ЭлементыФормы.Наименование.Значение = "Тест";

ЭлементыФормы.СправочникСписок.ТекущаяСтрока.Код;

Однако и здесь правильнее работать с данными объекта (Объект.Наименование или реквизитами формы), а свойство Значение использовать только когда поле не связано с данными. Разделение клиент/сервер в обычных формах отсутствует — весь модуль выполняется на клиенте (толстом), что упрощает обращение, но ухудшает масштабируемость.

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

Управляемая форма

Элементы.ИмяПоля — только вид и доступность; значение через реквизиты формы и Объект. Код делится на клиентский и серверный контекст.

Обычная форма

ЭлементыФормы.ИмяПоля.Значение — доступ к значению напрямую. Весь код выполняется на клиенте, ограничений контекста нет.

Частые ошибки и как их избежать

Самая распространённая ошибка — попытка прочитать значение через Элементы.Поле.Значение в управляемой форме. Такого свойства у большинства элементов нет, и код завершится ошибкой. Значение всегда берётся из данных, а не из элемента.

Вторая типичная ситуация — обращение к Элементы в серверной процедуре общего модуля или в модуле объекта. Там формы не существует, поэтому коллекция недоступна. Если логика должна влиять на форму, её нужно размещать в модуле формы, а общие модули использовать только для вычислений над данными.

Третья ошибка — обращение к полю до создания формы или после её закрытия, а также обращение к ТекущиеДанные таблицы без проверки на Неопределено. Обе ситуации дают падение кода, которое пользователь увидит как непонятное сообщение об ошибке.

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

Как проверить, что обращение сработало

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

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

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

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

ПутьКДанным поля в конфигураторе
Норма

Путь совпадает с именем реквизита, используемого в коде

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

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

Значение после присваивания
Норма

В поле на форме отображается новое значение

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

Поле пустое или показывает старое значение — обращение идёт не к тому реквизиту

Сохранение после записи
Норма

После Записать() значение есть в базе

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

После записи значение теряется — изменялись данные формы, не связанные с объектом

Итог

Схема выбора простая: внешний вид поля — через Элементы.ИмяПоля, значение — через реквизит формы или Объект.ИмяРеквизита, поле табличной части — через ТекущиеДанные с обязательной проверкой на Неопределено. В обычных формах коллекция называется ЭлементыФормы и допускает прямой доступ к Значение.

Итог

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

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

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

Почему Элементы.Поле.Значение выдаёт ошибку в управляемой форме?

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

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

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

Как получить значение поля текущей строки табличной части?

На клиенте используйте Элементы.ИмяТаблицы.ТекущиеДанные — это объект строки, к полям которого обращаются по имени. Перед обращением обязательно проверьте, что результат не равен Неопределено, иначе при пустой таблице код завершится ошибкой.

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

Да, коллекция Элементы поддерживает обращение по строковому имени: Элементы["Поле" + Номер]. Это удобно для динамически созданных элементов. Если элемента с таким именем нет, вернётся Неопределено — это стоит учитывать в коде.

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

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

Как обратиться к полю в обычной форме 1С 8.2?

Через коллекцию ЭлементыФормы: ЭлементыФормы.ИмяПоля.Значение для значения и ЭлементыФормы.ИмяПоля.Видимость для отображения. Предпочтительнее работать с данными объекта, а Значение использовать только для полей, не связанных с данными формы.