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