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

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

При разработке правил обмена в конфигурации Конвертация данных 2.1 часто возникает необходимость передать в информационную базу-приемник дополнительную информацию, которой нет в явном виде среди реквизитов загружаемого объекта. Например, при переносе документов из базы 1С:Зарплата и управление персоналом 3 в 1С:Управление производственным предприятием 1.3 требуется передать наименование способа распределения затрат, а затем при загрузке найти соответствующий элемент справочника и заполнить счета и аналитику затрат по подразделению.

Начинающие разработчики часто пытаются получить доступ к переменным ВходящиеДанные или ИсходящиеДанные непосредственно в обработчиках загрузки ПКО (правила конвертации объектов). Однако эти переменные предназначены исключительно для стороны источника. Разберем по шагам, как правильно настроить передачу дополнительных сведений через параметры объекта и как корректно извлечь их на стороне приемника.

Передача произвольных данных через параметры ПКС

Для того чтобы произвольное значение попало из источника в файл выгрузки вместе с конвертируемым объектом, создадим специальное правило конвертации свойств (ПКС) внутри нужного ПКО. Выполним следующие действия:

  1. В выбранном ПКО перейдем на вкладку Правила конвертации свойств и добавим новую строку.
  2. Поля Свойство источника и Свойство приемника оставим пустыми.
  3. Установим флаг Передавать данные в параметр.
  4. В поле Имя параметра для передачи укажем символическое имя, по которому мы будем обращаться к значению на стороне загрузки, например: СпособРаспределенияЗатрат.
  5. Откроем обработчик Перед выгрузкой для этого ПКС и присвоим переменной Значение требуемые данные. Это может быть примитивный тип (строка, число), ссылка, преобразуемая в значение, либо сериализуемая структура.

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


// Вычисляем способ распределения на стороне источника
Если ЗначениеЗаполнено(Источник.СпособОтраженияЗарплатыВБухучете) Тогда
    Значение = Источник.СпособОтраженияЗарплатыВБухучете.Наименование;
Иначе
    Значение = "";
КонецЕсли;

При выгрузке обработка обмена автоматически поместит это значение в блок ПараметрыОбъекта соответствующего XML-узла объекта.

В каком обработчике получать переданные параметры?

Проанализируем доступность контекста в процессе чтения файла в базе-приемнике. Обработчик При загрузке выполняется на самом раннем этапе — в момент чтения узла XML, когда сам объект информационной базы еще не создан или не прочитан, а коллекция переданных свойств еще не сформирована.

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

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

Чтение параметров и заполнение объекта в обработчике «После загрузки»

Рассмотрим подробнее программную реализацию логики заполнения в обработчике После загрузки правила конвертации объекта. Важно учитывать, что если параметры в выгрузке отсутствовали вовсе, переменная ПараметрыОбъекта может принимать значение Неопределено. Поэтому всегда начинаем код с проверки инициализации коллекции.


// Проверяем наличие переданных параметров
Если ПараметрыОбъекта <> Неопределено Тогда

    ИмяСпособа = Неопределено;
    ПараметрыОбъекта.ВProperty("СпособРаспределенияЗатрат", ИмяСпособа);
    
    // Если параметр найден через Соответствие:
    ИмяСпособа = ПараметрыОбъекта["СпособРаспределенияЗатрат"];

    Если ЗначениеЗаполнено(ИмяСпособа) Тогда
        // Выполняем поиск элемента в базе-приемнике
        СсылкаСпособ = Справочники.СпособыРаспределенияЗатрат.НайтиПоНаименованию(ИмяСпособа, Истина);

        Если ЗначениеЗаполнено(СсылкаСпособ) Тогда
            // Заполняем реквизиты объекта или строки табличной части
            Для Каждого СтрТЧ Из Объект.ОтражениеВУчете Цикл
                СтрТЧ.СпособРаспределения = СсылкаСпособ;
                
                // Подбираем статью затрат и счет учета по подразделению
                Если ЗначениеЗаполнено(СтрТЧ.Подразделение) Тогда
                    СтрТЧ.СчетЗатрат = СсылкаСпособ.СчетЗатрат;
                    СтрТЧ.СтатьяЗатрат = СсылкаСпособ.СтатьяЗатрат;
                КонецЕсли;
            КонецЦикла;
        Иначе
            // Фиксируем ошибку и отменяем запись, если соответствие обязательно
            ЗаписьЖурналаРегистрации("Обмен данными", УровеньЖурналаРегистрации.Предупреждение,
                , , "Не найден способ распределения затрат: " + ИмяСпособа);
        КонецЕсли;
    КонецЕсли;

КонецЕсли;

Важные ограничения и нюансы при работе в «После загрузки»

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

  1. Отсутствие ссылки у новых объектов: Если объект создается впервые, его свойство Объект.Ссылка не инициализировано (является пустой ссылкой). Попытка выполнить запись в подчиненные регистры сведений с отбором по ссылке текущего объекта в этом обработчике вызовет исключение. Такие операции следует выносить в обработчик После записи или генерировать ссылку заранее.
  2. Запросы к базе данных: Если вы выполняете запрос к реквизитам загружаемого объекта по его ссылке, запрос вернет состояние данных, хранящееся на диске в базе, а не то, что прочитано из файла обмена. Всегда оперируйте свойствами переменной Объект напрямую.
  3. Отказ от записи: Если при сопоставлении аналитики обнаружены критические ошибки, можно прервать загрузку проблемного документа, установив флаг Отказ = Истина;. В этом случае объект не запишется в базу, а в протокол обмена будет внесено сообщение об ошибке.

Альтернативные подходы к передаче данных

В зависимости от структуры архитектуры обмена можно использовать и другие стандартные механизмы:

  1. Выгрузка по отдельному ПКО: Вместо передачи плоской строки с наименованием можно создать отдельное ПКО для справочника способов распределения затрат. В этом случае поиск элемента по наименованию выполнит сам механизм конвертации по настроенным полям поиска, избавив от ручного вызова НайтиПоНаименованию в коде.
  2. Использование глобальных параметров: Если таблица соответствия подразделений, статей и способов одинакова для всех документов базы, ее не обязательно передавать с каждым отдельным объектом. Такую таблицу можно выгрузить один раз в глобальную коллекцию Параметры на этапе старта выгрузки и обращаться к ней из любого обработчика загрузки.
← На главную