В чем разница между методом УстановитьПометкуУдаления() и установкой свойства ПометкаУдаления = Истина в 1С?

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

При разработке конфигураций и написании сервисных обработок в платформе 1С:Предприятие 8 начинающие (а иногда и опытные) разработчики задаются вопросом: зачем в объектах существует метод УстановитьПометкуУдаления(), если у объекта есть булево свойство ПометкаУдаления?

На первый взгляд может показаться, что метод просто дублирует присвоение значения реквизиту. Однако на уровне платформы за этим скрываются важные механизмы: автоматическая запись объекта в базу данных, обработка системных событий, снятие проведения документов, очистка движений в регистрах и каскадная работа с подчиненными объектами. Разберем подробно все нюансы и разницу между этими двумя подходами.

1. Автоматическая запись объекта в базу данных

Проанализируем базовое отличие с точки зрения сохранения данных в БД:

При прямом присвоении свойства ПометкаУдаления = Истина значение сбрасывается или устанавливается исключительно в оперативной памяти (в экземпляре объекта). Чтобы изменения сохранились в базе данных, разработчик обязан явно вызвать метод Записать().

Пример прямого присвоения свойства:


// Изменение свойства в оперативной памяти
ДокОбъект.ПометкаУдаления = Истина;

// Обязательный вызов записи в базу данных
ДокОбъект.Записать();

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

Пример использования метода:


// Метод сам установит свойство и запишет объект в БД
ДокОбъект.УстановитьПометкуУдаления(Истина);

2. Отмена проведения документов и очистка движений

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

Если мы попытаемся выполнить прямое присвоение свойства и запись для проведенного документа:


// Ошибка платформы, если документ был проведен!
ДокОбъект.ПометкаУдаления = Истина;
ДокОбъект.Записать(); 

Платформа выбросит исключение с ошибкой: «Документ не может быть одновременно проведен и помечен на удаление». Платформа проверяет логическую целостность данных и не позволяет записать документ с флагами Проведен = Истина и ПометкаУдаления = Истина.

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


ДокОбъект.Проведен = Ложь;
ДокОбъект.ПометкаУдаления = Истина;
ДокОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);

В свою очередь, метод УстановитьПометкуУдаления(Истина) делает все эти действия полностью автоматически:

  1. Платформа проверяет, был ли документ проведен.
  2. Если документ проведен, автоматически инициируется процесс отмены проведения: вызывается событие модуля ОбработкаУдаленияПроведения.
  3. Отменяется активность движений документа во всех регистрах и происходит их очистка.
  4. Документ переводится в непроведенное состояние и записывается с установленному флагу пометки на удаление.

Таким образом, вызов ДокОбъект.УстановитьПометкуУдаления(Истина) гарантирует корректное списание движений и отработку всей бизнес-логики отмены проведения.

3. Каскадная пометка подчиненных объектов (Справочники и ПВХ)

Рассмотрим применение метода для иерархических справочников и подчиненных объектов. Метод УстановитьПометкуУдаления() принимает второй необязательный параметр ВключаяПодчиненные (по умолчанию имеет значение Истина).

Сравним поведение при работе со справочниками:


// Пометит на удаление ТОЛЬКО текущий элемент/группу.
// Подчиненные элементы и группы останутся НЕ помеченными на удаление!
СправочникОбъект.ПометкаУдаления = Истина;
СправочникОбъект.Записать();

При использовании метода с флагом каскадной обработки:


// Пометит текущий элемент, а также ВСЕ подчиненные элементы в иерархии
// и элементы других справочников, для которых данный элемент является владельцем.
СправочникОбъект.УстановитьПометкуУдаления(Истина, Истина);

При снятии пометки удаления (передача первого параметра Ложь) метод УстановитьПометкуУдаления(Ложь, Истина) также рекурсивно снимет пометку со всех подчиненных элементов.

4. Проверка прав доступа

В структуре ролей платформы 1С разграничиваются права на изменение объектов:

При использовании метода УстановитьПометкуУдаления() платформа проверяет специализированные права пользователя. При прямой записи свойства ПометкаУдаления = Истина проверяются права на изменение объекта.

5. Сводное сравнение подходов

Сведем основные различия в наглядный перечень:

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

Когда и какой подход следует использовать?

Стандартная рекомендация: В 95% случаев в прикладном коде конфигурации следует применять метод УстановитьПометкуУдаления(). Это стандартный типовой метод платформы, гарантирующий целостность данных и корректное исполнение бизнес-логики.

Исключения (когда нужно прямое изменение свойства):

← На главную