Почему при проведении документа свойство Ссылка.Проведен всегда равно Истина?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Часто у разработчиков 1С возникает удивление, когда при анализе логики в обработке проведения они обнаруживают, что свойство Ссылка.Проведен уже содержит значение Истина. Давайте разберемся, почему так происходит, и как правильно реализовать проверку того, что документ переводится из «непроведенного» состояния в «проведенное».

Понимание механизмов работы платформы

Первым делом важно осознать, как работает транзакционный механизм 1С. Когда пользователь нажимает кнопку «Провести», платформа инициирует выполнение кода в рамках одной транзакции СУБД. В этот процесс входят события ПередЗаписью, ПриЗаписи и ОбработкаПроведения.

Чтобы обеспечить целостность данных, система записывает документ в базу еще до начала выполнения процедуры ОбработкаПроведения. Если бы документ не записывался заранее, движения по регистрам не смогли бы корректно сослаться на него как на регистратор. Таким образом, к моменту попадания в ОбработкаПроведения, в базе данных документ уже зафиксирован как проведенный. Если проведение завершается с ошибкой (например, Отказ = Истина), вся транзакция целиком откатывается, и документ возвращается в исходное состояние.

Решение 1: Использование коллекции ДополнительныеСвойства

Если вам необходимо определить в ОбработкаПроведения, был ли документ проведен до текущей операции, самым надежным способом является использование коллекции ДополнительныеСвойства. Мы можем проанализировать состояние документа на этапе ПередЗаписью и передать этот признак дальше по цепочке.

Рассмотрим пример реализации:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    // Проверяем, является ли текущее действие проведением нового или уже проведенного документа
    Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
        ДополнительныеСвойства.Вставить(\"БылПроведен\", Ссылка.Проведен);
    КонецЕсли;
КонецПроцедуры

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    Если ДополнительныеСвойства.Свойство(\"БылПроведен\") И НЕ ДополнительныеСвойства.БылПроведен Тогда
        // Здесь выполняется логика только для первичного проведения
        // Тяжелые проверки и дополнительные расчеты
    КонецЕсли;
КонецПроцедуры

Решение 2: Использование типовых механизмов БСП

Если вы работаете в конфигурации на базе БСП (Библиотека стандартных подсистем), не стоит изобретать велосипед. В типовых решениях уже реализованы механизмы для определения контекста проведения. Это особенно актуально при групповом перепроведении, когда нет необходимости выполнять избыточные проверки для уже проведенных документов.

Воспользуемся примером из типовых конфигураций:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    // Проверка на групповое перепроведение через БСП
    Если ПроведениеСервер.ГрупповоеПерепроведение(ЭтотОбъект) Тогда
        Возврат;
    КонецЕсли;
    
    // Остальная логика заполнения реквизитов и проверки данных
КонецПроцедуры

Рекомендации по реализации логики проведения

Чтобы ваш код был качественным и не нарушал логику платформы, придерживайтесь следующих правил:

Подводя итог, можно сказать, что «неожиданное» поведение платформы является фундаментом надежности системы 1С. Правильное понимание транзакций и использование ДополнительныеСвойства — это лучшие инструменты для решения задачи контроля состояний документа в момент проведения.

← На главную