Как открыть форму внешней обработки при загрузке данных в управляемом приложении 1С 8.3?

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

При переносе правил обмена из «1С:Конвертации данных 2.1» в конфигурации на управляемых формах разработчики часто сталкиваются с ошибкой при попытке открыть форму обработки для сопоставления ненайденных элементов. Код, который штатно отрабатывал в обычном приложении 1С:Предприятия 8.2, в управляемом интерфейсе 8.3 вызывает ошибку: поле объекта не обнаружено либо метод ОткрытьФорму недоступен.

Разберем детально, почему возникает данная ошибка, как устроено исполнение кода при обмене в управляемом приложении и какими способами можно реализовать интерактивное сопоставление данных.

Причина возникновения ошибки в управляемом интерфейсе

В обычном приложении обработка «Универсальный обмен данными в формате XML» выполнялась в контексте клиента. Это позволяло прямо из алгоритмов или обработчиков событий правил (например, ПослеЗагрузкиДанных) обращаться к коллекции подключаемых обработок через ДопОбработки, получать их формы и модально отображать пользователю.

В управляемом приложении 1С:Предприятия 8.3 архитектура кардинально отличается:

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

Посмотрим на пример кода, который вызывает исключение при выполнении на сервере в обработчике ПослеЗагрузкиДанных:


// Данный код вызовет ошибку на сервере в 1С 8.3 УФ
ПараметрыФормы = Новый Структура("СопоставлениеНоменклатуры", ТаблицаНесопоставленных);
ОткрытьФорму("ДопОбработки.ОбработкаСопоставления.ФормаУправляемая", ПараметрыФормы);

Попытка вызвать конструктор ДопОбработки.ОбработкаСопоставления.Создать() также завершится ошибкой «Поле объекта не обнаружено», так как коллекция не инициализирована для интерактивной работы в контексте сервера.

Решение 1: Двухэтапная обработка с возвратом управления на клиент

Рассмотрим основной архитектурный способ решения задачи: разделение серверного процесса загрузки и интерактивного этапа сопоставления на клиенте.

  1. В обработчиках конвертации накапливаем несопоставленные данные в специальной структуре параметров обмена.
  2. По завершении серверной загрузки помещаем накопленную таблицу или массив во временное хранилище.
  3. В клиентском коде формы обмена проверяем наличие несопоставленных позиций и открываем управляемую форму сопоставления.

Разберем реализацию по шагам. Сначала в правилах обмена (обработчик ПослеЗагрузкиДанных) собираем несопоставленные объекты:


// В обработчике ПослеЗагрузкиДанных формируем таблицу
Если Параметры.Свойство("НенайденнаяНоменклатура") И Параметры.НенайденнаяНоменклатура.Количество() > 0 Тогда
    ТаблицаСопоставления = Новый ТаблицаЗначений;
    ТаблицаСопоставления.Колонки.Добавить("GUID", Новый ОписаниеТипов("Строка"));
    ТаблицаСопоставления.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка"));
    ТаблицаСопоставления.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));

    Для Каждого ЭлементСписка Из Параметры.НенайденнаяНоменклатура Цикл
        НоваяСтрока = ТаблицаСопоставления.Добавить();
        НоваяСтрока.GUID = ЭлементСписка.Ключ;
        НоваяСтрока.Код = ЭлементСписка.Значение.Код;
        НоваяСтрока.Наименование = ЭлементСписка.Значение.Наименование;
    КонецЦикла;

    Параметры.Вставить("ТаблицаДляСопоставления", ТаблицаСопоставления);
КонецЕсли;

Далее в форме обработки обмена после вызова серверной процедуры загрузки передаем данные на клиент через временное хранилище:


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

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

Решение 2: Отложенное сопоставление через регистр сведений

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

  1. В конфигурации-приемнике создаем непериодический регистр сведений (например, СоответствияОбъектовИнформационныхБаз или служебный регистр несопоставленных данных).
  2. При возникновении ненайденного объекта во время загрузки записываем входящие реквизиты (GUID источника, наименование, артикул, тип объекта) в этот регистр.
  3. Пользователь в любое удобное время открывает отдельную рабочую обработку сопоставления, видит список ненайденных позиций, связывает их с существующими элементами базы или создает новые.
  4. После выполнения сопоставления запускается обработка перепривязки ссылок в ранее загруженных документах.

Решение 3: Создание объектов в служебной группе с последующим слиянием

Рассмотрим вариант, исключающий необходимость остановки обмена и написания дополнительных интерфейсов:

  1. В правилах конвертации настраиваем автоматическое создание ненайденных позиций номенклатуры в специально выделенную служебную группу справочника (например, _Несопоставленные позиции).
  2. Загрузка документов проходит без ошибок и срывов ссылочной целостности.
  3. Бухгалтер или оператор с помощью типовой обработки Поиск и удаление дублей заменяет автоматически созданные позиции на корректные элементы номенклатуры с автоматическим пересчетом ссылок во всех проведенных документах.
← На главную