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

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

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

В этой статье мы подробно разберем, в чем может быть загвоздка, проанализируем влияние стандартных подсистем и выясним, на какие «невидимые» объекты пользователю может не хватать прав при попытке удаления документа.

Различие между правами на «Удаление» и «Интерактивное удаление»

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

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

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

Влияние связанных регистров и подчиненных справочников

Проанализируем процесс удаления документа с точки зрения базы данных. Документ в 1С — это не просто запись в одной таблице. Это объект, который почти всегда имеет «движения» в регистрах накопления, регистрах сведений или регистрах бухгалтерии. Также у документа могут быть подчиненные справочники, где он указан владельцем.

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

Если вы дали полные права на документ РеализацияТоваровУслуг, но забыли дать права на удаление записей в регистре накопления ОстаткиТоваров, то при попытке удалить документ система споткнется на очистке движений и выдаст общую ошибку прав на документ. Проверьте права на все объекты, которые связаны с этим документом метаданными.

Механизмы БСП (Библиотеки стандартных подсистем)

В современных конфигурациях (УТ 11, БП 3.0, ERP 2) управление правами доступа осуществляется не только через конфигуратор, но и через программные механизмы БСП. Одной из самых частых причин «сброса» прав является работа подсистемы «Управление доступом».

Разберем, как это работает по шагам:

  1. Вы добавили роль пользователю напрямую в конфигураторе (в режиме «Конфигуратор»).
  2. В пользовательском режиме (1С:Предприятие) запущен механизм синхронизации прав.
  3. БСП видит, что у пользователя есть роль, которой нет в его «Профиле групп доступа» (настроенном в пользовательском интерфейсе).
  4. Система может либо игнорировать эту роль, либо (в некоторых версиях) возникнет конфликт кэша прав.

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


ПараметрыСеанса.УстановитьПараметрыОбновления(Истина);
Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника();

Подписки на события: скрытые проверки

Выясним еще одну причину: подписки на события. При удалении документа (как перед удалением, так и при записи с пометкой удаления) могут срабатывать системные или доработанные подписки. Например, подписка ПередУдалением может выполнять код, который:

Если код внутри подписки выполняется от имени текущего пользователя, и у этого пользователя нет прав на какой-то вспомогательный справочник или регистр, к которому обращается подписка, то удаление будет прервано с ошибкой прав. В этом случае ошибка «Недостаточно прав» относится не к самому документу, а к тому действию, которое система пыталась выполнить «под капотом».

Ограничения на уровне записей (RLS)

Посмотрим на ситуацию со стороны RLS (Row Level Security). Даже если в роли стоит галочка «Удаление», в этой же роли может быть прописано ограничение по условию. Например, пользователю разрешено удалять документы только по организации «Филиал №1».

Если программный код пытается удалить документ, принадлежащий «Головному офису», пользователь получит ошибку прав. При этом визуально в списке пользователь может видеть этот документ (если на «Чтение» RLS не настроен), но любая попытка модификации или удаления будет пресечена платформой на уровне SQL-запроса.

Как гарантированно решить проблему программного удаления

Если бизнес-логика подразумевает, что документ должен быть удален программно вне зависимости от того, есть ли у конкретного пользователя на это права (например, при выполнении какой-то регламентной очистки), лучшим решением будет использование Привилегированного режима.

Рассмотрим пример кода, который позволяет обойти проверку прав:


// Переходим в привилегированный режим, чтобы игнорировать проверку прав
УстановитьПривилегированныйРежим(Истина);

Попытка
    ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
    Если ДокументОбъект <> Неопределено Тогда
        // Теперь удаление пройдет успешно, даже если у юзера нет прав на регистры или RLS
        ДокументОбъект.Удалить(); 
    КонецЕсли;
Исключение
    ЗаписьЖурналаРегистрации("Ошибка удаления", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;

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

Важно: Привилегированный режим работает только в коде на стороне сервера (или в привилегированных модулях). Это самый надежный способ диагностировать проблему: если под привилегированным режимом документ удаляется, значит, проблема 100% в правах доступа (роли, RLS или права на регистры). Если же документ не удаляется даже под привилегиями — ищите блокировки базы данных или ошибки в коде обработчиков ПередУдалением.

Итоги и рекомендации

Подводя итог, если вы столкнулись с невозможностью удаления документа при «полных» правах, рекомендуем следующий алгоритм действий:

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

Соблюдение этих шагов позволит вам быстро найти «слабое звено» в системе прав доступа и обеспечить корректную работу программных алгоритмов удаления объектов.

← На главную