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