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