При работе с инструментом «1С:Конвертация данных 2.1» (КД 2) разработчики часто сталкиваются со «странным» поведением движка: когда для одного и того же типа объекта метаданных создано несколько правил конвертации (ПКО), система упорно выбирает не то, которое указано в настройках. Особенно ярко это проявляется при выгрузке предопределенных элементов или иерархических справочников, таких как ПрочиеДоходыИРасходы. В данной статье мы разберем причины такого поведения и выработаем архитектурно правильное решение.
Проанализируем механику работы выгрузки. Основная причина «странного» поведения кроется в двух аспектах: порядке следования правил и кэшировании выгруженных объектов.
Родитель. Если в этом ПКС не указано жестко ИмяПКО, то при выгрузке группы (родителя) система снова обратится к механизму выбора правила по умолчанию, что часто приводит к появлению кодов там, где их быть не должно.Создание двух ПКО для одного справочника считается плохим тоном в разработке на КД 2 именно из-за вышеописанных проблем с кэшем. Рассмотрим, как реализовать задачу с помощью одного ПКО и параметров выгрузки.
Шаг 1. Определение параметра. Создадим параметр в объекте «Конвертация», например, ВыгружатьКодСтатьи. Этот параметр мы будем устанавливать в ПВД.
Шаг 2. Настройка ПВД. В правиле выгрузки данных, где код НЕ нужен, в обработчике Перед обработкой или При выгрузке пропишем установку параметра:
Параметры.ВыгружатьКодСтатьи = Ложь;
Шаг 3. Настройка ПКО. В ПКО ПрочиеДоходыИРасходы для свойства Код (ПКС) в обработчике Перед выгрузкой добавим условие:
Если Параметры.ВыгружатьКодСтатьи = Ложь Тогда
Отказ = Истина;
КонецЕсли;
Таким образом, мы используем одно и то же правило, но гибко управляем составом полей. Это исключает конфликты кэширования.
Если мы перестаем выгружать Код, могут возникнуть проблемы с поиском объекта в базе-приемнике. Чтобы избежать дублей, проанализируем ситуацию и настроим обработчик Поля поиска в ПКО на стороне приемника.
Рассмотрим пример кода, который позволяет менять поля поиска «на лету» в зависимости от того, переданы данные или нет:
// Если Код не пришел (мы его отключили в ПКО), ищем только по Наименованию
Если СвойстваПоиска["Код"] = Неопределено Тогда
СтрокаИменСвойствПоиска = "Наименование,ЭтоГруппа";
Иначе
// Если код есть, используем стандартный поиск
СтрокаИменСвойствПоиска = "Код,Наименование";
КонецЕсли;
Этот подход гарантирует, что даже без кода объект будет правильно сопоставлен по наименованию или другим реквизитам.
Если вы все же решили оставить два ПКО, необходимо «ткнуть систему носом» в каждое правило. Рассмотрим, где это нужно сделать.
Во-первых, в каждом ПКС, который ссылается на этот справочник, нужно явно выбрать нужное ПКО в колонке «Правило». Но этого мало. Выясним причину, почему группы (родители) все равно могут выгружаться с кодами. Это происходит из-за рекурсивной выгрузки иерархии.
В ПКО в правиле конвертации свойства Родитель обязательно нужно прописать обработчик Перед выгрузкой:
ИмяПКО = "ПрочиеДоходыИРасходыБезКода"; // Явное указание имени правила
Это заставит движок использовать конкретное правило при выгрузке иерархических связей, игнорируя настройки по умолчанию.
Если ситуация не проясняется, разберем по шагам, как воспользоваться механизмом отладки обработчиков:
Для стабильной работы обмена в КД 2 рекомендуем придерживаться следующих правил:
Поля поиска.Проанализировав ситуацию, можно сделать вывод: поведение КД 2 не «странное», а строго детерминированное. Понимание алгоритмов работы кэша и выбора правил по умолчанию позволяет создавать надежные системы интеграции без использования «костылей».