Разработка и Конфигурация · 9 мин
Реквизит формы в 1С: что это и как с ним работать
Реквизит формы в 1С — что это такое, чем отличается от реквизита объекта, как создать и изменить реквизит формы в конфигураторе и программно, типичные ошибки.
Реквизит формы в 1С — это переменная, которая хранится внутри формы и живёт, пока форма открыта. В отличие от реквизита объекта конфигурации (справочника, документа), реквизит формы не записывается в базу данных: после закрытия формы его значение теряется. Именно поэтому реквизиты формы используют для промежуточных расчётов, отборов, флагов состояния и любых данных, которые нужны пользователю только на экране.
Разработчики управляемых форм сталкиваются с реквизитами формы постоянно: любой динамический список, таблица значений на форме, переключатель или вычисляемое поле — это реквизиты формы. Понимание того, где хранятся эти данные и как к ним обращаться из кода, снимает большинство вопросов вроде «почему поле не видно в модуле» или «почему значение пропало после закрытия формы».
Чем реквизит формы отличается от реквизита объекта
Главное различие — место хранения и время жизни. Реквизит объекта (например, «Контрагент» в документе «Реализация товаров») описан в метаданных и физически хранится в таблице базы данных. При записи документа значение уходит в базу и доступно из отчётов, запросов и других сеансов.
Реквизит формы существует только в памяти на время работы формы. Если вы добавили на форму поле «КомментарийДляМенеджера» как реквизит формы, то после закрытия формы оно исчезнет. Чтобы сохранить такое значение, нужно при записи перенести его в реквизит объекта, регистр сведений или другой механизм хранения.
В управляемых формах есть важный нюанс: основной реквизит формы (например, «Объект» в форме документа) — это данные объекта, поднятые в форму. Обращение Объект.Контрагент работает с данными документа, а обращение ЭтаФорма.МойРеквизит — с реквизитом формы. Смешение этих контекстов — самая частая причина ошибок начинающих разработчиков.
Сравнение вариантов
Хранится в базе, участвует в запросах и отчётах. Подходит для данных, которые нужны после закрытия формы. Требует изменения метаданных и обновления конфигурации.
Живёт только в открытой форме, не требует изменения структуры базы. Подходит для отборов, флагов, промежуточных таблиц. Значение теряется при закрытии.
Передаются при открытии формы, доступны только для чтения. Подходят для передачи настроек из вызывающего кода.
Где посмотреть и как создать реквизит формы в конфигураторе
Откройте нужную форму в конфигураторе. В правой части редактора формы есть закладка «Реквизиты» — там перечислены все реквизиты формы, включая основной реквизит (обычно «Объект», «Список» или «Запись»). Если панель не видна, включите её через меню или сочетание клавиш, предусмотренное для палитры свойств формы.
Чтобы добавить реквизит, нажмите кнопку «Добавить» в панели реквизитов, задайте имя, тип и при необходимости заголовок. Имя должно быть корректным идентификатором встроенного языка: без пробелов, не начинаться с цифры. Для табличных данных выберите тип «ТаблицаЗначений» и добавьте в неё колонки как подчинённые реквизиты.
После создания реквизит можно перетащить мышью в дерево элементов формы — платформа автоматически создаст поле ввода, таблицу или флажок в зависимости от типа. Это самый быстрый способ связать данные с интерфейсом.
- 1Откройте форму объекта в конфигураторе и перейдите на закладку «Реквизиты» в правой панели.
- 2Нажмите «Добавить», укажите имя, тип данных и заголовок реквизита.
- 3Для таблицы значений добавьте подчинённые колонки через контекстное меню реквизита.
- 4Перетащите реквизит в дерево элементов формы, чтобы создать связанное поле.
- 5Откройте форму в режиме 1С:Предприятие и проверьте, что значение вводится и сохраняется в течение сеанса работы формы.
Как обратиться к реквизиту формы из кода
В модуле формы реквизиты доступны напрямую по имени: МойРеквизит = 10; или через ЭтаФорма.МойРеквизит. Платформа подставляет реквизиты формы в контекст модуля, поэтому явное указание формы обычно не требуется.
Если реквизит — таблица значений, работа с ней идёт как с коллекцией: Для Каждого Строка Из Товары Цикл ... КонецЦикла;. На сервере управляемой формы таблица формы имеет тип «ДанныеФормыКоллекция», поэтому методы обычной таблицы значений (например, Выгрузить() с произвольным отбором) недоступны напрямую — сначала преобразуйте данные через РеквизитФормыВЗначение().
&НаСервере
Процедура ЗаполнитьОстаткиНаСервере()
ТЗ = РеквизитФормыВЗначение("Товары");
// обработка таблицы запросом
ЗначениеВРеквизитФормы(ТЗ, "Товары");
КонецПроцедурыПрограммное создание реквизитов формы
Когда состав полей заранее неизвестен (например, колонки формируются по настройкам пользователя), реквизиты добавляют программно методом ИзменитьРеквизиты(). Метод принимает два массива: добавляемые и удаляемые реквизиты, описанные объектами Новый РеквизитФормы(Имя, ОписаниеТипов).
Важное ограничение: ИзменитьРеквизиты() вызывается только на сервере, чаще всего в обработчике ПриСозданииНаСервере. После добавления реквизита нужно программно создать и связанный элемент формы через Элементы.Добавить(), указав путь к данным в свойстве ПутьКДанным.
Динамическое создание реквизитов удорожает поддержку конфигурации: такой код не виден в конфигураторе и сложнее отлаживается. Применяйте его только когда статического набора реквизитов действительно недостаточно.
Типичные ошибки при работе с реквизитами формы
Первая распространённая ошибка — ожидание, что значение реквизита формы сохранится после записи объекта. Платформа ничего не переносит автоматически: разработчик обязан сам в обработчике ПередЗаписью или ПриЗаписи скопировать значение в реквизит объекта или иной механизм хранения.
Вторая ошибка — попытка обратиться к реквизиту формы извне, из другого объекта или общего модуля. Реквизит формы доступен только в контексте этой формы. Для передачи данных между формами используйте параметры формы, оповещения (Оповестить / ОбработкаОповещения) или временное хранилище.
Третья группа проблем связана с серверными вызовами: при каждом серверном вызове данные формы сериализуются, поэтому большие таблицы значений в реквизитах формы заметно замедляют работу. Если таблица содержит тысячи строк, рассмотрите динамический список или хранение данных на сервере с порционной подгрузкой.
Как проверить, что всё работает правильно
После добавления реквизита откройте форму в режиме предприятия и выполните простой сценарий: введите значение, выполните действие, вызывающее серверный вызов (например, пересчёт), и убедитесь, что значение не сбросилось. Затем закройте и заново откройте форму — реквизит формы должен вернуться к значению по умолчанию. Если этого не произошло, вероятно, вы работаете с реквизитом объекта, а не формы.
Для программно созданных реквизитов проверьте в отладчике, что после ИзменитьРеквизиты() реквизит доступен по имени, а элемент формы корректно связан через ПутьКДанным. Ошибка в пути к данным проявляется как пустое или неактивное поле без сообщений об ошибке.
Как проверить результат
Введённое значение сохраняется
Поле очищается — проверьте обработчики и путь к данным
Реквизит формы пустой или со значением по умолчанию
Старое значение осталось — это реквизит объекта
Поле отображает и редактирует значение реквизита
Поле пустое и неактивное — неверный ПутьКДанным
Частые вопросы о реквизитах формы
Чем реквизит формы отличается от элемента формы?
Реквизит — это данные, элемент — визуальное отображение (поле ввода, таблица, флажок). Один реквизит может быть связан с несколькими элементами или не иметь ни одного, если используется только в коде.
Сохраняется ли реквизит формы при записи документа?
Нет. Запись объекта сохраняет только его собственные реквизиты. Чтобы сохранить значение реквизита формы, перенесите его в реквизит объекта в обработчике ПередЗаписью или используйте регистр сведений и дополнительные свойства.
Можно ли обратиться к реквизиту формы из другой формы?
Напрямую — нет, реквизит существует только в контексте своей формы. Передавайте данные через параметры при открытии, механизм оповещений или временное хранилище значений.
Почему метод Выгрузить() не работает с таблицей на форме?
Таблица на управляемой форме имеет тип ДанныеФормыКоллекция, у которого нет части методов обычной таблицы значений. Преобразуйте её функцией РеквизитФормыВЗначение() на сервере, выполните операции и верните результат через ЗначениеВРеквизитФормы().
Когда оправдано программное создание реквизитов?
Когда состав полей зависит от настроек пользователя или данных и неизвестен на этапе разработки — например, произвольные колонки отчёта на форме. Во всех остальных случаях статические реквизиты в конфигураторе надёжнее и проще в сопровождении.
Что важно запомнить
Реквизит формы — временное хранилище данных открытой формы, не попадающее в базу. Создаётся в конфигураторе или методом ИзменитьРеквизиты() на сервере. Для постоянного хранения переносите значения в реквизиты объекта, а большие таблицы держите в динамических списках, чтобы не замедлять форму.