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