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