При разработке логики проведения документов в 1С 7.7 часто возникает необходимость разграничить ситуации, когда документ проводится впервые и когда происходит его повторное перепроведение. Рассмотрим особенности работы платформы 1С версии 7.7 и разберем доступные варианты решения этой задачи.
Выясним, почему стандартная проверка в лоб внутри процедуры ОбработкаПроведения() не даст нужного результата. Дело в том, что в 1С 7.7 перед выполнением процедуры проведения документ всегда автоматически записывается в базу данных. В момент запуска обработчика ОбработкаПроведения() объект уже сохранен, поэтому функция Выбран() внутри модуля документа всегда будет возвращать 1.
Из-за этого платформа не предоставляет встроенного метода, который прямо в момент проведения сообщал бы, был ли документ ранее записан или создан только что. Тем не менее эту задачу можно решить несколькими проверенными способами.
Разберем вариант, когда проведение вызывается из формы документа. Функция Провести() позволяет передавать параметры в предопределенную процедуру ОбработкаПроведения() модуля документа.
В модуле формы мы можем проверить состояние документа с помощью метода Выбран() до момента, пока событие проведения не записало его в базу:
// Код в модуле формы документа
Если Провести(?(Выбран() = 0, 1, 0)) = 1 Тогда
Предупреждение("Документ успешно проведен!");
КонецЕсли;
В модуле документа объявим параметр по умолчанию в сигнатуре процедуры ОбработкаПроведения():
// Код в модуле документа
Процедура ОбработкаПроведения(ПроводимНовый = 0)
Если ПроводимНовый = 1 Тогда
// Логика для нового (первичного) документа
Сообщить("Выполняется первое проведение нового документа.");
Иначе
// Логика при перепроведении или проведении из журнала
Сообщить("Выполняется перепроведение существующего документа.");
КонецЕсли;
КонецПроцедуры
Обратите внимание: данный способ работает отлично при проведении из формы. Однако если документ проводится непосредственно из журнала (без открытия формы), параметр ПроводимНовый примет значение по умолчанию (0).
Если необходимо надежно фиксировать факт того, что документ уже проводился ранее (в том числе при групповом перепроведении или проведении из журналов), проанализируем подход с использованием дополнительного реквизита.
БылПроведен (длина 1, точность 0).1.Посмотрим на пример реализации в модуле документа:
Процедура ОбработкаПроведения()
Если РеквизитШапки("БылПроведен") = 0 Тогда
// Документ проводится впервые
Сообщить("Первое проведение документа");
// Фиксируем флаг проведения
БылПроведен = 1;
Иначе
// Документ проводился ранее
Сообщить("Повторное проведение документа");
КонецЕсли;
КонецПроцедуры
Рассмотри еще один метод, использующий предопределенную процедуру ПриЗаписи() в модуле формы. Процедура ПриЗаписи() вызывается до сохранения объекта в базу, что позволяет определить, является ли объект новым в данный момент.
// Переменная модуля формы
Перем ЭтоНовыйДокумент;
Процедура ПриОткрытии()
ЭтоНовыйДокумент = ?(Выбран() = 0, 1, 0);
КонецПроцедуры
Процедура ПриЗаписи()
Если ЭтоНовыйДокумент = 1 Тогда
// Можно выставить флаг в реквизит или передать контекст
КонецЕсли;
КонецПроцедуры
Выбор конкретного решения зависит от поставленной задачи:
Провести().