При перегрузке данных между конфигурациями 1С через конфигурацию Конвертация данных 2.1 нередко возникает задача разделения одного документа-источника на несколько документов в базе-приемнике (например, по видам валют в табличной части). В этом случае ключевым вопросом становится правильная синхронизация создаваемых объектов при повторных обменах, чтобы система не плодила дубли и гарантированно обновляла ранее выгруженные документы.
Рассмотрим частые заблуждения, связанные с использованием свойства КлючВыгружаемыхДанных, выясним его истинное назначение и разберем правильные варианты решения этой задачи.
Разберем распространенную ошибку: иногда разработчики пытаются переопределить КлючВыгружаемыхДанных в обработчиках ПКО с целью повлиять на поиск создаваемого документа в приемнике. Однако данный параметр не имеет никакого отношения к поиску или сопоставлению объектов в базе-приемнике.
Свойство КлючВыгружаемыхДанных служит исключительно внутренним идентификатором кэша выгрузки в источнике. Механизм конвертации данных использует его для того, чтобы зафиксировать факт выгрузки конкретного объекта и не выполнять его повторную обработку в рамках одного сеанса выгрузки. Для поиска и сопоставления объектов в базе-приемнике этот ключ не применяется.
Самым простым и быстрым способом сопоставления разделенных документов является настройка полей поиска в ПКО приемника.
Проанализируем порядок действий для данного подхода:
УникальныйИдентификатор снимается или устанавливается свойство Продолжить поиск по полям поиска, если по идентификатору не найден.Дата, Организация, Валюта и Номер (с использованием префиксации при необходимости).ПоляПоиска при необходимости переопределяется стандартная логика, например, организуется поиск с помощью произвольного запроса к базе-приемнику.Рассмотрим пример кода в обработчике ПоляПоиска для точного сопоставления документа по дате и валюте:
Если СвойстваПоиска["ВалютаДокумента"] <> Неопределено Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ Первые 1
| Т.Ссылка КАК Ссылка
|ИЗ
| Документ.ПоступлениеТоваровУслуг КАК Т
|ГДЕ
| Т.Дата = &Дата
| И Т.ВалютаДокумента = &ВалютаДокумента
| И НЕ Т.Проведен";
Запрос.УстановитьПараметр("Дата", СвойстваПоиска["Дата"]);
Запрос.УстановитьПараметр("ВалютаДокумента", СвойстваПоиска["ВалютаДокумента"]);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
СсылкаНаНайденныйОбъект = Выборка.Ссылка;
КонецЕсли;
КонецЕсли;
Синхронизация по реквизитам (номер, дата) может давать сбои, если реквизиты документа изменились в источнике. Чтобы сохранить сопоставление по GUID, применяется вычисление воспроизводимого (детерминированного) уникального идентификатора для каждой пары «Документ + Валюта».
Рассмотрим алгоритм реализации этого метода:
ПослеВыгрузки или ПередВыгрузкой) путем вызова функции ВыгрузитьПоПравилу().Источник передается как Неопределено или в виде структуры с данными табличной части, чтобы платформа не подтягивала GUID исходного документа.ВходящиеДанные.Посмотрим на пример вызова функции выгрузки из табличной части документа-источника:
Для Каждого СтрокаТЧ Из Источник.Содержимое Цикл
ВходящиеДанные = Новый Структура;
ВходящиеДанные.Вставить("Дата", Источник.Дата);
ВходящиеДанные.Вставить("Организация", Источник.Организация);
ВходящиеДанные.Вставить("ВалютаДокумента", СтрокаТЧ.Валюта);
ВходящиеДанные.Вставить("СуммаДокумента", СтрокаТЧ.Сумма);
// Передаем параметр Источник как Неопределено
ВыгрузитьПоПравилу(Неопределено, , ВходящиеДанные, , "ПоступлениеТоваровУслуг");
КонецЦикла;
Важное примечание: При неоднократном вызове метода ВыгрузитьПоПравилу() в рамках одного правила в ПКО обязательно следует взвести флаг Не запоминать выгруженные объекты. В противном случае механизм кэширования Конвертации данных вернет объект из кэша вместо выгрузки нового элемента.