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