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