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