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