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

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

Реквизиты формы в 1С: что это и как с ними работать

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Тип реквизитаКогда использоватьОграничение
Строка, Число, Дата, БулевоФлаги, фильтры, итоги, подписиОдно значение, без структуры
Ссылка (справочник, документ)Поле выбора-фильтра, не связанное с объектомНе сохраняется при закрытии формы
ТаблицаЗначенийПроизвольные списки, подбор, результаты запросовНужно вручную описывать колонки
ДеревоЗначенийИерархические данные, группировкиСложнее программная работа
ДинамическийСписокОбновляемые списки с запросомТолько чтение данных запроса

Как обращаться к реквизитам формы из кода

В модуле формы реквизиты доступны напрямую по имени, если форма работает в контексте управляемой формы с директивой «&НаКлиенте» или «&НаСервере». Например, присвоить значение: ПоказыватьАрхив = Истина;. Для реквизита-таблицы значений доступны методы: ТоварыПодбор.Добавить(), ТоварыПодбор.Очистить(), обход в цикле.

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

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

1c
&НаСервере
Процедура ЗаполнитьПодборНаСервере()
    ТоварыПодбор.Очистить();
    Запрос = Новый Запрос("ВЫБРАТЬ Ссылка, Цена ИЗ Справочник.Номенклатура");
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        Строка = ТоварыПодбор.Добавить();
        Строка.Номенклатура = Выборка.Ссылка;
        Строка.Цена = Выборка.Цена;
    КонецЦикла;
КонецПроцедуры

Типичные сценарии использования реквизитов формы

Фильтры и отборы на форме списка

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

Подбор товаров и временные таблицы

В формах подбора номенклатуры выбранные позиции накапливаются в реквизите «ТаблицаЗначений», а по кнопке «Перенести в документ» передаются в вызвавшую форму через ОповеститьОВыборе() или закрытие с возвратом значения. Пока пользователь подбирает — данные живут только в форме подбора и не засоряют документ.

Управление видимостью и состоянием формы

Реквизиты-флаги удобны для переключения режимов формы: «РежимПросмотра», «СвернутьДетали». В обработчике изменения флага вы меняете видимость элементов: Элементы.ГруппаДетали.Видимость = Не СвернутьДетали;. Это чище, чем хранить состояние в скрытых переменных модуля.

Типичные ошибки при работе с реквизитами формы

Самая частая ошибка — попытка сохранить важные данные в реквизите формы и удивление, что после переоткрытия всё пропало. Если данные должны пережить закрытие формы, используйте реквизит объекта, регистр сведений или ХранилищеОбщихНастроек. Реквизит формы — только для сеансовых данных.

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

Третья ошибка — изменение реквизитов динамически в клиентском контексте. Метод ИзменитьРеквизиты() работает только на сервере; попытка вызвать его в процедуре «&НаКлиенте» приведёт к ошибке. Всегда выносите изменение структуры формы в серверную процедуру.

Типичные ошибки
01
Хранение важных данных в реквизите формы — при закрытии формы данные теряются без предупреждения
02
Обращение к реквизиту формы из модуля объекта — компилятор выдаст ошибку «Переменная не определена»
03
Вызов ИзменитьРеквизиты() на клиенте — метод доступен только в серверном контексте
04
Имя реквизита формы совпадает с реквизитом объекта — неоднозначное поведение и ошибки обращения
05
Большие таблицы значений в реквизитах формы — медленное открытие формы и лишний трафик клиент-сервер

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

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

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

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

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

Поле на форме
Норма

Поле отображается, принимает и удерживает значение

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

Поле отсутствует — реквизит не перенесён в элементы формы

Данные после закрытия
Норма

Данные не нужны после закрытия (это норма для реквизита формы)

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

Нужные данные пропали — их надо было хранить в объекте или регистре

Таблица значений
Норма

Строки видны на форме и в отладчике

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

В отладчике строки есть, на форме пусто — заполнена локальная копия

Серверные вызовы
Норма

Форма открывается быстро, вызовы не тормозят

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

Заметные задержки — в реквизитах слишком большие таблицы

FAQ

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

Напрямую — нет, реквизиты формы уничтожаются при закрытии. Для сохранения пользовательских настроек используйте ХранилищеОбщихНастроек: сохраняйте значение при закрытии формы и восстанавливайте при создании на сервере. Альтернатива — стандартный механизм сохранения настроек формы, который платформа применяет к некоторым элементам автоматически.

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

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

Как добавить колонку в таблицу значений — реквизит формы?

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

Почему в процедуре «&НаКлиенте» не виден метод ИзменитьРеквизиты?

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

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

Да, если у вас есть объект открытой формы — например, полученный при вызове ОткрытьФорму() или найденный через ПолучитьФорму(). Обращение идёт как к свойству: Форма.ИмяРеквизита. Учитывайте, что после закрытия формы обращение вызовет ошибку, поэтому проверяйте, открыта ли форма.

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

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

Итог

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

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