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