Почему при обмене между УТ 10.3 и БП 3.0 документы с одинаковыми номерами затирают друг друга за разные годы?

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

При настройке и выполнении обмена данными между конфигурациями «Управление торговлей 10.3» и «Бухгалтерия предприятия 3.0» нередко возникает коллизия: документы нового года (например, №50 и №51 за 2017 год) при загрузке в бухгалтерию перезаписывают собой документы с аналогичными номерами за прошлый год (2016 год). При этом последующая выгрузка документов прошлого года затирает документы текущего года обратно.

Разберем подробнее, почему возникает такое поведение платформы и правил обмена, как устроена логика сопоставления объектов и как исправить эту ошибку.

Причины возникновения проблемы

Проанализируем ситуацию и механизм работы конвертации данных («Конвертация данных 2.0» / механизмы БСП):

  1. Особенность поиска по номеру и дате: При поиске существующего документа в базе-приемнике платформа использует стандартный метод НайтиПоНомеру(Номер, ДатаИнтервала). Если в правилах конвертации объектов (ПКО) задан поиск по номеру и дате, но не включен признак точного совпадения даты, поиск выполняется не по конкретному значению даты, а по всему интервалу периодичности нумерации. В результате документ нового года ошибочно сопоставляется с документом прошлого года.
  2. Подмена GUID при перезаписи: Когда документ 2017 года загружается в первый раз, его уникальный идентификатор (GUID) в базе-приемнике отсутствует. Обработка загрузки переходит ко второму этапу — поиску по полям поиска. Найдя по номеру документ 2016 года, система считает, что объект найден, и просто обновляет его реквизиты (дату, номер, табличную часть). Физический GUID документа 2016 года в базе БП 3.0 при этом не меняется. Теперь документ 2017 года в бухгалтерии физически «живет» под GUID документа 2016 года.
  3. Регистрация соответствий в БСП: После первого ошибочного сопоставления в базе-приемнике создается запись в регистре сведений СоответствияОбъектовИнформационныхБаз. Даже если после этого изменить номер документа в базе-источнике, обмен будет продолжать ориентироваться на уже записанную связку GUID.

Способ 1. Настройка поиска по дате на равенство в правилах обмена

Рассмотрим, как скорректировать правила конвертации в конфигурации «Конвертация данных»:

  1. Откроем правила обмена и найдем необходимое Правило конвертации объектов (ПКО) для проблемного документа.
  2. В таблице Правила конвертации свойств (ПКС) перейдем к реквизиту Дата.
  3. Установим флаг «Поиск по дате на равенство». Это укажет обработчику загрузки искать точное совпадение даты документа, исключая поиск по периодичности номера.
  4. Если в обработчике ПКС «При выгрузке» используется собственный алгоритм, убедимся, что параметр передается в узел выгрузки в явном виде: УстановитьАтрибут(УзелСвойства, "ПоискПоДатеНаРавенство", Истина);
  5. Сохраним и обновим правила обмена в обеих информационных базах.

Способ 2. Очистка ошибочных записей в регистре соответствий

Если сопоставление уже произошло, изменение правил само по себе не разделит уже «склеенные» объекты, так как в базе БП 3.0 зафиксирована связка в служебном регистре. Разберем по шагам, как очистить соответствия:

  1. В базе «Бухгалтерия предприятия 3.0» перейдем в меню «Функции для технического специалиста» (или «Все функции»).
  2. Найдем регистр сведений СоответствияОбъектовИнформационныхБаз.
  3. Найдем и удалим записи, связывающие проблемные документы 2016 и 2017 годов.
  4. Вручную создадим недостающий документ в БП или исправим дату/номер у существующего, после чего выполним повторную синхронизацию.

Способ 3. Переопределение логики поиска в обработчике «Поля поиска»

Если стандартный поиск по полям поиска работает некорректно из-за специфики учета, настроим собственный алгоритм поиска в событии ПКО «Поля поиска» на стороне приемника:

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

Способ 4. Проверка состава полей поиска

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

← На главную