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