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