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