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

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

Основной реквизит формы 1С: назначение, особенности и работа с ним

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

При открытии любой формы в 1С:Предприятие 8.3 платформа создаёт набор реквизитов формы — данных, с которыми работает пользователь. Среди них один выделяется особым статусом: основной реквизит. Именно он определяет, какой объект или список форма редактирует, и управляет поведением стандартных команд — «Записать», «Провести», «Перечитать».

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

Что такое основной реквизит формы

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

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

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

Какие типы данных принимает основной реквизит

Тип основного реквизита зависит от назначения формы. Платформа поддерживает ограниченный набор типов, которые могут быть основными: ДанныеФормыСтруктура на основе прикладного объекта, ДинамическийСписок, а также специализированные типы для отчётов и обработок.

Вид формыИмя основного реквизитаТип
Форма документаОбъектДанныеФормыСтруктура (объект документа)
Форма элемента справочникаОбъектДанныеФормыСтруктура (объект справочника)
Форма спискаСписокДинамическийСписок
Форма записи регистра сведенийЗаписьРегистрСведенийМенеджерЗаписи
Форма отчётаОтчетДанныеФормыСтруктура (объект отчёта)
Произвольная форма обработки—Основного реквизита может не быть

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

Чем основной реквизит управляет в поведении формы

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

Во-вторых, отслеживание модифицированности. Платформа следит за изменениями данных основного реквизита и при попытке закрыть форму с несохранёнными изменениями выдаёт вопрос «Данные были изменены. Сохранить изменения?». Изменения вспомогательных реквизитов формы этот механизм не затрагивают.

В-третьих, передача данных между сервером и клиентом. Основной реквизит автоматически сериализуется при серверных вызовах, а при открытии формы платформа заполняет его из переданного ключа (ссылки на объект). Именно поэтому в форме документа доступен параметр «Ключ», по которому объект читается из базы.

Работа с основным реквизитом в коде

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

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

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

Для динамического списка программно настраивают отбор, параметры запроса и произвольный текст запроса через свойства основного реквизита: Список.ПроизвольныйЗапрос, Список.ТекстЗапроса, Список.Параметры.УстановитьЗначениеПараметра(...).

Как проверить и изменить основной реквизит

Порядок действий
  1. 1
    Откройте форму в конфигураторе и перейдите на закладку «Реквизиты».
  2. 2
    Найдите реквизит, выделенный жирным, — это основной; проверьте его тип в палитре свойств.
  3. 3
    Если основной реквизит отсутствует, а нужен, добавьте реквизит подходящего типа (например, ДинамическийСписок) и установите флаг «Основной реквизит».
  4. 4
    Проверьте, что стандартные команды формы (Записать, Перечитать) связаны с нужным поведением.
  5. 5
    Обновите конфигурацию базы данных и откройте форму в режиме предприятия для проверки.

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

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

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

Команда «Записать» в форме объекта
Норма

Объект сохраняется в базу, ссылка доступна

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

Команда недоступна или ничего не записывает

Закрытие формы после изменений
Норма

Появляется вопрос о сохранении

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

Форма закрывается молча, изменения теряются

Открытие существующего объекта
Норма

Поля формы заполнены данными объекта

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

Форма открывается пустой

Типичные ошибки и ограничения

Типичные ошибки
01
Попытка записать объект через Объект.Записать() в модуле формы — у данных формы нет метода Записать; нужно конвертировать в объект или использовать стандартную команду.
02
Изменение основного реквизита типовой формы вместо добавления собственных — ломается стандартное поведение и обновление конфигурации.
03
Частые вызовы РеквизитФормыВЗначение на каждое изменение поля — резкое падение производительности формы.
04
Ожидание, что динамический список с произвольным запросом сохранит редактирование — такие списки доступны только для чтения.

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

Итог

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

Основной реквизит формы связывает форму с редактируемым объектом или списком, управляет стандартными командами записи и отслеживанием изменений. У формы он один, его тип определяется назначением формы, а программная работа с объектом выполняется через РеквизитФормыВЗначение и ЗначениеВРеквизитФормы.

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

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

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

Как программно узнать, какой реквизит формы основной?

В конфигураторе основной реквизит виден на закладке «Реквизиты» жирным шрифтом. Программно можно перебрать реквизиты формы через метод ПолучитьРеквизиты() и проанализировать их типы — основной обычно имеет тип ДанныеФормыСтруктура на основе прикладного объекта или ДинамическийСписок.

Почему команда «Записать» не сохраняет мой объект?

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

Можно ли изменить основной реквизит типовой формы через расширение?

Нет. Расширения позволяют добавлять собственные реквизиты, элементы и обработчики, но не переопределять основной реквизит заимствованной формы. Для нестандартного поведения добавляйте свои реквизиты и команды.

Зачем нужны РеквизитФормыВЗначение и ЗначениеВРеквизитФормы?

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

Что делать, если динамический список с произвольным запросом не даёт редактировать записи?

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