При настройке регулярного обмена между конфигурациями 1С:Управление торговлей 10.3 и 1С:Бухгалтерия предприятия 3.0 нередко возникает неприятная ситуация: после успешной первой загрузки данных и перехода на рабочий режим синхронизации часть справочника Контрагенты в базе-приемнике (БП 3.0) неожиданно оказывается помеченной на удаление. При этом в базе-источнике (УТ 10.3) эти же контрагенты не имеют пометки на удаление и активно используются в документах.
Разберем детально механизм возникновения этой неполадки, выясним причину такого поведения типовых механизмов обмена и рассмотрим пошаговые способы устранения проблемы.
Проанализируем архитектуру обмена данными между обычными формами (УТ 10.3 на базе планов обмена) и конфигурацией на базе Библиотеки стандартных подсистем (БП 3.0):
УдалениеОбъекта с уникальным идентификатором (GUID). Когда формируется XML-сообщение, в него помещается команда на удаление. Приемник на базе БСП, получив команду удаления объекта, на который уже ссылаются проводки или документы, в целях безопасности не стирает запись физически (что привело бы к появлению «Объект не найден»), а вызывает метод УстановитьПометкуУдаления(Истина).ПометкаУдаления часто настроена напрямую. Если контрагент в базе-источнике попадает в выборку из удаленной папки или ошибочно сопоставлен, флаг синхронно перезаписывает реквизит в базе-приемнике.Выясним причину проблемы, проанализировав данные, которые фактически передает УТ 10.3. Переведем обмен во временный файловый режим и выгрузим данные в файл.
Откроем полученный XML-файл в любом текстовом редакторе и выполним поиск по наименованию или ИНН проблемного контрагента:
<УдалениеОбъекта>, значит, в плане обмена источника зарегистрировано удаление этой ссылки.<СправочникСсылка.Контрагенты>, но внутри присутствует строка <ПометкаУдаления>true</ПометкаУдаления>, значит, реквизит передается напрямую из базы-источника (проверяем группы и дубли).Если проблема вызвана «зависшими» записями удалений в узле обмена, их необходимо удалить из очереди отправки.
Контрагенты.Проанализируем правильность связки идентификаторов в базе-приемнике:
Соответствия объектов информационных баз.Чтобы исключить повторение ситуации при последующих обменах, скорректируем правила конвертации данных:
Контрагенты найдем правило конвертации свойства (ПККС) ПометкаУдаления и установим флаг Не замещать значение у существующих объектов в приемнике. В этом случае существующие в БП элементы не будут помечаться на удаление, даже если из источника поступит такое значение.
Если ТипЗнч(Объект) = Тип("СправочникОбъект.Контрагенты") Тогда
Отказ = Истина;
КонецЕсли;
Если правила обмена вшиты в конфигурацию или обновляются автоматически и их редактирование нежелательно, защитим данные от перезаписи с помощью расширения в БП 3.0 без снятия базы с поддержки.
Создадим расширение и добавим подписку на событие ПередЗаписью для справочника Контрагенты со следующим программным кодом:
Если ОбменДанными.Загрузка И Не Источник.ЭтоНовый() И Источник.ПометкаУдаления Тогда
// Если в базе контрагент не был помечен, блокируем изменение признака удалением из обмена
Если Не Источник.Ссылка.ПометкаУдаления Тогда
Источник.ПометкаУдаления = Ложь;
КонецЕсли;
КонецЕсли;
Рассмотренный подход позволяет полностью исключить случайную пометку контрагентов на удаление при фоновых сеансах синхронизации и сохраняет целостность бухгалтерской базы.