Почему в РИБ не переносится пометка на удаление из периферийной базы и как это исправить?

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

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

Разберем подробнее причинно-следственные связи этой проблемы и проанализируем пошаговый алгоритм её решения.

Причины возникновения проблемы

В платформе 1С:Предприятие для распределенных информационных баз действует базовое правило: главный (центральный) узел имеет абсолютный приоритет над подчиненным узлом при возникновении коллизий.

Рассмотрим, как происходит коллизия версий на техническом уровне:

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

Шаг 1. Проверка файла выгрузки из периферийной базы

Проанализируем сначала, попадает ли информация о пометке удаления в сам файл обмена. Для этого сформируем файл выгрузки в периферийном узле и откроем его в текстовом или XML-редакторе.

Найдем в файле блок с нужным документом по его уникальному идентификатору или номеру. В узле документа должен присутствовать реквизит пометки на удаление:

<DeletionMark>true</DeletionMark>

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

Шаг 2. Снятие регистрации изменений в Центральной базе

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

  1. Откроем центральную базу 1С.
  2. Перейдем в стандартную обработку «Регистрация изменений для обмена» (её можно открыть через меню администратора или обработку обмена данными).
  3. В списке узлов выберем подчиненный узел, с которым возникает проблема.
  4. Найдем в дереве объектов нужный вид документа и откроем список зарегистрированных изменений.
  5. Найдем проблемный документ и выполним команду Снять регистрацию объекта для данного узла.

Шаг 3. Повторная выгрузка и синхронизация

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

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

Диагностика через отладку (для сложных случаев)

Если очистка регистрации не помогла и пометка продолжает сбрасываться, проанализируем поведение системы в процессе загрузки сообщения обмена с помощью отладки.

Для этого в центральной базе установим точку останова в модуле объекта документа или в подписке на событие ПередЗаписью с условием по номеру документа:


Если Источник.Номер = "0000-000123" Тогда
    Отказ = Ложь; // Точка останова
КонецЕсли;

В момент загрузки файла обмена отладчик остановится на указанной строчке. Мы сможем проверить значение свойства Источник.ОбменДанными.Загрузка (оно должно быть равно Истина) и отследить, не срабатывают ли дополнительные алгоритмы или подписки на события, которые могут принудительно менять значение реквизита ПометкаУдаления при записи.

← На главную