При работе с распределенными информационными базами (РИБ) часто возникает вопрос: что произойдет, если удалить элементы справочника в периферийном узле? Передастся ли это удаление в центральную базу (ЦБ) или данные будут перезаписаны и загрузятся обратно? Разберем подробно внутренние механизмы платформы 1С, регистрацию изменений и варианты разрешения коллизий.
Проанализируем, как платформа 1С обрабатывает факт физического удаления данных в узлах распределенной базы. Когда в периферийной базе выполняется непосредственное удаление элемента справочника, платформа создает в таблице регистрации изменений системную запись с типом УдалениеОбъекта, содержащую уникальный идентификатор (GUID) удаленного элемента.
В процессе выгрузки данных формируется сообщение обмена, в которое упаковывается информация об удалении. При чтении такого сообщения в центральной базе платформа находит соответствующий элемент по его идентификатору и выполняет его физическое удаление.
Если же элемент был не удален физически, а лишь помечен на удаление, в узел передается стандартный объект со свойством ПометкаУдаления = Истина.
Рассмотрим ситуации, когда удаленные в подчиненной базе данные не удаляются в ЦБ, а возвращаются обратно при очередном сеансе синхронизации:
ПередУдалением или ПриОтправкеДанныхГлавному) программно очищается регистрация удалений.Выясним, как программно проверить наличие зарегистрированных изменений или системных записей УдалениеОбъекта в очереди обмена с узлом. Для этого воспользуемся методом ПланыОбмена.ВыбратьИзменения():
Выборка = ПланыОбмена.ВыбратьИзменения(УзелОбмена, НомерСообщения);
Пока Выборка.Следующий() Цикл
Данные = Выборка.Получить();
Если ТипЗнч(Данные) = Тип("УдалениеОбъекта") Тогда
Сообщить("Зарегистрировано удаление объекта: " + Строка(Данные.Ссылка));
КонецЕсли;
КонецЦикла;
Если требуется принудительно отменить отправку изменений по конкретному объекту в узел, используем метод ПланыОбмена.УдалитьРегистрациюИзменений():
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, СсылкаНаОбъект);
Разберем по шагам правильную последовательность действий для предотвращения коллизий и появления битых ссылок вида <Объект не найден...>:
УдалениеОбъекта успешно транслируются и физически удаляют элементы во всех подчиненных узлах.