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