Как при синхронизации через универсальный формат обмена переносить контрагентов без замещения существующих?

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

При настройке регулярной синхронизации между конфигурациями 1С (например, при выгрузке из 1С:Управление торговлей в 1С:Бухгалтерию предприятия) часто возникает конфликт мастер-данных. В базе-приемнике карточки контрагентов уже выверены бухгалтерией, содержат актуальные реквизиты и корректные наименования. В то же время из базы-источника поступают новые документы вместе с карточками контрагентов, которые могут быть заполнены менеджерами не полностью или с ошибками. По умолчанию механизм обмена на базе EnterpriseData (Конвертация данных 3.0) безусловно перезаписывает найденные элементы полученными сведениями.

Проанализируем ситуацию: сопоставление объектов в универсальном формате происходит сначала по внутреннему идентификатору из регистра сведений Соответствия объектов информационных баз, а при его отсутствии — по ключевым полям поиска (ИНН и КПП). При успешном сопоставлении алгоритмы БСП перезаписывают реквизиты найденного элемента в информационной базе. Разберем по шагам, как заблокировать перезапись уже существующих контрагентов, сохранив при этом возможность автоматического создания новых элементов и корректную привязку ссылок в документах.

Способ 1. Отмена перезаписи в обработчике события ПКО (КД 3.0)

Рассмотрим основной способ решения задачи, основанный на переопределении логики правила конвертации объекта (ПКО) на стороне базы-приемника. В архитектуре обмена через универсальный формат для каждого объекта предусмотрен обработчик ПередЗаписьюПолученныхДанных.

В данный обработчик передаются параметры ДанныеИБ (найденный в базе существующий объект или ссылка) и ПолученныеДанные (структура или объект с новыми значениями из файла обмена). Если элемент уже найден в базе, мы можем очистить значение ПолученныеДанные. В таком случае система отменит физическую запись карточки в базу, но ссылка на нее будет передана дальше для проведения загружаемых документов.

Посмотрим на пример кода в обработчике ПКО_Справочник_Контрагенты_Получение_ПередЗаписьюПолученныхДанных:


Если НЕ ДанныеИБ = Неопределено Тогда
    ПолученныеДанные = Неопределено;
КонецЕсли;

Выясним причину, почему это работает без ошибок сопоставления: параметр ДанныеИБ заполняется только тогда, когда контрагент уже существует в информационной базе получателя. Если же из базы-источника пришел абсолютно новый партнер, переменная ДанныеИБ останется со значением Неопределено, проверка не сработает, и новый контрагент будет успешно создан и записан в справочник Контрагенты.

Обратите внимание на технические нюансы данного подхода:

  1. Регистрация соответствий: Если контрагент сопоставился по полям поиска (ИНН/КПП), а не по GUID, отмена записи объекта в некоторых версиях БСП может не зафиксировать соответствие в регистре сведений Соответствия объектов информационных баз. Из-за этого при каждом следующем обмене контрагент будет сопоставляться повторным поисковым запросом.
  2. Контактная информация и счета: В типовых конфигурациях контактная информация и банковские счета могут загружаться отдельными правилами конвертации. Если требуется полностью исключить изменение реквизитов партнера, аналогичные условия отмены записи следует предусмотреть и для подчиненных сущностей.

Способ 2. Подключение внешних правил обмена без изменения конфигурации

Разберем, как внедрить доработку правил, если конфигурация-источник является базовой (например, 1С:Управление торговлей Базовая), а конфигурация-приемник — версией ПРОФ. В базовых версиях изменение метаданных и конфигурации невозможно, однако универсальный формат позволяет внедрить скорректированную логику исключительно на стороне базы-получателя.

Для подключения измененных правил обмена КД 3.0 без прямого редактирования типового кода выполним следующие действия:

  1. Выгрузим код модуля универсального обмена во внешнюю обработку.
  2. Внесем изменения в обработчик получения контрагентов в коде обработки.
  3. Подключим полученную внешнюю обработку в настройках синхронизации данных через режим загрузки правил обмена.

Способ 3. Перехват события через расширение конфигурации (БП ПРОФ)

Рассмотрим более современный и удобный вариант для базы 1С:Бухгалтерия ПРОФ — использование механизма расширений. Это позволяет избежать модификации основной конфигурации и сохраняет возможность типового автоматического обновления.

Реализовать защиту от перезаписи через расширение можно двумя путями:

  1. Переопределение менеджера обмена: Подключить аннотацию &Вместо или &После к процедуре обработки полученных данных универсального формата и обнулить ПолученныеДанные для существующих объектов, как показано в Способе 1.
  2. Событие ПередЗаписью самого справочника: В расширении можно перехватить событие ПередЗаписью справочника Контрагенты. Если включен режим ОбменДанными.Загрузка = Истина и объект не является новым (условие НЕ ЭтоНовый()), мы можем восстановить исходные реквизиты объекта из текущей ссылки в базе через вызов ЗаполнитьЗначенияСвойств(). Такой подход гарантирует неизменность проверенной карточки даже в обход модулей обмена.

Способ 4. Мягкое слияние (заполнение только пустых полей)

Вместо жесткой блокировки любой записи проанализируем сценарий «мягкого слияния» данных. Это требуется, когда в бухгалтерской базе карточка контрагента уже заведена, но в ней не заполнены второстепенные реквизиты (например, телефон, электронная почта или КПП), которые присутствуют в базе-источнике.

В обработчике ПередЗаписьюПолученныхДанных мы можем программно проверить заполненность каждого поля в ДанныеИБ. Если реквизит в базе уже содержит значение, оставляем его без изменений. Если же поле пустое, переносим в него значение из структуры ПолученныеДанные. Таким образом, проверенные данные не затираются, а недостающие сведения успешно дополняются.

Способ 5. Административные методы и управление регистрацией изменений

Если внесение доработок в код нежелательно, рассмотрим организационные и типовые системные механизмы платформы 1С:

  1. Управление регистрацией изменений: Контрагенты попадают в пакет обмена только тогда, когда для них зафиксированы изменения. Через стандартную обработку Регистрация изменений для обмена данными на стороне базы-источника можно очистить очередь регистрации изменений по справочнику Контрагенты. При этом документы будут выгружаться, а привязка к контрагентам в базе-приемнике выполнится по существующим ключевым полям без перезаписи их карточек.
  2. Включение версионирования данных: В 1С:Бухгалтерии можно включить версионирование (механизм «История изменений») для справочника контрагентов. В случае нежелательной перезаписи карточки обменом ответственный сотрудник сможет открыть историю версий и в один клик откатить данные к проверенному состоянию.
  3. Назначение единой базы-первоисточника: На организационном уровне наиболее надежным решением является ввод всех новых контрагентов только в базе 1С:Управление торговлей по строгим регламентам с проверкой по сервисам 1С:Контрагент. В этом случае данные между базами перестанут конфликтовать.
← На главную