Почему в РИБ после изменения документа остаются «лишние» записи в регистрах и как это исправить?

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

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

Анализ природы проблемы

В типовом механизме РИБ платформа 1С отслеживает изменения наборов записей регистров. Когда документ перепроводится, набор записей регистра, который формирует документ, должен быть обновлен. Если в результате изменения документа какой-либо регистр перестает содержать записи (набор становится пустым), платформа должна зафиксировать это как операцию удаления данных в узле обмена.

Однако, часто возникают проблемы, когда эта логика нарушается. Основные причины такого поведения:

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

Шаг 1: Проверка механизма регистрации изменений

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

Разберем, как выглядит принудительная очистка набора записей в коде 1С. Чтобы система гарантированно удалила старые движения, мы должны убедиться, что набор записей записан с установленным отбором:


// Пример принудительной регистрации удаления движений
НаборЗаписей = РегистрыНакопления.ВашРегистр.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
// Даже если записей нет, нам нужно выполнить запись набора
НаборЗаписей.Записывать = Истина;
НаборЗаписей.Записать();

Шаг 2: Анализ влияния расширений и доработок

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

Важное замечание: При проверке принадлежности набора записей к конкретной организации или другому объекту, пустые наборы могут игнорироваться. Убедитесь, что логика проверки условий корректно обрабатывает объекты с пустыми наборами.

Шаг 3: Как разрулить ситуацию с обменом

Для исправления ситуации мы можем использовать следующие подходы:

  1. Проверка метода ПриОтправкеДанныхПодчиненному: В модуле плана обмена проанализируйте, попадают ли в текущий пакет данных пустые наборы записей. Если отладчик показывает, что набор отсекается — значит, проблема в условиях отбора, наложенных в расширении.
  2. Принудительная перерегистрация: Если вы столкнулись с системной ошибкой, когда изменения не регистрируются автоматически, вы можете принудительно добавить документ в состав узла обмена после процедуры записи:
    
    // Принудительная регистрация изменений для объекта
    ПланыОбмена.Полный.ЗарегистрироватьИзменения(УзелОбмена, ДокументСсылка);
    
  3. Использование стандартных механизмов КД 3.0: Если вы используете обмен по правилам, проверьте правила регистрации объектов (ПРО). Там можно настроить явную передачу движений для объектов, у которых изменился состав данных.

Практические советы для разработчика

Чтобы избежать подобных проблем в будущем, рекомендуем придерживаться следующих правил:

Таким образом, для устранения «лишних» записей в базе-приемнике необходимо обеспечить, чтобы каждый пустой набор записей, сформированный при перепроведении документа, был корректно зарегистрирован в плане обмена. Если штатная логика этого не делает из-за сторонних доработок, необходимо явно указывать платформе на необходимость записи и передачи пустого набора как команды на удаление старых данных.

← На главную