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