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