При попытке непосредственного удаления документа комбинацией клавиш Shift+Del или при попытке пометить документ на удаление пользователи и администраторы нередко сталкиваются с сообщением «Нарушение прав доступа». При этом у пользователя может быть назначена типовая роль Полные права или профиль администратора. Выясним причину такого поведения платформы 1С:Предприятие и разберем по шагам, как безопасно и корректно решить эту задачу.
В платформе 1С:Предприятие модель разграничения прав доступа разделяет операции с объектами на несколько независимых действий. Рассмотрим ключевые особенности этой системы:
Удаление (удаление объекта из базы данных программным путем), право Интерактивное удаление (физическое удаление клавишами Shift+Del) и право Интерактивная пометка на удаление — это три совершенно разных права. В подавляющем большинстве типовых конфигураций разработчики сознательно снимают галочку Интерактивное удаление даже у роли Полные права. Это сделано для защиты базы данных от появления «битых» ссылок (объектов с представлением «Объект не найден»), так как непосредственное интерактивное удаление не выполняет контроль ссылочной целостности.ПометкаУдаления на значение Истина с последующей перезаписью объекта в базе. Если на документ наложено ограничение на уровне записей (RLS) или закрыт период редактирования, платформа заблокирует любую попытку изменения, включая установку пометки удаления.Прежде чем менять права или выполнять код, выясним точную причину отказа. Проанализируем события в системе с помощью стандартного журнала регистрации:
Доступ.Отказ в доступе.ИнтерактивноеУдаление, Изменение или сработал запрет по дате запрета изменения).Метод Объект.Удалить() требует наличия стандартного права Удаление, но не требует права Интерактивное удаление. Поэтому у пользователя с полными правами такой метод успешно выполняется, даже если нажатие Shift+Del вызывает ошибку.
Для выполнения программного удаления воспользуемся внешней обработкой, в которой выполним следующий код:
// СсылкаНаДокумент — это прямая ссылка на удаляемый документ
ОбъектДокумента = СсылкаНаДокумент.ПолучитьОбъект();
Если ОбъектДокумента <> Неопределено Тогда
ОбъектДокумента.Удалить();
КонецЕсли;
Если на уровне конфигурации действуют строгие ограничения прав (RLS), мы можем включить привилегированный режим, временно отключающий проверку прав текущего сеанса:
УстановитьПривилегированныйРежим(Истина);
ОбъектДокумента = СсылкаНаДокумент.ПолучитьОбъект();
Если ОбъектДокумента <> Неопределено Тогда
ОбъектДокумента.Удалить();
КонецЕсли;
УстановитьПривилегированныйРежим(Ложь);
Важное предупреждение: прямое физическое удаление объекта из базы данных в обход стандартных проверок не контролирует наличие ссылок на этот документ в проводках, движениях регистров и реквизитах других документов. Прибегать к непосредственному удалению следует только в исключительных ситуациях, когда объект создан ошибочно и гарантированно не связан с другими данными.
Правильным и безопасным способом очистки базы является стандартная двухэтапная схема: установка пометки на удаление с последующим контролем ссылочной целостности.
Если документ не помечается на удаление интерактивно из-за сбоев нумерации или закрытого периода, пометим его программно в привилегированном режиме:
УстановитьПривилегированныйРежим(Истина);
ОбъектДокумента = СсылкаНаДокумент.ПолучитьОбъект();
Если ОбъектДокумента <> Неопределено Тогда
ОбъектДокумента.УстановитьПометкуУдаления(Истина);
КонецЕсли;
УстановитьПривилегированныйРежим(Ложь);
После успешной установки пометки удаление выполняется через штатную обработку:
НайтиПоСсылкам и покажет связанные данные, если они существуют, защитив базу от нарушения ссылочной целостности.Если в самописной конфигурации или на этапе разработки требуется разрешить интерактивное удаление определенным пользователям, выполним настройку прав в конфигураторе:
Интерактивное удаление (а также Интерактивное удаление помеченных).Таким образом, для быстрого устранения ошибки достаточно воспользоваться привилегированным программным удалением или пометить объект на удаление через код, а для постоянной работы — скорректировать права роли или даты запрета изменения данных.