Как использовать параметры в 1С:Конвертация данных 2 (КД 2) и настроить их отображение в обработке выгрузки?

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

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

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

Способ 1. Создание параметра конвертации и настройка диалога

Параметры в КД 2 представляют собой глобальную коллекцию, доступную во всех обработчиках событий через предопределенную переменную Параметры. Чтобы добавить параметр и сделать его доступным для изменения пользователю в обработке выгрузки, выполним следующие шаги:

  1. Откроем правила конвертации в конфигурации Конвертация данных и перейдем на вкладку Параметры (или Параметры конвертации).
  2. Добавим новую строку параметра. Укажем уникальное Имя (например, ЕстьРеквизитВыгрузка) и понятное Наименование для пользователя (например, Выгружать только с признаком «Выгрузка»).
  3. Обязательно выберем Тип данных (в нашем случае Булево). Если тип не указан, обработка выгрузки не сможет корректно построить элемент управления на форме.
  4. Установим флаг Диалог (или Запрашивать в диалоге), чтобы параметр отобразился в табличной части на форме обработки «Универсальный обмен данными в формате XML».
  5. Если параметр нужен только на стороне источника для фильтрации данных, флаг Передавать при выгрузке ставить необязательно. Если же значение параметра требуется и в приемнике (например, организация по умолчанию), этот флаг необходимо включить.
  6. Сохраним правила конвертации в XML-файл.

Теперь обратимся к параметру в обработчике ПКО (Правила конвертации объектов), например, в событии Перед выгрузкой или При выгрузке:


Если Параметры.ЕстьРеквизитВыгрузка Тогда
    // Обработка логики для нетиповой конфигурации с реквизитом
    Если Не Источник.Выгрузка Тогда
        Отказ = Истина;
    КонецЕсли;
Иначе
    // Логика по умолчанию для типовой конфигурации
    Если Не Источник.Проведен Тогда
        Отказ = Истина;
    КонецЕсли;
КонецЕсли;

Для предотвращения исключительных ситуаций, если параметр по какой-то причине не был инициализирован (например, при вызове правил из старых обработок), рекомендуется использовать безопасное чтение через метод Свойство:


ФлагВыгрузки = Ложь;
Параметры.Свойство("ЕстьРеквизитВыгрузка", ФлагВыгрузки);

Если ФлагВыгрузки Тогда
    Если Не Источник.Выгрузка Тогда
        Отказ = Истина;
    КонецЕсли;
КонецЕсли;

Почему параметры не появляются на форме обработки выгрузки?

Если в КД 2 флаг Диалог установлен, но на форме обработки параметры отсутствуют, проанализируем основные причины:

  1. Правила не были перечитаны в обработке. Таблица параметров на форме заполняется только в момент загрузки XML-файла правил. После перезаписи файла правил в обработке необходимо повторно нажать кнопку Прочитать правила обмена (или Загрузить правила).
  2. Не задан тип данных или наименование. Если у параметра в КД 2 отсутствует тип значения, обработка обмена не может определить, какое поле ввода отобразить в таблице, и строка пропускается.
  3. Инициализация в коде вместо диалога. Если значение параметра перезаписывается в глобальном обработчике конвертации После загрузки правил обмена или Перед выгрузкой данных жестким присвоением, пользовательский ввод на форме может быть проигнорирован. Инициализацию значений по умолчанию рекомендуется выполнять через проверку наличия свойства.
  4. Особенности клиента. В некоторых версиях универсальной обработки обмена на управляемых формах таблица параметров обновляется только после полной перезагрузки формы или файла.

Способ 2. Автоматическая проверка реквизита через метаданные (без параметров)

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


// Проверяем существование реквизита в метаданных текущего объекта
РеквизитСуществует = (Источник.Метаданные().Реквизиты.Найти("Выгрузка") <> Неопределено);

Если РеквизитСуществует Тогда
    Если Не Источник.Выгрузка Тогда
        Отказ = Истина;
    КонецЕсли;
КонецЕсли;

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

Программная передача параметров при регламентной выгрузке

Если выгрузка данных выполняется регламентным заданием или через внешний программный код, параметры заполняются в объекте обработки обмена уже после чтения правил:


ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаОбмена.ИмяФайлаПравилОбмена = "C:\Rules\ExchangeRules.xml";
ОбработкаОбмена.ЗагрузитьПравилаОбмена();

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

ОбработкаОбмена.ИмяФайлаДанных = "C:\Exchange\Data.xml";
ОбработкаОбмена.ВыполнитьВыгрузку();
← На главную