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

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

При настройке обмена данными между конфигурациями (например, при переходе с 1С 8.3 на 1С 7.7 или интеграции различных систем) часто возникает задача, когда логика заполнения реквизита в приемнике зависит от определенных условий в источнике. Типичный пример: в базе-источнике ИНН физического лица и ОКПО организации хранятся в разных реквизитах, а в базе-приемнике предусмотрено только одно универсальное поле. Рассмотрим, как элегантно решить эту задачу с помощью конфигурации «1С:Конвертация данных 2.1» (КД).

Постановка задачи

Предположим, нам необходимо выгрузить справочник Контрагенты. В источнике (1С 8.3) у нас есть перечисление ЮридическаяФормаКлиента. Если клиент является физическим лицом, данные нужно брать из поля ИННФизЛицаДляДоговоров. В противном случае (для юридических лиц) данные берутся из поля ОКПО. В базе-приемнике (1С 7.7) эти данные должны всегда попадать в одно поле — ОКПО.

Способ 1: Использование одного ПКС с обработчиком «Перед выгрузкой»

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

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

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


Если Источник.ЭтоГруппа Тогда
    // Если справочник иерархический, для групп значение обычно не заполняется
    Значение = "";
    // Или можно использовать Отказ = Истина, чтобы свойство вообще не создавалось в XML
    // Отказ = Истина;
Иначе    
    // Проверяем условие юридической формы
    Если Источник.ЮридическаяФормаКлиента = Перечисления.ЮридическиеФормыКлиентов.ФизическоеЛицо Тогда
        Значение = Источник.ИННФизЛицаДляДоговоров;
    Иначе    
        Значение = Источник.ОКПО;
    КонецЕсли; 
КонецЕсли;

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

Обработка групп справочника

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

Способ 2: Использование «Входящих данных»

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

В ПКО (Правила конвертации объекта) в событии «Перед выгрузкой» напишем следующий код:


ВходящиеДанные = Новый Структура;
Если Источник.ЮридическаяФормаКлиента = Перечисления.ЮридическиеФормыКлиентов.ФизическоеЛицо Тогда
    ВходящиеДанные.Вставить("ВычисленныйОКПО", Источник.ИННФизЛицаДляДоговоров);
Иначе
    ВходящиеДанные.Вставить("ВычисленныйОКПО", Источник.ОКПО);
КонецЕсли;

Затем в ПКС для поля ОКПО необходимо:

Нюансы при обмене с 1С 7.7

Посмотрим на специфику платформы 7.7, которая часто накладывает ограничения на данные:

  1. Длина строки: ИНН физического лица в 1С 8.3 обычно имеет длину 12 символов, в то время как поле ОКПО в старых конфигурациях 7.7 может быть ограничено 10 символами. При выгрузке рекомендуется проверять длину и, если необходимо, обрезать строку или выводить предупреждение, чтобы избежать ошибок формата XML при загрузке.
  2. Тип данных: Платформа 7.7 очень чувствительна к типам. Если вы передаете число вместо строки, лучше явно преобразовать его в коде через Строка(Значение) или СокрЛП().
  3. Синхронизация: Если поле ОКПО используется как поле поиска, убедитесь, что алгоритм заполнения работает стабильно. Если для одного и того же контрагента в разных выгрузках алгоритм вернет разные значения, в базе-приемнике могут возникнуть дубли.

Оптимизация производительности

Проанализируем ситуацию с точки зрения скорости работы. Прямое обращение через точку к реквизитам объекта (Источник.ЮридическаяФормаКлиента) в цикле может быть медленным, если выгружается очень большой массив данных (десятки тысяч записей). В таких случаях рекомендуется убедиться, что эти поля включены в выборку запроса при выгрузке. В КД 2.1 это происходит автоматически, если реквизиты указаны в ПКС как источники, но так как в нашем случае источник «пустой», стоит проверить настройки выгрузки запросом, если вы их используете.

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

← На главную