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