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

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

Реквизиты формы в 1С: для чего нужны и как их использовать

Зачем нужны реквизиты формы в 1С, чем они отличаются от реквизитов объекта, как добавить реквизит на форму и избежать типичных ошибок при разработке.

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

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

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

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

Реквизит объекта — например, «Контрагент» в документе «Реализация товаров» — хранится в базе данных и сохраняется при записи. Реквизит формы существует только в памяти: он создаётся при открытии формы и уничтожается при её закрытии. Платформа не переносит его значение в информационную базу ни при каких условиях.

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

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

Для каких задач создают реквизиты формы

Первая и самая частая задача — параметры отбора и фильтры. Например, на форме списка документов добавляют реквизиты «ПериодС» и «ПериодПо», по изменению которых динамический список перестраивается. Хранить эти значения в базе бессмысленно — каждый пользователь задаёт их под себя.

Вторая задача — вычисляемые показатели: сумма по табличной части, количество выбранных строк, текущий остаток номенклатуры. Такие значения пересчитываются в обработчиках и выводятся в поля формы, связанные с реквизитами формы.

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

Наконец, реквизиты формы типа «ТаблицаЗначений» применяют для промежуточных данных: результатов подбора, временных списков, данных, загруженных из файла перед записью в объект.

Данные нужны только на экранеРеквизит формы

Отборы, флаги, вычисляемые итоги — храните в реквизитах формы

Данные должны сохранятьсяРеквизит объекта

Добавляйте реквизит в метаданные объекта, а не в форму

Временный список строкТаблица значений формы

Используйте реквизит типа ТаблицаЗначений с колонками

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

Откройте нужную форму в конфигураторе и перейдите на закладку «Реквизиты» в правой части редактора формы. Нажмите кнопку «Добавить» (зелёный плюс) над списком реквизитов. В палитре свойств задайте имя (без пробелов, по правилам идентификаторов), тип данных и при необходимости заголовок — он будет показан пользователю.

Если нужен составной тип, отметьте несколько типов в редакторе типа. Для таблицы значений выберите тип «ТаблицаЗначений», затем выделите созданный реквизит и добавьте в него колонки кнопкой «Добавить колонку реквизита».

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

Порядок действий
  1. 1
    Откройте форму в конфигураторе и перейдите на закладку «Реквизиты»
  2. 2
    Нажмите «Добавить», задайте имя, тип и заголовок реквизита
  3. 3
    Перетащите реквизит в дерево элементов формы
  4. 4
    Настройте свойства элемента: видимость, доступность, обработчики событий
  5. 5
    Проверьте работу в режиме предприятия: откройте форму и измените значение

Работа с реквизитами формы в коде: клиент и сервер

В модуле формы реквизиты доступны напрямую по имени: ЭтаФорма.ПериодС или просто ПериодС. В клиентских процедурах (директива &НаКлиенте) доступны реквизиты примитивных типов, ссылки и таблицы формы. Однако сложные типы — например, таблица значений как объект — полноценно работают только на сервере.

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

Для колонок табличных частей и таблиц формы обращение идёт через коллекцию: ЭтаФорма.ТаблицаПодбора[0].Количество или через текущие данные строки в обработчиках событий таблицы — Элементы.ТаблицаПодбора.ТекущиеДанные.Количество.

bsl
&НаСервере
Процедура ПересчитатьИтогНаСервере()
    ИтоговаяСумма = Объект.Товары.Итог("Сумма");
КонецПроцедуры

&НаКлиенте
Процедура ТоварыПриИзменении(Элемент)
    ПересчитатьИтогНаСервере();
КонецПроцедуры

Когда реквизит формы — плохое решение

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

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

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

Типичные ошибки и как их проверить

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

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

Третья ошибка — попытка работать с таблицей значений как с объектом на клиенте. На клиенте доступна только «ДанныеФормыКоллекция»; для обхода строк используйте цикл по коллекции, а серверную логику (запросы, выгрузки) выносите в серверные процедуры.

Типичные ошибки
01
Хранение прикладных данных в реквизите формы — значения теряются при закрытии формы
02
Пустое свойство «ПутьКДанным» у элемента — поле на форме не показывает данные
03
Обращение к реквизиту другой формы — реквизиты формы локальны, используйте параметры и оповещения
04
Тяжёлые таблицы значений в реквизитах — лишний трафик между клиентом и сервером и медленная форма

Как проверить, что всё настроено правильно

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

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

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

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

Значение после повторного открытия формы
Норма

Реквизит формы сброшен в начальное состояние

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

Значение сохранилось — это реквизит объекта, а не формы

Отображение данных в поле
Норма

Поле показывает значение реквизита и обновляется

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

Поле пустое — проверьте свойство «ПутьКДанным»

Работа серверных процедур
Норма

Данные таблицы формы сохраняются после вызова

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

Таблица очищается — реквизит перезаписывается на сервере

Итог

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

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

Частые вопросы о реквизитах формы

Сохраняется ли реквизит формы при записи документа?

Нет. Запись объекта сохраняет только его собственные реквизиты (главный реквизит формы «Объект»). Дополнительные реквизиты формы при записи не затрагиваются и при закрытии формы удаляются из памяти.

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

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

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

Да, методом ИзменитьРеквизиты() в обработчике «ПриСозданииНаСервере». Это используют, когда состав реквизитов зависит от условий. После добавления реквизита программно создают и элемент формы с привязкой к нему.

Почему таблица значений в реквизите формы недоступна на клиенте?

В управляемых формах данные делятся между клиентом и сервером. На клиенте таблица представлена коллекцией «ДанныеФормыКоллекция» — её можно обходить и редактировать, но методы объекта «ТаблицаЗначений» (например, «Выгрузить») доступны только на сервере.

Сколько реквизитов можно добавить на форму?

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