Как передать параметры из обработчика Перед выгрузкой в После загрузки в 1С:Конвертация данных 2.1

Программист IT и автоматизация бизнеса
← На главную

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

В этой статье мы подробно разберем, как использовать механизм параметров для передачи данных «сквозь» файл обмена, проанализируем различия между локальными и глобальными параметрами, и научимся правильно писать программный код для их обработки. При необходимости выполнять такие обмены регулярно по расписанию используется программа для автоматизации обмена данными между базами 1С.

Механизм передачи данных через параметры ПКС

Самый распространенный и правильный способ передачи данных в контексте конкретного объекта — это использование Правил Конвертации Свойств (ПКС) со специальным признаком. Рассмотрим этот процесс пошагово:

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

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

Программная установка значения в источнике

Теперь разберем, как наполнить этот параметр данными перед тем, как они попадут в файл. Проанализируем обработчик ПередВыгрузкой созданного нами ПКС. Именно здесь мы определяем, что именно уедет в приемник. Воспользуемся предопределенной переменной Значение.

Пример кода в обработчике ПередВыгрузкой для ПКС:


// Пример: передаем признак того, что объект был помечен на удаление в источнике особым образом
Если Источник.ПометкаУдаления Тогда
    Значение = "ОбъектУдаленВИсточнике";
Иначе
    Значение = "ОбъектАктивен";
КонецЕсли;

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

Получение данных в базе-приемнике (обработчик После загрузки)

Когда объект попадает в базу-приемник, все переданные параметры ПКС помещаются в специальную структуру ПараметрыОбъекта. Эта структура доступна во многих обработчиках ПКО на стороне загрузки, но чаще всего ее используют в ПослеЗагрузки.

Выясним, как правильно извлечь данные, чтобы не вызвать ошибку при отсутствии ключа в структуре. Рассмотрим следующий пример кода в обработчике ПослеЗагрузки (ПКО):


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

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

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

Использование глобальных параметров конвертации

Если вам нужно передать данные, которые не привязаны к конкретному объекту (например, настройки переноса, дата начала выгрузки или имя пользователя), лучше использовать Глобальные параметры.

Разберем алгоритм работы с ними:

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

В обработчике ПередВыгрузкойДанных (глобальный обработчик конвертации) мы можем установить его значение:


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

При загрузке этот параметр будет доступен во всех обработчиках через ту же структуру Параметры. Например, в ПередЗагрузкойОбъекта любого ПКО можно написать:


// Использование глобального параметра
Если Параметры.ОрганизацияДляВсехДокументов <> Неопределено Тогда
    // Устанавливаем организацию для всех загружаемых документов принудительно
    Объект.Организация = Параметры.ОрганизацияДляВсехДокументов;
КонецЕсли;

Особенности работы с 1С:Предприятие 7.7

Проанализируем ситуацию, когда источником данных выступает старая платформа 7.7. В этом случае механизмы КД 2.1 работают не так прозрачно. Стандартные флаги в интерфейсе могут не сработать автоматически, так как выгрузка в 7.7 часто идет через внешнюю обработку V77Exp.ert.

В этом случае программисты часто прибегают к ручной модификации XML. В обработчике выгрузки объекта в 7.7 можно вручную добавить узел в структуру:


// Пример логики для 7.7 (псевдокод)
УзелПараметра = СоздатьУзел("Параметр");
УзелПараметра.УстановитьАтрибут("Имя", "МойПараметр");
УзелПараметра.Значение = "НужноеЗначение";
УзелОбъекта.ДобавитьПодчиненный(УзелПараметра);

При загрузке в 8.х эти данные придется извлекать из переменной УзелОбъекта, используя методы чтения XML (ЧтениеXML.Прочитать()), так как автоматическое заполнение ПараметрыОбъекта для данных из 7.7 может быть не реализовано в вашей версии правил. Для решения этой проблемы можно использовать готовую обработку для передачи параметров при обмене между 1С 7.7 и 8.x.

Использование параметров для поиска объектов

Посмотрим на еще один продвинутый сценарий. Иногда стандартных полей поиска (Код, Наименование, Уникальный идентификатор) недостаточно. Мы можем передать параметр и использовать его в обработчике Поля поиска. Для решения подобных задач при миграции между похожими базами применяется инструмент переноса данных 1С с сопоставлением по произвольным полям.

Это делается следующим образом: 1. Передаем значение через ПКС как параметр (как описано выше). 2. В обработчике ПКО ПоляПоиска обращаемся к ПараметрыОбъекта. 3. Если соответствие найдено, присваиваем ссылке найденное значение СсылкаНаОбъект.


// Пример в обработчике Поля поиска
Если НомерВариантаПоиска = 1 Тогда
    МойДопКлюч = "";
    Если ПараметрыОбъекта.Свойство("СпецКлючПоиска", МойДопКлюч) Тогда
        СсылкаНаОбъект = Справочники.Номенклатура.НайтиПоРеквизиту("ДополнительныйШтрихкод", МойДопКлюч);
    КонецЕсли;
КонецЕсли;

Таким образом, использование параметров в 1С:Конвертация данных 2.1 — это мощный инструмент, позволяющий обходить ограничения стандартного сопоставления полей и передавать любую метаинформацию между базами данных. Для проверки корректности результата после сложного переноса данных используется автоматическая сверка бухгалтерских и налоговых проводок между базами 1С.

← На главную