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

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

Как получить список реквизитов формы в 1С

Способы получить список реквизитов формы в 1С: метод ПолучитьРеквизиты(), перебор элементов, работа с динамическими списками. Примеры кода на встроенном языке.

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

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

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

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

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

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

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

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

Метод ПолучитьРеквизиты() вызывается в контексте управляемой формы и без параметров возвращает массив реквизитов верхнего уровня. Каждый элемент массива — объект со свойствами Имя, Путь, ТипЗначения, Заголовок и СохраняемыеДанные. Метод доступен на клиенте и на сервере в контексте формы.

Типовой пример перебора выглядит так:

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

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

Обратите внимание: метод возвращает именно описание реквизитов, а не их значения. Чтобы прочитать значение, обращайтесь к форме по имени реквизита: ЭтаФорма[Реквизит.Имя] или через ЭтаФорма.Объект для основного реквизита.

Анализ вложенных данных и табличных частей

Для табличных частей объекта путь строится через основной реквизит: ПолучитьРеквизиты("Объект.Товары") вернёт колонки табличной части «Товары» редактируемого документа. Для динамических списков и деревьев значений подход аналогичный — указывается путь к реквизиту-контейнеру.

Универсальная процедура обхода всех реквизитов с учётом вложенности выглядит так:

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

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

Получение реквизитов через элементы формы

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

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

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

Какой способ выбрать в разных ситуациях

Выбор метода зависит от цели анализа и места выполнения кода. Для отладки и разовой диагностики удобнее всего конфигуратор: панель «Реквизиты» в редакторе формы показывает полный состав с типами без написания кода. Для программной обработки внутри формы — ПолучитьРеквизиты(). Для анализа интерфейса — перебор элементов.

Сравнение способов

ПолучитьРеквизиты()

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

Перебор Элементы

Показывает, что реально выведено на экран. Не показывает скрытые служебные реквизиты.

Редактор формы в конфигураторе

Быстрый просмотр состава и типов без кода. Не подходит для программной обработки в runtime.

Описание метаданных объекта

Даёт состав реквизитов объекта конфигурации, но не учитывает реквизиты, добавленные вручную в форму.

Если форма создана динамически или изменена кодом через ИзменитьРеквизиты(), актуальный состав известен только в момент выполнения — конфигуратор покажет лишь исходное состояние. Это ещё один аргумент в пользу программного получения списка.

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

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

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

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

Проверка результата и практические приёмы

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

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

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

Основной реквизит в списке
Норма

Присутствует Объект, Запись или Список в зависимости от типа формы

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

Основного реквизита нет — возможно, анализируется не та форма

Колонки табличной части
Норма

Вызов с путём Объект.Товары возвращает непустой массив

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

Пустой массив или исключение — путь указан неверно

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

ТипЗначения читается для каждого элемента массива

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

Ошибка при обращении к типу — повреждённая структура формы

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

Итог

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

Список реквизитов формы получают методом ПолучитьРеквизиты() в контексте формы; вложенные таблицы требуют передачи пути. Элементы формы и реквизиты — разные сущности, их анализ решает разные задачи. Значения читаются отдельно от описаний реквизитов.

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

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

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

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

Вызов без параметров возвращает только реквизиты верхнего уровня. Колонки табличной части получают отдельным вызовом с указанием пути, например ПолучитьРеквизиты("Объект.Товары").

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

Переберите массив, возвращаемый ПолучитьРеквизиты(), найдите реквизит по имени и прочитайте свойство ТипЗначения — это объект ОписаниеТипов, из которого можно получить конкретные типы через метод Типы().

Чем отличается ПолучитьРеквизиты() от метаданных объекта?

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

Работает ли метод на тонком клиенте?

Да, метод доступен и на клиенте, и на сервере в контексте формы. Однако значения реквизитов, не переданных на клиент, на клиенте прочитать нельзя — только их описания.

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

Откройте форму в конфигураторе и перейдите на вкладку «Реквизиты» в редакторе формы — там отображается полный состав с типами и признаками основных реквизитов. Это самый быстрый способ для разового анализа.