При разработке правил обмена данными, особенно в задачах свертки остатков или переноса документов с условиями, программисты часто сталкиваются с необходимостью изменить правило конвертации (ПКО) «на лету». Типичный пример: если документ создан до даты свертки, мы хотим выгрузить его как «пустышку» (например, «Документ расчетов с контрагентом»), а если после — как полноценный документ. Однако стандартное изменение переменной ИмяПКО в обработчиках не всегда срабатывает корректно, особенно когда объект выгружается по ссылке. Разберем подробно, почему так происходит и как правильно решить эту задачу.
Проанализируем внутреннюю логику работы универсальной обработки обмена. В обработчике «Перед выгрузкой» объекта (ПКО) доступны две ключевые переменные: ИмяПКО (строка с именем правила) и ПКО (ссылка на сам объект правила из таблицы правил). К моменту запуска этого обработчика система уже определила правило выгрузки и поместила ссылку на него в переменную ПКО.
Если мы просто напишем ИмяПКО = "НовоеПравило";, алгоритм выгрузки продолжит использовать старое правило, которое уже закешировано в переменной ПКО. Именно поэтому при выгрузке документов по ссылке часто возникают ситуации, когда условие вроде бы написано, но объект все равно уходит по старому ПКО.
Это самый эффективный метод, если вы хотите управлять логикой внутри самого правила. Нам необходимо не только указать новое имя, но и программно найти соответствующий объект правила в таблице правил конвертации. Рассмотрим пример кода, который нужно разместить в обработчике «Перед выгрузкой» ПКО:
Если Источник.Дата > Параметры.ДатаСвертки Тогда
// Оставляем текущее правило или переключаем на другое
ИмяПКО = "ПередачаМатериаловВЭксплуатациюДок";
ПКО = НайтиПравило(Источник, ИмяПКО);
Иначе
// Переключаем на правило для исторических данных
ИмяПКО = "ПередачаМатериаловВЭксплуатацию";
ПКО = НайтиПравило(Источник, ИмяПКО);
КонецЕсли;
Важный нюанс: функцию НайтиПравило(Источник, ИмяПКО) следует вызывать осторожно. При огромных объемах данных постоянный поиск правила в таблице может замедлить процесс обмена. Однако для большинства задач переноса это наиболее рабочий и стабильный вариант.
Рассмотрим ситуацию, когда объект выгружается как свойство другого объекта (по ссылке). Проанализируем, где лучше подменить правило в этом случае. Если мы знаем заранее, что конкретное свойство (например, «ДокументОснование») должно выгружаться по особому правилу в зависимости от условий, лучше использовать обработчик «Перед выгрузкой» ПКС.
В контексте ПКС замена правила выглядит «чище», так как здесь достаточно просто изменить строку:
Если ТипЗнч(Значение) = Тип("ДокументСсылка.ПередачаМатериаловВЭксплуатацию") Тогда
Если Значение.Дата <= Параметры.ДатаСвертки Тогда
ИмяПКО = "ДокументРасчетовСКонтрагентом";
КонецЕсли;
КонецЕсли;
В этом обработчике система еще не успела зафиксировать объект ПКО, поэтому простое изменение ИмяПКО сработает автоматически сразу после выхода из обработчика свойства.
Выясним, как поступить, если условия подмены слишком сложные. Мы можем полностью отменить стандартную выгрузку и запустить ее вручную. Это делается в обработчике «Перед выгрузкой» ПКО:
Если Источник.Дата <= Параметры.ДатаСвертки Тогда
// Отменяем стандартную выгрузку текущего объекта
Отказ = Истина;
// Выгружаем этот же объект, но по другому правилу
ВыгрузитьПоПравилу(Источник, , , , "ПередачаМатериаловВЭксплуатацию");
КонецЕсли;
Внимание: при использовании этого метода нужно быть крайне аккуратным, чтобы не создать бесконечную рекурсию (когда правило А вызывает правило Б, а правило Б снова вызывает А).
Проанализируем техническую «подставу», о которой часто забывают. Некоторые параметры ПКО считываются движком конвертации до выполнения обработчика «Перед выгрузкой». К ним относятся:
Если ваше исходное правило имеет одни настройки поиска, а целевое (на которое вы подменили) — другие, могут возникнуть коллизии. Система может применить логику поиска от старого правила к данным, выгруженным по новому. Если вам критично использование разных полей поиска, лучше использовать Способ 3 (через ВыгрузитьПоПравилу и Отказ = Истина).
Разберем ситуацию со сверткой на примере документов «Передача материалов в эксплуатацию». Выясним причину, по которой иногда документы лучше оставлять как есть. Если вы конвертируете старые документы в «Документ расчетов (ручной учет)», вы можете потерять связь с движениями в регистре, которые необходимы для корректного погашения стоимости при закрытии месяца в базе-приемнике. Поэтому:
ПКО на универсальный технический документ.ДатаСвертки через Параметры конвертации, чтобы не «хардкодить» даты в коде правил.Подводя итог: для надежной замены правила при выгрузке ссылок используйте связку ИмяПКО = ... и ПКО = НайтиПравило(...) в обработчике объекта, либо управляйте ИмяПКО на уровне свойств (ПКС). Это обеспечит предсказуемость результата и корректность структуры XML-файла обмена.