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