В чем разница между перепроведением документа и отменой проведения с последующим проведением в 1С

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

При ежедневной работе с базой 1С разработчики и опытные пользователи часто сталкиваются с вопросом: есть ли реальная разница между обычным нажатием кнопки Провести для уже проведенного документа и сценарием, когда документ сначала снимается с проведения (Отменить проведение), а затем проводится заново? На первый взгляд кажется, что конечный результат должен быть идентичен: документ получает статус проведенного, а в регистрах формируются соответствующие записи. Однако с точки зрения платформы 1С:Предприятие и логики типовых прикладных решений эти операции протекают совершенно по-разному. Разберем детально, как ведут себя движения регистров, транзакции и служебные механизмы системы в обоих случаях.

Транзакционность и безопасность данных при ошибках проведения

Рассмотрим ключевое архитектурное различие — поведение транзакций базы данных:

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

Ручные корректировки движений в 1С:Бухгалтерии

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

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

Очистка движений и свойство «Удаление движений»

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

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

При отмене проведения платформа гарантированно удаляет наборы записей по всем движениям, где данный документ выступает регистратором. При обычном перепроведении типовые конфигурации стараются не выполнять лишних операций с базой данных: если новый набор записей полностью идентичен старому, физической перезаписи таблиц СУБД (запросов DELETE и INSERT) не происходит, что экономит ресурсы сервера.

Специфика закрытия месяца, очередей заданий и последовательностей

Выясним причину, почему после отмены проведения документов часто нарушаются регламентные расчеты. В современных конфигурациях (1С:ERP, 1С:Комплексная автоматизация, 1С:Управление торговлей) активно применяются отложенные механизмы закрытия месяца (партионный учет, распределение дополнительных расходов, расчет себестоимости):

  1. Очереди заданий к расчету: при явной отмене проведения документа система безусловно регистрирует необходимость пересчета себестоимости и распределения партий, начиная с даты этого документа вплоть до конца месяца. При обычном перепроведении типовой механизм сравнивает старые и новые движения: если ключевые параметры (номенклатура, количество, стоимость, склады) не изменились, документ не регистрирует лишних заданий на пересчет.
  2. Границы последовательностей: отмена проведения сразу сдвигает границу последовательности документов назад. При перепроведении без изменения данных граница последовательности во многих случаях остается нетронутой.

Особенности в ERP, КА и УТ (таблица «Виды запасов»)

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


// В типовых решениях признак перезаполнения может передаваться через ДополнительныеСвойства:
ДокументОбъект.ДополнительныеСвойства.Вставить("ПерезаполнитьВидыЗапасов", Истина);

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

Конкурентный доступ, синхронизация и СУБД

Разберем дополнительные системные факторы, возникающие при разрыве операции на два этапа:

  1. Конкурентный доступ: в промежутке времени между отменой проведения и нажатием кнопки нового проведения документ не занимает остатков. В этот интервал параллельный фоновый процесс или другой пользователь может занять освободившийся остаток товара, и последующая попытка провести документ завершится неудачей из-за контроля отрицательных остатков.
  2. Планы обмена и РИБ: при обычном проведении фиксация изменений происходит однократно. При разделении операций в таблицы регистрации изменений планов обмена попадает сначала состояние отмены проведения, а затем проведение. Если регламентная выгрузка сработает между ними, в удаленный узел распределенной информационной базы уйдет непроведенный документ, временно нарушив учетную цепочку в филиале.
  3. Нагрузка на журнал транзакций СУБД: связка «отмена — проведение» всегда генерирует сначала команды полного удаления записей по всем регистрам документа (DELETE), а затем повторную вставку (INSERT). Простое перепроведение с оптимизацией записи перезаписывает только измененные строки, существенно снижая фрагментацию индексов и размер журналов транзакций СУБД.

Итоги и рекомендации

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

← На главную