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