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