Как проверить, является ли документ новым в процедуре ОбработкаПроведения?

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

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

Почему ЭтоНовый() не работает в ОбработкаПроведения()

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

Поскольку документ уже был записан в базу данных до момента начала проведения, для платформы он перестает быть «новым». Следовательно, вызов Объект.ЭтоНовый() внутри ОбработкаПроведения() всегда будет возвращать Ложь, независимо от того, является ли это первое проведение документа или повторное.

Решение через ДополнительныеСвойства

Чтобы передать информацию о том, что документ создается впервые, мы можем воспользоваться коллекцией ДополнительныеСвойства. Эта структура позволяет хранить произвольные данные в рамках одного серверного вызова. Мы можем «запомнить» состояние документа в событии ПередЗаписью() и считать его уже в ОбработкаПроведения().

Разберем пошагово, как реализовать этот механизм:

  1. Перейдем в модуль объекта документа.
  2. В процедуре ПередЗаписью() определим состояние документа и сохраним его в ДополнительныеСвойства.
  3. В процедуре ОбработкаПроведения() считаем значение из этой коллекции и примем решение на основе полученных данных.

Пример реализации кода:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    // Сохраняем признак новизны в дополнительные свойства
    ДополнительныеСвойства.Вставить("ЭтоНовый", ЭтоНовый());
    ДополнительныеСвойства.Вставить("РежимЗаписи", РежимЗаписи);
КонецПроцедуры

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

Альтернативный подход: проверка через Проведен

Иногда нам важно знать не просто «новизну» объекта, а факт того, что документ проводится в первый раз (то есть до этого он был не проведен). Мы можем отследить этот момент, анализируя реквизит Проведен объекта. Если Проведен равно Ложь, а режим записи подразумевает проведение, значит, это первая попытка проведения.


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

Важные рекомендации и нюансы

При работе с ДополнительныеСвойства учитывайте следующие моменты:

Анализируя ситуацию, мы видим, что передача флага через ДополнительныеСвойства является наиболее надежным и стандартным инструментом для решения поставленной задачи. Обязательно тестируйте логику с помощью отладчика, проверяя содержимое структуры ДополнительныеСвойства в момент выполнения процедуры ОбработкаПроведения().

← На главную