Почему Конвертация данных 2.0 перезаписывает документы при загрузке и как это исправить?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При настройке обмена данными между конфигурациями платформы 1С с использованием конфигурации «Конвертация данных 2.0» нередко возникает неприятная ситуация: в файле выгрузки присутствуют все выгруженные документы, однако после загрузки в базу-приемник их количество оказывается меньше, а часть существующих объектов оказывается перезаписана другими.

Рассмотрим подробнее реальный пример. При выгрузке документов Ремонтный лист из отраслевого решения (например, 1С:УАТ) в конфигурацию 1С:Бухгалтерия в качестве документов Требование-накладная из 14 исходных документов в приемнике оказалось только 9. При детальном анализе выяснилось, что документы, имеющие одинаковое время создания, просто затирают друг друга в базе-приемнике. Разберем по шагам причины такого поведения платформы и способы устранения подобных коллизий.

Причина коллизии: неполный состав полей поиска

Проанализируем механизм сопоставления объектов в обработке загрузки данных. Когда входящий объект поступает в базу-приемник, правила конвертации объектов (ПКО) определяют, как именно искать существующий элемент в информационной базе:

  1. Если в правиле конвертации активен флаг «Искать по внутреннему идентификатору», система сначала пытается найти объект по уникальному идентификатору (UUID). Если сопоставление по UUID не удалось или отключено, платформа переходит к поиску по полям поиска.
  2. Поиск выполняется строго по тем реквизитам, для которых в ПКО (правиле конвертации объекта) в табличной части свойств взведен флаг «Поиск».
  3. Если для документа включен поиск исключительно по полю Дата, платформа выполняет отбор в информационной базе приемника только по совпадению даты и времени.

В рассматриваемом примере несколько документов имели абсолютно одинаковую дату и время (например, 04.10.2016 08:00:00). Когда загружался первый документ, он успешно создавался и записывался. Однако при чтении второго документа с тем же временем поиск находил только что созданный первый документ и полностью перезаписывал его реквизиты данными второго. В результате из нескольких документов в базе оставался только последний прочитанный.

Решение проблемы: настройка ключевых полей поиска

Выясним причину и исправим состав полей сопоставления в правиле конвертации объекта (ПКО):

  1. Откроем конфигурацию «Конвертация данных 2.0» и перейдем в нужное Правило конвертации объектов (ПКО).
  2. В табличной части «Конвертация свойств» найдем свойство Номер.
  3. Установим флаг в колонке «Поиск» для реквизита Номер в дополнение к уже установленному флагу для реквизита Дата.
  4. Сохраним правила обмена и выгрузим их в XML-файл для дальнейшего использования.

После включения номера в поля поиска сопоставление будет осуществляться по комбинации Номер + Дата, что исключит перезапись документов с одинаковым временем проведения.

Учет организации и периодичности нумерации

Рассмотрим важную особенность типовых конфигураций 1С. Нумерация документов практически всегда является периодической (в пределах года) и ведется раздельно по каждой организации. Если настроить сопоставление только по полям Номер и Дата, то документы разных организаций с одинаковыми номерами за один и тот же день снова перезапишут друг друга.

Чтобы избежать такой ситуации, в состав полей поиска обязательно нужно включать реквизит Организация:

  1. В ПКО найдем свойство Организация.
  2. Взведем для него флаг «Поиск».
  3. Убедимся, что для самого справочника организаций также корректно настроены правила сопоставления (обычно по полям ИНН и КПП).

Тонкая настройка поиска в обработчике «Поля поиска»

Бывают ситуации, когда стандартного платформенного сопоставления недостаточно. Например, когда время документа в источнике и приемнике может отличаться на несколько секунд или когда документы сопоставляются по реквизитам шапки с определенной логикой. Для таких случаев в ПКО предусмотрен предопределенный обработчик «Поля поиска».

Посмотрим на пример использования обработчика для переопределения стандартного поведения через параметр СвойстваПоиска:


// Пример корректировки значений полей поиска перед выполнением платформенного поиска
СвойстваПоиска.Вставить("Организация", СсылкаНаОрганизацию);

Если требуется полностью переопределить алгоритм и выполнить поиск собственным запросом, мы можем использовать следующий шаблон кода в обработчике «Поля поиска»:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |	Док.Ссылка КАК Ссылка
    |ИЗ
    |	Документ.ТребованиеНакладная КАК Док
    |ГДЕ
    |	Док.Номер = &Номер
    |	И Док.Дата МЕЖДУ &НачалоДня И &КонецДня
    |	И Док.Организация = &Организация";

Запрос.УстановитьПараметр("Номер", СвойстваПоиска["Номер"]);
Запрос.УстановитьПараметр("НачалоДня", НачалоДня(СвойстваПоиска["Дата"]));
Запрос.УстановитьПараметр("КонецДня", КонецДня(СвойстваПоиска["Дата"]));
Запрос.УстановитьПараметр("Организация", СвойстваПоиска["Организация"]);

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    СсылкаНаОбъект = Выборка.Ссылка;
    ПрекратитьПоиск = Истина;
КонецЕсли;

Установка переменной ПрекратитьПоиск = Истина сообщает универсальному механизму загрузки, что объект успешно определен (или не должен искаться стандартными методами), и стандартный поиск по совокупности полей выполняться не будет.

Влияние флага «Искать по внутреннему идентификатору»

Разберем еще один нюанс: при трансформации одного типа документа в другой (как в нашем случае — Ремонтный лист превращается в Требование-накладная) поиск по уникальному идентификатору (UUID) может приводить к ошибкам, если идентификаторы объектов источника не совпадают с логикой приемника или один документ источника генерирует несколько документов-приемников.

В таких случаях в настройках ПКО на вкладке «Настройки обработчиков» рекомендуется снять флаг «Искать по внутреннему идентификатору». Это заставит систему всегда ориентироваться исключительно на заданные правила и реквизитный состав поиска.

← На главную