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