При ведении учета в платформе «1С:Предприятие 7.7» нередко возникает задача зафиксировать движения конкретного документа (например, когда пользователь вручную отредактировал проводки или записи регистров), чтобы при групповом перепроведении и восстановлении границы последовательности (ГП) эти данные не затирались стандартным алгоритмом проведения. Рассмотрим, почему типовые попытки перехвата события не работают и как правильно настроить логику проведения документа.
Проанализируем две распространенные ошибки, с которыми сталкиваются разработчики при попытке защитить движения документа от перезаписи:
ПриЗаписи() модуля формы. При регламентном восстановлении последовательности документов (штатным механизмом через меню «Операции — Проведение документов») платформа не открывает экранные формы. Проведение вызывается напрямую через контекст документа, следовательно, исполняется только модуль документа, а код из модуля формы полностью игнорируется.СтатусВозврата(0) в процедуре ОбработкаПроведения(). Если в модуле документа прописать отмену проведения через сброс статуса возврата, платформа расценит это как критическую ошибку проведения документа. В результате обработка прервется с ошибкой «Не удалось восстановить ГП», и граница последовательности остановится на этом документе, так и не сдвинувшись вперед.ОбработкаПроведения(). Таким образом, даже если мы просто прервем выполнение кода, документ останется пустым — все его движения уже стерты платформой перед стартом процедуры.Разберем по шагам правильный алгоритм решения задачи, который позволяет сохранить исходные движения документа и при этом успешно продвинуть границу последовательности вперед.
Отключаем автоматическое удаление движений в Конфигураторе. Откроем свойства нужного вида документа и снимем флажок «Автоматическое удаление движений». Теперь платформа перестанет автоматически затирать движения перед вызовом процедуры ОбработкаПроведения().
Корректируем процедуру ОбработкаПроведения() в модуле документа. Теперь нам необходимо самостоятельно управлять очисткой движений. Для документов с признаком ручной корректировки мы просто прерываем процедуру с помощью оператора Возврат без вызова СтатусВозврата(0). Для платформы это означает успешное завершение проведения, и ГП переносится дальше. В обычной же ветке проведения мы принудительно вызываем метод ОчиститьДвижения() перед записью новых наборов данных.
Посмотрим на пример реализации кода:
Процедура ОбработкаПроведения(ВидыДвижений)
// Проверяем флаг ручной корректировки
Если РучнаяКорректировка = 1 Тогда
// Сообщаем в лог или окно сообщений (не используем модальное Предупреждение!)
Сообщить("Документ " + ТекущийДокумент() + " скорректирован вручную. Движения сохранены.");
// Завершаем процедуру штатно, сохраняя старые движения и не прерывая сдвиг ГП
Возврат;
КонецЕсли;
// Для обычных документов обязательно очищаем старые движения вручную
ОчиститьДвижения("Все");
// Далее следует стандартный алгоритм формирования движений и проводок
// ...
КонецПроцедуры
Выясним детали, на которые обязательно нужно обратить внимание при снятии флага автоматической очистки:
ОчиститьДвижения(), при каждом повторном проведении документа остатки и обороты в регистрах будут задваиваться.Предупреждение(), так как при пакетной обработке или регламентном восстановлении последовательности модальное окно заблокирует выполнение фонового или пакетного процесса до нажатия кнопки пользователем. Для оповещения используйте метод Сообщить() или функцию ЗаписьЖурналаРегистрации().Операция, убедитесь, что при обычном перепроведении очищается не только таблица движений по регистрам, но и проводки операции, если они не формируются автоматически конструктором проведения.Рассмотрим альтернативные архитектурные подходы, которые часто применяются на практике:
Провести() для помеченных документов и программно сдвигает границу последовательности вперед с помощью метода Последовательность.ОсновнаяПоследовательность.Установить(Док.ТекущийДокумент()).