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