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