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