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

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

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

Разберем эту распространенную проблему и рассмотрим различные подходы к ее решению, начиная от простых и заканчивая более гибкими программными методами.

Понимание проблемы: Составной тип в источнике, ссылочный в приемнике

Представим ситуацию: в исходной базе данных у нас есть документ или справочник, в котором реквизит, допустим, МестоХранения, может содержать ссылку как на Справочник.Склады, так и на Справочник.Магазины. Это и есть составной тип данных. В то же время, в приемной базе данных соответствующий реквизит ожидает ссылку строго определенного типа, например, только на Справочник.Склады.

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

Решение 1: Явное указание ПКО в Правиле конвертации свойств (ПКС)

Самый простой и прямолинейный способ, если мы точно знаем, что из всех возможных типов составного поля в источнике, в приемнике всегда ожидается один конкретный ссылочный тип. Этот метод был успешно применен автором вопроса.

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

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

Решение 2: Динамическое назначение ПКО через обработчик "Перед выгрузкой"

Если ситуация более сложная, и выбор конкретного ссылочного типа в приемнике зависит от фактического типа данных в источнике, тогда нам потребуется программно определять Правило конвертации объектов. Это наиболее гибкий и часто используемый способ для работы с составными типами, особенно когда требуется конвертировать в разные типы приемника в зависимости от исходного типа.

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

    
    Если ТипЗнч(Источник) = Тип("СправочникСсылка.Склады") Тогда
        ИмяПКО = "Склады"; // Имя вашего ПКО для справочника "Склады"
    ИначеЕсли ТипЗнч(Источник) = Тип("СправочникСсылка.Магазины") Тогда
        ИмяПКО = "Магазины"; // Имя вашего ПКО для справочника "Магазины"
    Иначе
        ИмяПКО = ""; // Оставить пустым или задать ПКО по умолчанию, если тип не подходит
    КонецЕсли;
    
  5. В этом коде мы проверяем фактический тип значения переменной Источник. В зависимости от типа, мы присваиваем переменной ИмяПКО строковое имя соответствующего Правила конвертации объектов. Система КД 2.0 использует значение этой переменной для выбора нужного правила конвертации.
  6. Этот подход позволяет нам гибко управлять процессом конвертации, точно указывая, какое ПКО должно быть использовано для каждого конкретного типа, входящего в составной, обеспечивая корректный перенос данных даже в сложных сценариях.

Дополнительные рекомендации и подходы

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

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

Эффективная работа с составными типами данных в Конвертации Данных 2.0 требует внимательности и понимания логики системы. Применяя описанные подходы, вы сможете успешно настроить даже самые сложные сценарии обмена данными, обеспечивая корректный перенос информации из составных типов в ссылочные, что является залогом успешной интеграции и бесперебойного функционирования информационных систем.

← На главную