Как в 1С 7.7 определить, проводится новый документ или перепроводится существующий?

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

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

Особенности платформы 1С 7.7 при проведении документа

Выясним, почему стандартная проверка в лоб внутри процедуры ОбработкаПроведения() не даст нужного результата. Дело в том, что в 1С 7.7 перед выполнением процедуры проведения документ всегда автоматически записывается в базу данных. В момент запуска обработчика ОбработкаПроведения() объект уже сохранен, поэтому функция Выбран() внутри модуля документа всегда будет возвращать 1.

Из-за этого платформа не предоставляет встроенного метода, который прямо в момент проведения сообщал бы, был ли документ ранее записан или создан только что. Тем не менее эту задачу можно решить несколькими проверенными способами.

Решение 1. Передача параметра проведения из формы документа

Разберем вариант, когда проведение вызывается из формы документа. Функция Провести() позволяет передавать параметры в предопределенную процедуру ОбработкаПроведения() модуля документа.

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


// Код в модуле формы документа
Если Провести(?(Выбран() = 0, 1, 0)) = 1 Тогда
    Предупреждение("Документ успешно проведен!");
КонецЕсли;

В модуле документа объявим параметр по умолчанию в сигнатуре процедуры ОбработкаПроведения():


// Код в модуле документа
Процедура ОбработкаПроведения(ПроводимНовый = 0)
    Если ПроводимНовый = 1 Тогда
        // Логика для нового (первичного) документа
        Сообщить("Выполняется первое проведение нового документа.");
    Иначе
        // Логика при перепроведении или проведении из журнала
        Сообщить("Выполняется перепроведение существующего документа.");
    КонецЕсли;
КонецПроцедуры

Обратите внимание: данный способ работает отлично при проведении из формы. Однако если документ проводится непосредственно из журнала (без открытия формы), параметр ПроводимНовый примет значение по умолчанию (0).

Решение 2. Использование реквизита документа

Если необходимо надежно фиксировать факт того, что документ уже проводился ранее (в том числе при групповом перепроведении или проведении из журналов), проанализируем подход с использованием дополнительного реквизита.

  1. Добавим в структуру документа числовой реквизит, например, БылПроведен (длина 1, точность 0).
  2. При первом успешном проведении установим значение этого реквизита в 1.
  3. При повторных вызовах процедуры проверяем состояние этого флага.

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


Процедура ОбработкаПроведения()
    Если РеквизитШапки("БылПроведен") = 0 Тогда
        // Документ проводится впервые
        Сообщить("Первое проведение документа");
        
        // Фиксируем флаг проведения
        БылПроведен = 1;
    Иначе
        // Документ проводился ранее
        Сообщить("Повторное проведение документа");
    КонецЕсли;
КонецПроцедуры

Решение 3. Фиксация статуса в процедуре ПриЗаписи формы

Рассмотри еще один метод, использующий предопределенную процедуру ПриЗаписи() в модуле формы. Процедура ПриЗаписи() вызывается до сохранения объекта в базу, что позволяет определить, является ли объект новым в данный момент.


// Переменная модуля формы
Перем ЭтоНовыйДокумент;

Процедура ПриОткрытии()
    ЭтоНовыйДокумент = ?(Выбран() = 0, 1, 0);
КонецПроцедуры

Процедура ПриЗаписи()
    Если ЭтоНовыйДокумент = 1 Тогда
        // Можно выставить флаг в реквизит или передать контекст
    КонецЕсли;
КонецПроцедуры

Резюме

Выбор конкретного решения зависит от поставленной задачи:

  1. Если нужно разграничить проведение только при работе пользователя в форме — достаточно передать параметр через функцию Провести().
  2. Если необходимо четко знать историю проведения документа при любых сценариях (включая проведение из журналов и обработок) — наиболее надежным является использование реквизита шапки документа.
← На главную