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