Как в 1С 7.7 не перепроводить документ с ручными корректировками при восстановлении границы последовательности?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При ведении учета в платформе «1С:Предприятие 7.7» нередко возникает задача зафиксировать движения конкретного документа (например, когда пользователь вручную отредактировал проводки или записи регистров), чтобы при групповом перепроведении и восстановлении границы последовательности (ГП) эти данные не затирались стандартным алгоритмом проведения. Рассмотрим, почему типовые попытки перехвата события не работают и как правильно настроить логику проведения документа.

Почему не работают стандартные проверки в модуле формы и СтатусВозврата

Проанализируем две распространенные ошибки, с которыми сталкиваются разработчики при попытке защитить движения документа от перезаписи:

  1. Использование предопределенной процедуры ПриЗаписи() модуля формы. При регламентном восстановлении последовательности документов (штатным механизмом через меню «Операции — Проведение документов») платформа не открывает экранные формы. Проведение вызывается напрямую через контекст документа, следовательно, исполняется только модуль документа, а код из модуля формы полностью игнорируется.
  2. Использование СтатусВозврата(0) в процедуре ОбработкаПроведения(). Если в модуле документа прописать отмену проведения через сброс статуса возврата, платформа расценит это как критическую ошибку проведения документа. В результате обработка прервется с ошибкой «Не удалось восстановить ГП», и граница последовательности остановится на этом документе, так и не сдвинувшись вперед.
  3. Автоматическая очистка движений. По умолчанию в свойствах документа в Конфигураторе включен флаг «Автоматическое удаление движений». Это означает, что платформа физически удаляет все записи в регистрах и проводки до передачи управления в процедуру ОбработкаПроведения(). Таким образом, даже если мы просто прервем выполнение кода, документ останется пустым — все его движения уже стерты платформой перед стартом процедуры.

Решение: Отключение автоматического удаления движений и корректный выход из модуля

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

  1. Отключаем автоматическое удаление движений в Конфигураторе. Откроем свойства нужного вида документа и снимем флажок «Автоматическое удаление движений». Теперь платформа перестанет автоматически затирать движения перед вызовом процедуры ОбработкаПроведения().

  2. Корректируем процедуру ОбработкаПроведения() в модуле документа. Теперь нам необходимо самостоятельно управлять очисткой движений. Для документов с признаком ручной корректировки мы просто прерываем процедуру с помощью оператора Возврат без вызова СтатусВозврата(0). Для платформы это означает успешное завершение проведения, и ГП переносится дальше. В обычной же ветке проведения мы принудительно вызываем метод ОчиститьДвижения() перед записью новых наборов данных.

    Посмотрим на пример реализации кода:

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

Важные нюансы и правила при ручном управлении движениями

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

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

Альтернативные способы решения задачи

Рассмотрим альтернативные архитектурные подходы, которые часто применяются на практике:

  1. Собственная обработка сдвига границы последовательности: Если изменять структуру типовых документов нежелательно, разрабатывают собственную обработку восстановления ГП. Она программно обходит последовательность, проверяет наличие ручных корректировок, пропускает вызов метода Провести() для помеченных документов и программно сдвигает границу последовательности вперед с помощью метода Последовательность.ОсновнаяПоследовательность.Установить(Док.ТекущийДокумент()).
  2. Ввод корректировок отдельными документами: Вместо редактирования движений в первичных документах создается отдельный вид документа («Корректировка записей регистров» / «Ручная операция»). Такой документ исключается из состава последовательностей в Конфигураторе, благодаря чему его проведение и изменение не сбрасывают границу последовательности назад.
← На главную