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

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

Как использовать реквизиты формы в 1С

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

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

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

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

Что такое реквизит формы и когда он нужен

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

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

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

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

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

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

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

Привязка реквизита к элементу формы

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

Если элемент уже существует, связь задаётся через свойство «ПутьКДанным» в палитре свойств элемента. Именно это свойство определяет, откуда элемент берёт значение и куда записывает введённое пользователем. Без заполненного пути к данным поле ввода останется «пустышкой», не связанной ни с чем.

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

Обращение к реквизитам формы в коде

В модуле формы к реквизиту обращаются по имени, как к свойству: ИтоговаяСумма = Количество * Цена;. Платформа сама находит реквизит среди свойств формы. На клиенте доступны все реквизиты формы, на сервере — тоже, потому что данные формы передаются между клиентом и сервером автоматически.

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

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

bsl
&НаСервере
Процедура ПересчитатьИтогНаСервере()
	ИтоговаяСумма = 0;
	Для Каждого Строка Из ТаблицаТоваров Цикл
		ИтоговаяСумма = ИтоговаяСумма + Строка.Сумма;
	КонецЦикла;
КонецПроцедуры

Программное добавление реквизитов

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

После добавления реквизита программно создают и элемент: Элементы.Добавить("Поле1", Тип("ПолеФормы"), Родитель), затем задают ПутьКДанным и вид поля. Ограничение: изменять состав реквизитов можно только на сервере и только до того, как форма показана пользователю, — в ПриСозданииНаСервере или при повторном вызове с пересозданием формы.

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

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

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

Отбор в динамическом списке

Реквизит формы используют как параметр отбора динамического списка: в обработчике изменения реквизита устанавливают элемент отбора списка через Список.Отбор.Элементы или меняют параметр запроса. Это позволяет фильтровать список, не изменяя сам запрос в конфигураторе.

Временная таблица для расчётов

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

Маршрут решения

Как выбрать действие

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

Проверка результата и типичные ошибки

После добавления реквизита проверьте результат в режиме предприятия: поле отображается на форме, введённое значение читается в коде (проверить можно через отладчик, поставив точку останова в обработчике), табличный реквизит позволяет добавлять и удалять строки. Если поле серое — проверьте свойства «ТолькоПросмотр» элемента и доступность родительской группы.

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

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

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

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

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

Поле отсутствует или недоступно — реквизит не перенесён в элементы или нарушена видимость

Значение в коде
Норма

В отладчике реквизит содержит введённое пользователем значение

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

Значение пустое — не заполнен ПутьКДанным у элемента

Табличный реквизит
Норма

Строки добавляются, колонки соответствуют составу реквизита

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

Колонки пустые — элементы колонок не связаны с колонками реквизита

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

Ограничения и рекомендации

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

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

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

Частые вопросы

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

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

Почему поле на форме не сохраняет введённое значение?

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

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

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

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

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

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

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

Влияют ли реквизиты формы на производительность?

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

Итог

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

Реквизит формы хранит временные данные открытой формы и создаётся в конфигураторе или программно через ИзменитьРеквизиты(). Элемент формы связывается с реквизитом через ПутьКДанным, в коде обращение идёт по имени. Для данных, которые должны попасть в базу, используйте реквизиты объекта, а типовые формы дорабатывайте через расширения.