Почему при наличии полных прав возникает ошибка нарушения прав доступа при удалении документа в 1С

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

При попытке непосредственного удаления документа комбинацией клавиш Shift+Del или при попытке пометить документ на удаление пользователи и администраторы нередко сталкиваются с сообщением «Нарушение прав доступа». При этом у пользователя может быть назначена типовая роль Полные права или профиль администратора. Выясним причину такого поведения платформы 1С:Предприятие и разберем по шагам, как безопасно и корректно решить эту задачу.

Анализ причин: почему полных прав недостаточно для Shift+Del

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

  1. Разделение прав на удаление. Право Удаление (удаление объекта из базы данных программным путем), право Интерактивное удаление (физическое удаление клавишами Shift+Del) и право Интерактивная пометка на удаление — это три совершенно разных права. В подавляющем большинстве типовых конфигураций разработчики сознательно снимают галочку Интерактивное удаление даже у роли Полные права. Это сделано для защиты базы данных от появления «битых» ссылок (объектов с представлением «Объект не найден»), так как непосредственное интерактивное удаление не выполняет контроль ссылочной целостности.
  2. Зависимость пометки на удаление от права изменения. Пометка на удаление — это не отдельный статус строки списка, а физическое изменение значения системного реквизита ПометкаУдаления на значение Истина с последующей перезаписью объекта в базе. Если на документ наложено ограничение на уровне записей (RLS) или закрыт период редактирования, платформа заблокирует любую попытку изменения, включая установку пометки удаления.
  3. Механизм даты запрета изменения данных. Если дата документа попадает в закрытый период, платформа не позволит перезаписать объект или изменить его номер. В этом случае также может возникать ошибка прав доступа.

Шаг 1. Точная диагностика через журнал регистрации

Прежде чем менять права или выполнять код, выясним точную причину отказа. Проанализируем события в системе с помощью стандартного журнала регистрации:

  1. Откроем Журнал регистрации в режиме «1С:Предприятие» (раздел Администрирование или через меню функций).
  2. Установим отбор по пользователю, выполнявшему действие, и по статусу транзакции: Ошибка или Предупреждение.
  3. Найдем событие с представлением Доступ.Отказ в доступе.
  4. Посмотрим детальное описание события: в поле метаданных и прав платформа четко фиксирует, какого именно права не хватило (например, ИнтерактивноеУдаление, Изменение или сработал запрет по дате запрета изменения).

Шаг 2. Программное удаление объекта

Метод Объект.Удалить() требует наличия стандартного права Удаление, но не требует права Интерактивное удаление. Поэтому у пользователя с полными правами такой метод успешно выполняется, даже если нажатие Shift+Del вызывает ошибку.

Для выполнения программного удаления воспользуемся внешней обработкой, в которой выполним следующий код:


// СсылкаНаДокумент — это прямая ссылка на удаляемый документ
ОбъектДокумента = СсылкаНаДокумент.ПолучитьОбъект();
Если ОбъектДокумента <> Неопределено Тогда
    ОбъектДокумента.Удалить();
КонецЕсли;

Если на уровне конфигурации действуют строгие ограничения прав (RLS), мы можем включить привилегированный режим, временно отключающий проверку прав текущего сеанса:


УстановитьПривилегированныйРежим(Истина);

ОбъектДокумента = СсылкаНаДокумент.ПолучитьОбъект();
Если ОбъектДокумента <> Неопределено Тогда
    ОбъектДокумента.Удалить();
КонецЕсли;

УстановитьПривилегированныйРежим(Ложь);

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

Шаг 3. Корректный регламент: установка пометки и типовое удаление

Правильным и безопасным способом очистки базы является стандартная двухэтапная схема: установка пометки на удаление с последующим контролем ссылочной целостности.

Если документ не помечается на удаление интерактивно из-за сбоев нумерации или закрытого периода, пометим его программно в привилегированном режиме:


УстановитьПривилегированныйРежим(Истина);

ОбъектДокумента = СсылкаНаДокумент.ПолучитьОбъект();
Если ОбъектДокумента <> Неопределено Тогда
    ОбъектДокумента.УстановитьПометкуУдаления(Истина);
КонецЕсли;

УстановитьПривилегированныйРежим(Ложь);

После успешной установки пометки удаление выполняется через штатную обработку:

  1. Перейдем в раздел Администрирование → Обслуживание → Удаление помеченных объектов.
  2. Выберем режим выборочного или полного удаления.
  3. Платформа автоматически проверит ссылки на удаляемый документ функцией НайтиПоСсылкам и покажет связанные данные, если они существуют, защитив базу от нарушения ссылочной целостности.

Шаг 4. Настройка роли в конфигураторе (при необходимости)

Если в самописной конфигурации или на этапе разработки требуется разрешить интерактивное удаление определенным пользователям, выполним настройку прав в конфигураторе:

  1. Откроем дерево метаданных конфигуратора и развернем ветку Общие → Роли.
  2. Выберем целевую роль или создадим новую роль для административных действий.
  3. Найдем в дереве объектов требуемый документ.
  4. В таблице прав установим флаг напротив пункта Интерактивное удаление (а также Интерактивное удаление помеченных).
  5. Обновим конфигурацию базы данных и назначим измененную роль пользователю.

Таким образом, для быстрого устранения ошибки достаточно воспользоваться привилегированным программным удалением или пометить объект на удаление через код, а для постоянной работы — скорректировать права роли или даты запрета изменения данных.

← На главную