Как правильно открыть или получить форму справочника из документа в управляемом приложении 1С?

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

При переходе на управляемые формы и разработке в конфигурациях на платформе 1С:Предприятие 8.3 (например, ЗУП 3.1, ERP 2, КА) разработчики часто сталкиваются с трудностями при вызове вспомогательных форм справочников из документов. Попытки использовать устаревшие конструкции обычного приложения приводят к ошибкам контекста или сбоям инициализации формы на сервере. Разберем типичные ошибки, выясним их причины и рассмотрим правильные сценарии работы с формами.

Анализ типичных ошибок при обращении к форме

Рассмотрим две наиболее распространенные ошибки, которые возникают при попытке открыть форму редактирования:

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

Правильное открытие формы с передачей параметров

Согласно стандартам разработки 1С, для управляемого приложения разделение получения формы и ее открытия через ПолучитьФорму() не рекомендуется, так как это порождает избыточные вызовы сервера. Вместо этого следует использовать глобальный метод ОткрытьФорму() на стороне клиента.

Разберем по шагам, как правильно подготовить параметры и открыть форму редактирования (например, форму процента северной надбавки для физического лица):


&НаКлиенте
Процедура ОткрытьФормуНадбавки(Команда)
    
    // 1. Формируем структуру параметров, которые ожидает форма
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("ФизическоеЛицо", Объект.ФизическоеЛицо);
    ПараметрыФормы.Вставить("ПроцентСевернойНадбавки", Объект.ПроцентСевернойНадбавки);
    
    // 2. Настраиваем режим открытия: блокируем окно документа (замена модальности)
    ПараметрыФормы.Вставить("РежимОткрытияОкна", РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
    
    // 3. Создаем оповещение для обработки результата после закрытия формы
    Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияФормыРедактирования", ЭтотОбъект);
    
    // 4. Открываем форму с передачей параметров и владельца
    ОткрытьФорму("Справочник.ФизическиеЛица.Форма.ФормаРедактированияПроцентаСевернойНадбавки",
                 ПараметрыФормы,
                 ЭтотОбъект,
                 ,,,,
                 Оповещение);
                 
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗакрытияФормыРедактирования(РезультатЗакрытия, ДополнительныеПараметры) Экспорт
    
    Если РезультатЗакрытия <> Неопределено Тогда
        // Обрабатываем возвращенные из формы данные
        Объект.ПроцентСевернойНадбавки = РезультатЗакрытия.ПроцентСевернойНадбавки;
    КонецЕсли;
    
КонецПроцедуры

Почему нельзя «получить форму не открывая» для выполнения логики

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

  1. Форма в 1С 8.3 предназначена исключительно для отображения и пользовательского ввода.
  2. При получении формы на сервере уже выполняется процедура ПриСозданииНаСервере, что тратит ресурсы на создание элементов интерфейса.
  3. Если требуется произвести расчет (например, рассчитать шкалу стажа или процент северной надбавки), такой расчет должен быть вынесен в экспортную функцию общего серверного модуля или модуля менеджера справочника, а не находиться внутри модуля формы.

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

← На главную