Почему в 1С происходит задвоение движений при проведении документов?

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

Разберем одну из самых неприятных ситуаций в разработке на платформе 1С: когда при проведении документа, например, Отчет о розничных продажах, движения по регистрам накапливаются, а не замещаются. Это приводит к искажению данных, задвоению записей и необходимости ручного перепроведения документов.

В этой статье мы подробно рассмотрим, почему это происходит, как диагностировать причину и какими способами можно гарантированно решить эту проблему.

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

В архитектуре типовых конфигураций 1С, таких как КА 2, ERP или УТ 11, процесс проведения документа строго регламентирован. При начале транзакции проведения платформа должна автоматически очищать старые движения документа по всем регистрам, которые указаны в коллекции Движения объекта. Если этого не происходит, возникает эффект «накопления», когда новые записи просто дописываются к старым.

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

Шаг 1: Диагностика причины

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

  1. Анализ журнала регистрации: Проверьте, нет ли ошибок при записи или блокировок, которые могут приводить к откату части транзакции, оставляя при этом незавершенные записи.
  2. Проверка свойства Записывать: У каждого набора записей в коллекции Движения есть свойство Записывать. Если в коде (например, в подписках на события) это свойство принудительно устанавливается в Ложь, платформа не удалит старые записи.
  3. Конфликт подписок на события: В КА 2 огромное количество подписок на событие ОбработкаПроведения. Если одна из подписок самостоятельно записывает данные в регистр, это может происходить вне рамок основной очистки, вызывая дублирование.

Шаг 2: Способы решения проблемы

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

Принудительная очистка движений в модуле объекта

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

Реализуем это следующим образом:


Процедура ОбработкаПроведения(Отказ, Режим)
    // Принудительно очищаем все движения документа перед записью новых
    Для Каждого НаборЗаписей Из ЭтотОбъект.Движения Цикл
        НаборЗаписей.Очистить();
        НаборЗаписей.Записать();
    КонецЦикла;

    // ... далее идет основной алгоритм проведения документа ...
КонецПроцедуры

Этот подход позволяет избежать «дописывания» строк, так как мы явно очищаем состояние регистра для текущего документа.

Использование метода Прочитать()

Часто ошибкой является вызов Записать() без предварительного считывания текущего состояния набора. Если вы работаете с набором записей программно, обязательно используйте следующую последовательность:


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

Рекомендации по отладке

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

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

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

← На главную