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

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

Для чего используются реквизиты формы в 1С

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

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

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

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

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

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

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

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

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

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

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

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

  • Итоговые и расчётные показатели, не хранимые в объекте;
  • Параметры отбора и отображения (флажки, переключатели);
  • Таблицы значений для подбора, загрузки, сравнения данных;
  • Служебные признаки состояния формы (изменён, проверен, режим работы);
  • Данные для команд формы, которым нужен контекст между вызовами сервера.

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

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

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

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

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

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

В модуле формы реквизиты доступны напрямую по имени, как свойства объекта «Форма». Например, ИтогоСоСкидкой = Объект.Товары.Итог("Сумма") * 0.9; — здесь «Объект» — главный реквизит, а «ИтогоСоСкидкой» — добавленный реквизит формы. Обращение одинаковое в клиентских и серверных процедурах формы.

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

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

bsl
&НаСервере
Процедура ЗагрузитьДанные()
    ТЗ = РеквизитФормыВЗначение("ТаблицаДанных");
    ТЗ.Очистить();
    ТЗ.Загрузить(ПолучитьДанныеИзЗапроса());
    ЗначениеВРеквизитФормы(ТЗ, "ТаблицаДанных");
КонецПроцедуры

Типы данных и ограничения реквизитов формы

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

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

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

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

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

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

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

Типичные ошибки
01
Создан реквизит, но элемент формы не связан с ним — значение не отображается
02
Вызов методов таблицы значений на клиенте у ДанныеФормыКоллекция — ошибка исполнения
03
Хранение в реквизите формы данных, которые должны сохраняться в базе, — потеря при закрытии
04
Дублирование реквизита объекта отдельным реквизитом формы — рассинхронизация значений
05
Использование несериализуемых типов — ошибки при серверных вызовах

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

Минимальная проверка — открыть форму в режиме предприятия, ввести значение в связанное поле и убедиться, что оно доступно в коде (например, через отладчик или вывод сообщения). Затем выполнить серверный вызов — например, нажать кнопку с серверной командой — и убедиться, что значение не обнулилось.

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

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

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

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

Ввод значения в поле формы
Норма

Значение читается в коде по имени реквизита

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

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

Серверный вызов после ввода
Норма

Значение сохраняется после вызова

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

Значение обнуляется — проблема с типом данных

Загрузка таблицы значений
Норма

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

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

Данные есть в отладчике, но форма пуста — не связан элемент таблицы

Повторное открытие формы
Норма

Реквизиты инициализированы заново

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

Остались старые значения — данные хранятся не в форме

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

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

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

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

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

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

Выполните запрос на сервере, получите таблицу через Выгрузить(), затем преобразуйте реквизит формы в таблицу значений методом РеквизитФормыВЗначение(), загрузите данные и верните результат через ЗначениеВРеквизитФормы(). Прямой вызов Загрузить() у реквизита формы недоступен на клиенте.

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

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

Почему реквизит формы теряет значение при серверном вызове?

Чаще всего причина в типе данных, который платформа не может сериализовать для передачи между клиентом и сервером. Проверьте, что реквизит имеет поддерживаемый тип. Также значение может перезаписываться в обработчиках ПриСозданииНаСервере или ПриПовторномОткрытии.

Когда реквизит формы лучше заменить реквизитом объекта?

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

Итог

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

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