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

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

Как в 1С посмотреть реквизиты формы программно

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

Задача программно получить список реквизитов формы возникает при разработке универсальных обработок, механизмов обмена данными между формами, проверках заполнения и отладке. В обычных и управляемых формах эта задача решается по-разному: в управляемых формах есть специальный метод ПолучитьРеквизиты(), а в обычных приходится работать с метаданными объекта и элементами управления.

Ниже разобраны оба подхода с примерами кода, отличия клиентского и серверного контекста, способы получить не только имена, но и типы и значения реквизитов, а также типичные ошибки, из-за которых код «не видит» нужный реквизит.

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

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

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

Дополнительная особенность управляемых форм — разделение данных на клиенте и сервере. Реквизиты формы существуют на сервере и передаются на клиент, но обращение к ним идёт по имени через объект ЭтаФорма (или ЭтотОбъект в модуле формы), а не через структуру.

Как получить реквизиты управляемой формы через ПолучитьРеквизиты

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

Метод доступен только на сервере, поэтому из клиентской процедуры его вызывают через серверный вызов — директиву &НаСервере у процедуры в модуле формы.

bsl
&НаСервере
Процедура ПоказатьРеквизитыФормы()
	МассивРеквизитов = ПолучитьРеквизиты();
	Для Каждого Реквизит Из МассивРеквизитов Цикл
		Сообщить(Реквизит.Имя + " | " + Реквизит.Путь + " | " + Реквизит.ТипЗначения);
	КонецЦикла;
КонецПроцедуры

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

bsl
&НаСервере
Процедура ПоказатьКолонкиТаблицы()
	Колонки = ПолучитьРеквизиты("СписокТоваров");
	Для Каждого Колонка Из Колонки Цикл
		Сообщить(Колонка.Имя + " — " + Колонка.ТипЗначения);
	КонецЦикла;
КонецПроцедуры

Обратите внимание: метод возвращает описания реквизитов (объекты РеквизитФормы), а не их значения. Значения читаются отдельно — по имени через ЭтаФорма[Реквизит.Имя].

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

После того как имена реквизитов известны, значения читают через обращение по строковому имени. Это стандартный приём для универсальных механизмов, где имена заранее неизвестны:

bsl
&НаСервере
Процедура ПрочитатьЗначенияРеквизитов()
	Для Каждого Реквизит Из ПолучитьРеквизиты() Цикл
		Попытка
			Значение = ЭтаФорма[Реквизит.Имя];
			Сообщить(Реквизит.Имя + " = " + Значение);
		Исключение
			Сообщить(Реквизит.Имя + " — значение недоступно (таблица или составной реквизит)");
		КонецПопытки;
	КонецЦикла;
КонецПроцедуры

Основной реквизит формы (например, «Объект» для формы документа) представляет собой данные объекта целиком. Чтобы добраться до реквизитов самого объекта, читают ЭтаФорма.Объект.ИмяРеквизита или используют РеквизитФормыВЗначение("Объект") для получения прикладного объекта на сервере.

Как посмотреть реквизиты в обычной форме

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

bsl
Процедура ПоказатьРеквизитыОбъекта()
	МетаОбъект = Объект.Метаданные();
	Для Каждого МетаРеквизит Из МетаОбъект.Реквизиты Цикл
		Сообщить(МетаРеквизит.Имя + " — " + МетаРеквизит.Тип);
	КонецЦикла;
КонецПроцедуры

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

bsl
Процедура ПоказатьЭлементыФормы()
	Для Каждого Элемент Из ЭлементыФормы Цикл
		Сообщить(ТипЗнч(Элемент));
	КонецЦикла;
КонецПроцедуры

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

Сравнение подходов

ПолучитьРеквизиты() (управляемая форма)

Даёт точный состав данных формы, включая добавленные вручную реквизиты. Работает только на сервере.

Метаданные объекта

Показывает реквизиты объекта в базе, а не формы. Подходит, когда форма строится вокруг одного объекта.

ЭлементыФормы / Элементы

Показывает элементы интерфейса и их связь с данными. Не заменяет состав реквизитов, но помогает понять, что видит пользователь.

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

Метод ПолучитьРеквизиты доступен только в серверном контексте. Если вызвать его в процедуре с директивой &НаКлиенте, получите ошибку о недоступности метода. Типовое решение — клиентская процедура вызывает серверную, которая собирает данные и возвращает их в виде массива структур.

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

Маршрут решения

Как выбрать подход

Нужен полный список реквизитов управляемой формы с типамиВызовите ПолучитьРеквизиты() в серверной процедуре модуля формы
Нужны колонки табличной части на формеПередайте имя таблицы в ПолучитьРеквизиты(Путь)
Работаете в обычной формеИспользуйте Метаданные().Реквизиты объекта или обход ЭлементыФормы
Нужны значения, а не описанияЧитайте ЭтаФорма[ИмяРеквизита] по полученным именам

Как проверить результат и найти нужный реквизит

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

Для поиска конкретного реквизита по имени удобен обход с сравнением строк:

bsl
&НаСервере
Функция ЕстьРеквизитФормы(ИскомоеИмя)
	Для Каждого Реквизит Из ПолучитьРеквизиты() Цикл
		Если Реквизит.Имя = ИскомоеИмя Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;
	Возврат Ложь;
КонецФункции
Контрольные точки

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

Реквизит присутствует в списке
Норма

Имя выведено методом ПолучитьРеквизиты() без параметров

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

Имени нет — возможно, это колонка таблицы или реквизит объекта, не перенесённый в форму

Тип реквизита
Норма

Свойство ТипЗначения показывает ожидаемый тип

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

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

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

ЭтаФорма[Имя] возвращает значение без исключения

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

Ошибка обращения — реквизит является таблицей или путь указан неверно

Типичные ошибки и ограничения

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

Типичные ошибки
01
Вызов ПолучитьРеквизиты() на клиенте — метод недоступен, нужен серверный контекст
02
Ожидание, что метод вернёт колонки таблиц — без параметра Путь возвращаются только реквизиты верхнего уровня
03
Попытка прочитать значение табличного реквизита через ЭтаФорма[Имя] как скаляр — таблицу обходят по строкам
04
Поиск реквизита объекта (например, Объект.Комментарий) среди реквизитов формы — он находится внутри основного реквизита Объект и отдельно не выводится
05
Кэширование списка реквизитов после динамического изменения состава формы — после ИзменитьРеквизиты() список нужно получать заново

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

Часто задаваемые вопросы

Можно ли получить реквизиты формы без открытия формы?

Нет. Реквизиты формы существуют только в контексте созданной формы. Если нужен состав данных без открытия интерфейса, анализируйте метаданные объекта конфигурации через Метаданные — это даёт структуру данных в базе, но не состав конкретной формы.

Почему ПолучитьРеквизиты() не показывает реквизиты документа?

Метод показывает реквизиты самой формы. Реквизиты документа находятся внутри основного реквизита формы (обычно он называется «Объект»). Чтобы получить их состав, используйте РеквизитФормыВЗначение("Объект").Метаданные().Реквизиты на сервере.

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

У объекта РеквизитФормы есть свойство ТипЗначения — оно возвращает описание типов. Для проверки конкретного типа используйте ТипЗначения.СодержитТип(Тип("Строка")) или выведите тип через Сообщить() при отладке.

Работает ли ПолучитьРеквизиты во внешней обработке?

Да, если код находится в модуле формы внешней обработки и выполняется на сервере. Для управляемой формы внешней обработки метод работает так же, как и для форм объектов конфигурации.

Как получить реквизиты формы другой формы из текущей?

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

Чем отличаются свойства Имя и Путь у РеквизитФормы?

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

Итог

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

В управляемой форме состав реквизитов получают серверным методом ПолучитьРеквизиты(Путь): без параметра — реквизиты верхнего уровня, с именем таблицы — её колонки. Значения читают отдельно через ЭтаФорма[Имя]. В обычных формах используют метаданные объекта и коллекцию ЭлементыФормы. Главные ошибки — вызов метода на клиенте и смешение реквизитов формы с реквизитами объекта.