При настройке двустороннего обмена данными между конфигурациями «Управление торговлей 10.3» (УТ) и «Бухгалтерия предприятия 2.0» (БП) разработчики часто сталкиваются с необходимостью кастомизации типовых правил. Одна из классических задач — корректный перенос цепочки документов продажи. В частности, когда в УТ документ РеализацияТоваровУслуг оформлен на основании документа ЗаказПокупателя, в БП этот заказ должен трансформироваться в СчетНаОплатуПокупателю и автоматически привязаться к соответствующей реализации в качестве документа-основания (реквизит Сделка или аналогичные поля на вкладке «Дополнительно»).
В этой статье мы подробно разберем, как решить эту задачу в специализированной конфигурации «Конвертация данных 2.1» (КД 2.1), устраним типичные ошибки начинающих разработчиков при работе с составными типами данных и выясним, как правильно обновить ранее перенесенные («старые») документы в базах данных.
Для начала проанализируем структуру метаданных обеих конфигураций. Это критически важно для понимания того, какие объекты мы будем связывать в правилах конвертации:
ЗаказПокупателя. При отгрузке товаров создается документ РеализацияТоваровУслуг. В нем присутствует реквизит Сделка, который имеет составной тип данных (включая ДокументСсылка.ЗаказПокупателя, ДокументСсылка.СчетНаОплатуПокупателю, ДокументСсылка.ДоговорКонтрагента и др.).СчетНаОплатуПокупателю. Соответственно, при переносе реализации реквизит Сделка в БП (который также имеет составной тип) должен получить ссылку на соответствующий СчетНаОплатуПокупателю.Следовательно, в Конвертации данных нам необходимо связать источник ЗаказПокупателя с приемником СчетНаОплатуПокупателю. Для этого в правилах обмена (ПКО) создается правило с именем, например, ЗаказПокупателяСчетНаОплатуПокупателю.
Поскольку реквизит Сделка в документе реализации является составным, конфигурация «Конвертация данных 2.1» при выгрузке пытается автоматически определить, по какому именно правилу нужно выгрузить объект, находящийся в этом реквизите. Если для документа-источника ЗаказПокупателя в правилах конвертации объектов (ПКО) создано несколько разных правил (например, одно переносит заказ как счет, другое — как какой-то другой документ, или существуют устаревшие правила), движок конвертации может выбрать не то ПКО. В результате в базе-приемнике реквизит Сделка окажется либо пустым, либо заполненным некорректно, либо мы получим «битую» ссылку (Объект не найден).
Для того чтобы гарантировать использование нужного правила конвертации, применяется принудительное указание имени ПКО в обработчиках событий КД.
Рассмотрим по шагам, как настроить правила конвертации свойств (ПКС) для реквизита Сделка в документе РеализацияТоваровУслуг.
Откроем нашу настройку правил в конфигурации «Конвертация данных 2.1». Найдем правило конвертации объектов (ПКО) для документа реализации: РеализацияТоваровУслуг (обычно оно называется так же или аналогично в зависимости от префиксов вашей настройки). Перейдем на вкладку «Конвертация свойств» и найдем в списке реквизит «Сделка» (или иной реквизит, отвечающий за документ-основание).
Обратите внимание на колонку «Правило конвертации» для этого свойства. Если там просто указано ПКО по умолчанию, это может приводить к ошибкам из-за составного типа. Нам необходимо вмешаться в процесс выгрузки программно.
Двойным кликом откроем настройки свойства Сделка. Перейдем к обработчикам событий этого свойства и найдем обработчик «Перед выгрузкой». Именно здесь мы должны написать алгоритм, который проверит тип значения в источнике и жестко укажет имя правила для выгрузки.
Проанализируем типичную ошибку начинающих специалистов. Часто в коде пытаются проверить тип значения приемника или путают имена объектов. Например, пишут так:
// ОШИБОЧНЫЙ КОД! Не используйте его!
Если ТипЗнч(Источник.Сделка) <> Тип("ДокументСсылка.СчетНаОплатуПокупателю") Тогда
Отказ = Истина;
Иначе
ИмяPKO = "ЗаказПокупателяСчетНаОплатуПокупателю";
КонецЕсли;
Выясним причину ошибки: На этапе выгрузки данных из базы-источника (УТ 10.3) у нас еще нет объектов БП. База УТ ничего не знает о типе данных ДокументСсылка.СчетНаОплатуПокупателю, такого типа в ней просто не существует! Проверка типа всегда должна выполняться по метаданным источника.
Посмотрим на правильный, корректный вариант кода, который необходимо вставить в обработчик «Перед выгрузкой» свойства Сделка:
// Корректный код для обработчика "Перед выгрузкой" ПКС "Сделка"
Если ЗначениеЗаполнено(Источник.Сделка) Тогда
// Проверяем, что сделка в УТ 10.3 — это именно Заказ покупателя
Если ТипЗнч(Источник.Сделка) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда
// Принудительно назначаем ПКО, преобразующее Заказ в Счет на оплату
ИмяПКО = "ЗаказПокупателяСчетНаОплатуПокупателю";
Иначе
// Если сделка заполнена другим типом (например, договором),
// и для него нет отдельной логики, можно отменить выгрузку конкретно этого свойства
// или позволить КД определить ПКО автоматически
// Отказ = Истина; // Раскомментировать при необходимости жесткой фильтрации
КонецЕсли;
КонецЕсли;
Этот код гарантирует, что если в реализации в УТ указан заказ покупателя, КД 2.1 применит именно правило ЗаказПокупателяСчетНаОплатуПокупателю для его конвертации.
После сохранения правил и загрузки их в узлы обмена вы можете заметить, что у вновь создаваемых документов связь устанавливается корректно, а у документов за прошлые периоды — нет. Разберем по шагам, почему так происходит и как исправить ситуацию.
Важное теоретическое замечание: Любые изменения в XML-файлах правил обмена начинают работать только в момент непосредственной выгрузки данных. Если документы были изменены или созданы до загрузки новых правил, они не выгрузятся повторно автоматически, пока программа не получит сигнал о том, что эти объекты были изменены.
Для обновления связей в старых документах нам нужно зарегистрировать их к обмену заново.
Проанализируем алгоритм ручной регистрации объектов в УТ 10.3:
РегистрацияИзмененийДляОбмена.epf через Файл — Открыть).Реализация товаров и услуг.Заказ покупателя за тот же самый период.Если в вашей настройке плана обмена включена авторегистрация объектов при записи, мы можем пойти другим путем:
Реализация товаров и услуг.Рассмотрим еще несколько неочевидных проблем, с которыми вы можете столкнуться при доработке этого обмена:
«Выгружать заказы покупателей как счета на оплату». Если этот флаг снят, то даже корректно написанные правила в КД могут игнорироваться глобальным фильтром выгрузки на стороне конфигурации.ЗаказПокупателяСчетНаОплатуПокупателю в КД 2.1. Если сопоставление идет только по GUID, а документы создавались в двух базах независимо — дубли неизбежны. Рекомендуем настроить поля поиска по Номеру и Дате документа в случае ненадежности GUID-идентификации.Мы подробно разобрали весь процесс модификации правил обмена, написания обработчиков и пост-обработки данных. Применяйте эти знания на практике, и ваши интеграции будут работать стабильно и предсказуемо!