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