Как проверить, является ли объект новым в управляемой форме 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке управляемых форм разработчики 1С часто сталкиваются с ошибкой «Процедура или функция с указанным именем не определена (ЭтоНовый)» или «Метод объекта не обнаружен (ЭтоНовый)». Проанализируем, почему возникают эти ошибки, и рассмотрим правильные способы проверки нового элемента и инициализации его реквизитов.

Причина возникновения ошибки

Выясним причину такого поведения платформы 1С:Предприятие. В модуле управляемой формы основной реквизит Объект имеет тип ДанныеФормыСтруктураДляОбъекта, а не прикладной объектный тип СправочникОбъект или ДокументОбъект.

У типа данных ДанныеФормыСтруктураДляОбъекта отсутствует метод ЭтоНовый(). Функция ЭтоНовый() доступна исключительно у объектных типов платформы на сервере.

Способ 1. Проверка через ссылку в форме (рекомендуется)

Если необходимо проверить в контексте управляемой формы, записан объект в базу данных или нет, разберем самый простой и быстрый способ — проверку заполненности ссылки реквизита Объект:


&НаСервере
Процедура ЗаполнитьРеквизитыНовогоОбъекта()
    Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
        // Объект является новым (еще не записан в базу)
        Объект.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
        Объект.ЕдиницаИзмерения = Справочники.БазовыеЕдиницыИзмерения.НайтиПоНаименованию("шт");
    КонецЕсли;
КонецПроцедуры

Также можно использовать прямую проверку через метод ссылки Пустая():


Если Объект.Ссылка.Пустая() Тогда
    // Действия для нового объекта
КонецЕсли;

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

Способ 2. Инициализация реквизитов в модуле объекта

Рассмотрим лучшую практику разработки под 1С. Если задача заключается в установке значений по умолчанию для нового объекта (например, ставка НДС или базовая единица измерения), логику следует перенести из модуля формы в модуль объекта в событие ОбработкаЗаполнения.


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
    ЕдиницаИзмерения = Справочники.БазовыеЕдиницыИзмерения.НайтиПоНаименованию("шт");
КонецПроцедуры

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

Способ 3. Преобразование реквизита формы в объект

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


&НаСервере
Процедура ПроверитьОбъектНаСервере()
    ТекОбъект = РеквизитФормыВЗначение("Объект");
    Если ТекОбъект.ЭтоНовый() Тогда
        // Объект еще не сохранен в базе данных
    КонецЕсли;
КонецПроцедуры

Обратите внимание: вызов РеквизитФормыВЗначение вызывает накладные расходы на сериализацию данных, поэтому для простой проверки статуса записи объекта рекомендуется использовать проверку Объект.Ссылка.Пустая().

← На главную