Можно ли в обработчиках Конвертации данных 2.0 выполнить код на клиенте при загрузке данных

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

При разработке правил обмена в конфигурации «Конвертация данных 2.0» (КД 2.0) нередко возникает задача запросить у пользователя значение перед началом обработки данных. Например, разработчик пытается открыть диалог интерактивного выбора организации прямо в глобальном обработчике конвертации ПередЗагрузкойДанных:


знч = "";
Если ВвестиЗначение(знч, "Выберите организацию", Новый ОписаниеТипов("СправочникСсылка.Организации")) Тогда
    Параметры.выборг = знч;
КонецЕсли;

Однако при выполнении загрузки в управляемом приложении система выдает ошибку о том, что метод ВвестиЗначение() не обнаружен. Выясним, почему этот код завершается аварийно, возможно ли в КД 2.0 явно переключить контекст исполнения &НаКлиенте и какими способами правильно решать подобные задачи.

Почему интерактивный код не работает в обработчиках КД 2.0

Проанализируем архитектуру работы типовой обработки УниверсальныйОбменДаннымиXML, которая отвечает за чтение и запись данных по правилам конвертации:

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

Таким образом, выполнить код с директивой &НаКлиенте внутри правил обмена КД 2.0 невозможно. Рассмотрим практические решения, позволяющие передать нужные параметры или настроить сопоставление данных без вызова клиентских диалогов внутри правил.

Способ 1. Передача значения через параметры конвертации из базы-источника

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

  1. В конфигурации «Конвертация данных» перейдем на вкладку Параметры и создадим новый параметр конвертации (например, ОрганизацияПриемника).
  2. Для параметра укажем правило конвертации объекта (ПКО), по которому он должен транслироваться из источника в приемник (например, ПКО Организация_Организация).
  3. В ПКО настроим сопоставление полей поиска — чаще всего это ИНН и КПП, что позволяет корректно сопоставить элементы даже при несовпадающих уникальных идентификаторах (UUID).
  4. В базе-приемнике в любом обработчике загрузки переданное значение будет доступно через глобальную структуру: ОрганизацияВПриемнике = Параметры.ОрганизацияПриемника;

Способ 2. Сопоставление через промежуточные справочники (Контрагент в Организацию)

Посмотрим на частую ситуацию, когда в исходной базе операция отражена по одной собственной организации, а в принимающей базе ее необходимо повесить на другую организацию холдинга (например, при схеме перевыставления услуг или интеркампани). В базе-источнике целевая организация обычно заведена как элемент справочника Контрагенты.

В этом случае настроим специальное правило конвертации:

  1. Создаем ПКО с объектом-источником СправочникСсылка.Контрагенты и объектом-приемником СправочникСсылка.Организации.
  2. В качестве полей синхронизации настраиваем сопоставление по ИНН и КПП.
  3. В правилах конвертации свойств (ПКС) передаваемого документа указываем это ПКО для реквизита Организация.

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

Способ 3. Передача параметров через управляемую форму-обертку

Если выбор организации обязательно должен происходить интерактивно пользователем непосредственно перед загрузкой файла в базу-приемник, вынесем ввод данных за пределы правил обмена. Создадим собственную внешнюю обработку-обертку или доработаем форму загрузки обработки УниверсальныйОбменДаннымиXML.

Разберем по шагам создание такой формы-обертки:

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

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

При таком подходе внутри правил КД 2.0 (например, в обработчиках ПКС или ПКО документов) мы сразу обращаемся к готовому значению через конструкцию Параметры.выборг. При этом соблюдаются все требования клиент-серверной архитектуры платформы 1С:Предприятие 8.3.

Способ 4. Получение значения на сервере из настроек информационной базы

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


// Считываем значение из константы или настроек пользователя прямо на сервере
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |   Организации.Ссылка КАК Ссылка
    |ИЗ
    |   Справочник.Организации КАК Организации
    |ГДЕ
    |   Организации.ИНН = &ИНН";
Запрос.УстановитьПараметр("ИНН", "7701234567");

Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
    Выборка = Результат.Выбрать();
    Выборка.Следующий();
    Параметры.выборг = Выборка.Ссылка;
КонецЕсли;

Этот способ полностью автономен, исключает человеческий фактор при загрузке и обеспечивает корректную работу обмена как в интерактивном режиме, так и по расписанию в регламентном задании.

← На главную