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

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

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

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

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

Главная сложность в том, что обращение к реквизиту зависит от контекста: на клиенте доступны не все методы, а данные формы часто хранятся в виде ДанныеФормыСтруктура, ДанныеФормыКоллекция или ДанныеФормыДерево, для которых нужен особый подход. Ниже разобраны рабочие способы получения реквизитов формы, их списка и значений с примерами кода.

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

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

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

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

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

// Получить все реквизиты верхнего уровня формы

МассивРеквизитов = ЭтаФорма.ПолучитьРеквизиты();

Для Каждого Реквизит Из МассивРеквизитов Цикл

Сообщить(Реквизит.Имя + " — " + Строка(Реквизит.ТипЗначения));

КонецЦикла;

// Получить колонки табличной части "Товары"

КолонкиТЧ = ЭтаФорма.ПолучитьРеквизиты("Объект.Товары");

Для Каждого Колонка Из КолонкиТЧ Цикл

Сообщить(Колонка.Имя);

КонецЦикла;

Обратите внимание: путь строится через точку от корня формы. Для табличной части документа, размещённой в основном реквизите «Объект», путь будет «Объект.Товары», а не просто «Товары». Ошибка в пути — самая частая причина пустого результата или исключения.

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

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

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

ИмяРеквизита = "СуммаДокумента";

Значение = ЭтаФорма[ИмяРеквизита];

// Через метод ПолучитьРеквизит — возвращает объект РеквизитФормы,

// а не значение, поэтому для значения используют обращение по имени

ОписаниеРеквизита = ЭтаФорма.ПолучитьРеквизит("СуммаДокумента");

Важно различать: ПолучитьРеквизит(Имя) возвращает описание реквизита (метаданные формы), а не его содержимое. Для чтения самого значения используйте ЭтаФорма[Имя] или прямое обращение по имени реквизита, если оно известно на этапе написания кода.

Работа с реквизитами сложных типов: коллекции и деревья

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

&НаСервере

Процедура ВыгрузитьТаблицуНаСервере()

// Преобразование данных формы в таблицу значений

ТЗ = РеквизитФормыВЗначение("ТаблицаДанных");

Для Каждого СтрокаТЗ Из ТЗ Цикл

// обработка строк

КонецЦикла;

КонецПроцедуры;

Обратное преобразование выполняет метод ЗначениеВРеквизитФормы. На клиенте обход коллекции делается напрямую: ЭтаФорма.ТаблицаДанных — это уже коллекция, по которой можно итерироваться циклом Для Каждого. Для дерева используется метод ПолучитьЭлементы() у строки дерева.

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

Получение реквизитов формы извне: из другой формы или модуля

Из внешнего кода (например, из формы-владельца или общего модуля) реквизиты чужой формы доступны через ссылку на объект формы. Если форма открыта с параметром и сохранена в переменной, обращение выглядит как ФормаДокумента.Объект.Номер или ФормаДокумента[ИмяРеквизита]. Метод ПолучитьРеквизиты() у внешней формы тоже доступен.

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

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

Как проверить существование реквизита перед обращением

При динамической работе с формами (универсальные обработки, расширения) реквизит может отсутствовать. Безопасная проверка — перебор массива ПолучитьРеквизиты() или попытка вызова ПолучитьРеквизит в конструкции Попытка/Исключение.

Функция РеквизитСуществует(Форма, ИмяРеквизита)

Попытка

Описание = Форма.ПолучитьРеквизит(ИмяРеквизита);

Возврат Описание <> Неопределено;

Исключение

Возврат Ложь;

КонецПопытки;

КонецФункции;

Такая проверка особенно важна в расширениях конфигурации, где форма может отличаться в зависимости от режима совместимости или настроек функциональности. Прямое обращение без проверки приведёт к падению кода у части пользователей.

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

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

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

Содержит элементы с ожидаемыми именами

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

Пустой массив при заведомо существующих реквизитах — проверьте путь

Значение через ЭтаФорма[Имя]
Норма

Возвращает данные ожидаемого типа

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

Исключение — реквизита нет или имя задано с ошибкой

Таблица после РеквизитФормыВЗначение
Норма

ТаблицаЗначений с тем же числом строк

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

Пустая таблица — данные не были заполнены на форме

Обычные формы: отличия подхода

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

Если конфигурация работает в режиме совместимости и использует оба типа форм, код получения реквизитов нужно писать отдельно для каждого случая. Универсальный подход — обращение через ЭтаФорма[Имя], которое работает в обоих режимах для существующих реквизитов.

Итог

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

Список реквизитов — ПолучитьРеквизиты(Путь), значение — ЭтаФорма[Имя]. Для таблиц и деревьев на сервере используйте РеквизитФормыВЗначение. Перед динамическим обращением проверяйте существование реквизита, а к чужим формам обращайтесь только пока они открыты.

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

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

Чаще всего указан неверный путь: для табличной части объекта нужен полный путь вида «Объект.Товары». Также пустой результат бывает при вызове у формы, у которой нет реквизитов на запрошенном уровне. Проверьте путь в конфигураторе в редакторе формы.

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

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

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

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

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

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

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

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

Как обойти все строки реквизита-таблицы на клиенте?

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