Как происходит удаление данных в подчиненном узле РИБ и могут ли они восстановиться из центральной базы?

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

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

Механизм фиксации и передачи удаления платформой

Проанализируем, как платформа 1С обрабатывает факт физического удаления данных в узлах распределенной базы. Когда в периферийной базе выполняется непосредственное удаление элемента справочника, платформа создает в таблице регистрации изменений системную запись с типом УдалениеОбъекта, содержащую уникальный идентификатор (GUID) удаленного элемента.

В процессе выгрузки данных формируется сообщение обмена, в которое упаковывается информация об удалении. При чтении такого сообщения в центральной базе платформа находит соответствующий элемент по его идентификатору и выполняет его физическое удаление.

Если же элемент был не удален физически, а лишь помечен на удаление, в узел передается стандартный объект со свойством ПометкаУдаления = Истина.

Почему удаленные данные могут восстановиться из Центральной базы

Рассмотрим ситуации, когда удаленные в подчиненной базе данные не удаляются в ЦБ, а возвращаются обратно при очередном сеансе синхронизации:

  1. Коллизия изменений и приоритет главной базы. Если в подчиненном узле элемент был удален, а в центральной базе между обменами этот же элемент был изменен или программно перезаписан, возникает коллизия. По умолчанию механизм разрешения коллизий в платформе и типовых конфигурациях отдает приоритет главной базе. В этом случае удаление игнорируется, а актуальная версия элемента из ЦБ повторно регистрируется к отправке и загружается в периферию.
  2. Отсутствие авторегистрации удалений. Для конкретного справочника в составе плана обмена может быть отключена авторегистрация либо в модулях подписок на события (например, ПередУдалением или ПриОтправкеДанныхГлавному) программно очищается регистрация удалений.
  3. Отказ при загрузке в ЦБ. Если в центральной базе на события удаления назначены обработчики контроля ссылочной целостности, проверки закрытого периода или запрета удаления связанных данных, транзакция загрузки удаления может быть отменена, а объект останется в ЦБ.
  4. Фоновая перерегистрация в ЦБ. Регламентные задания, групповые перепроведения или синхронизации с внешними сервисами в ЦБ могут вызвать фоновую запись объекта, что автоматически зарегистрирует его к отправке в подчиненный узел.

Как проверить регистрацию удаления перед обменом

Выясним, как программно проверить наличие зарегистрированных изменений или системных записей УдалениеОбъекта в очереди обмена с узлом. Для этого воспользуемся методом ПланыОбмена.ВыбратьИзменения():


Выборка = ПланыОбмена.ВыбратьИзменения(УзелОбмена, НомерСообщения);
Пока Выборка.Следующий() Цикл
    Данные = Выборка.Получить();
    Если ТипЗнч(Данные) = Тип("УдалениеОбъекта") Тогда
        Сообщить("Зарегистрировано удаление объекта: " + Строка(Данные.Ссылка));
    КонецЕсли;
КонецЦикла;

Если требуется принудительно отменить отправку изменений по конкретному объекту в узел, используем метод ПланыОбмена.УдалитьРегистрациюИзменений():

ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, СсылкаНаОбъект);

Рекомендованный порядок удаления данных в РИБ

Разберем по шагам правильную последовательность действий для предотвращения коллизий и появления битых ссылок вида <Объект не найден...>:

  1. Устанавливаем пометку на удаление на требуемые элементы в любом из узлов (в подчиненном или центральном).
  2. Выполняем полный цикл обмена данными между всеми узлами РИБ, чтобы статус пометки на удаление распространился по всей сети.
  3. Запускаем типовую обработку Удаление помеченных объектов непосредственно в Центральной базе (ЦБ). Это гарантирует полную проверку ссылочной целостности перед окончательным удалением.
  4. Проводим повторный обмен, в результате которого команды УдалениеОбъекта успешно транслируются и физически удаляют элементы во всех подчиненных узлах.
← На главную