В практике разработки на платформе 1С:Предприятие часто встречается ситуация: программист создает новую роль, проставляет в ней все возможные «галочки» (права) на конкретный документ, назначает эту роль пользователю, но при попытке программного удаления объекта система выдает ошибку «Недостаточно прав доступа». На первый взгляд ситуация кажется парадоксальной, ведь права даны. Однако механизм проверки прав в 1С гораздо глубже, чем просто проверка одной пометки в конфигураторе.
В этой статье мы подробно разберем, в чем может быть загвоздка, проанализируем влияние стандартных подсистем и выясним, на какие «невидимые» объекты пользователю может не хватать прав при попытке удаления документа.
Прежде всего, давайте разберем фундаментальное различие в правах доступа, которое заложено в платформу. В конфигураторе для каждого объекта (документа) есть несколько видов прав, связанных с уничтожением данных:
Объект.Удалить().Разберем ситуацию: если ваш программный код выполняет физическое удаление через Объект.Удалить(), а у пользователя в роли стоит только «Редактирование» и «Интерактивная пометка удаления», система закономерно выдаст ошибку. Помните, что в типовых конфигурациях право на физическое «Удаление» (без пометки) зачастую есть только у полных прав. Если вам нужно просто пометить объект на удаление, используйте метод Объект.УстановитьПометкуУдаления(Истина).
Проанализируем процесс удаления документа с точки зрения базы данных. Документ в 1С — это не просто запись в одной таблице. Это объект, который почти всегда имеет «движения» в регистрах накопления, регистрах сведений или регистрах бухгалтерии. Также у документа могут быть подчиненные справочники, где он указан владельцем.
Рассмотрим важный нюанс: при удалении документа система автоматически пытается очистить все его движения. Это означает, что в момент удаления документа пользователю необходимы права на изменение и удаление записей во всех регистрах, по которым этот документ делал движения.
Если вы дали полные права на документ РеализацияТоваровУслуг, но забыли дать права на удаление записей в регистре накопления ОстаткиТоваров, то при попытке удалить документ система споткнется на очистке движений и выдаст общую ошибку прав на документ. Проверьте права на все объекты, которые связаны с этим документом метаданными.
В современных конфигурациях (УТ 11, БП 3.0, ERP 2) управление правами доступа осуществляется не только через конфигуратор, но и через программные механизмы БСП. Одной из самых частых причин «сброса» прав является работа подсистемы «Управление доступом».
Разберем, как это работает по шагам:
Правильный подход: никогда не назначайте роли в конфигураторе для типовых баз. Создайте новый Профиль групп доступа в пользовательском режиме, включите в него вашу роль и назначьте этот профиль пользователю. Также убедитесь, что регистры сведений, такие как ПраваРолей, обновились. Иногда требуется запустить обновление параметров системы командой:
ПараметрыСеанса.УстановитьПараметрыОбновления(Истина);
Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника();
Выясним еще одну причину: подписки на события. При удалении документа (как перед удалением, так и при записи с пометкой удаления) могут срабатывать системные или доработанные подписки. Например, подписка ПередУдалением может выполнять код, который:
Если код внутри подписки выполняется от имени текущего пользователя, и у этого пользователя нет прав на какой-то вспомогательный справочник или регистр, к которому обращается подписка, то удаление будет прервано с ошибкой прав. В этом случае ошибка «Недостаточно прав» относится не к самому документу, а к тому действию, которое система пыталась выполнить «под капотом».
Посмотрим на ситуацию со стороны RLS (Row Level Security). Даже если в роли стоит галочка «Удаление», в этой же роли может быть прописано ограничение по условию. Например, пользователю разрешено удалять документы только по организации «Филиал №1».
Если программный код пытается удалить документ, принадлежащий «Головному офису», пользователь получит ошибку прав. При этом визуально в списке пользователь может видеть этот документ (если на «Чтение» RLS не настроен), но любая попытка модификации или удаления будет пресечена платформой на уровне SQL-запроса.
Если бизнес-логика подразумевает, что документ должен быть удален программно вне зависимости от того, есть ли у конкретного пользователя на это права (например, при выполнении какой-то регламентной очистки), лучшим решением будет использование Привилегированного режима.
Рассмотрим пример кода, который позволяет обойти проверку прав:
// Переходим в привилегированный режим, чтобы игнорировать проверку прав
УстановитьПривилегированныйРежим(Истина);
Попытка
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
Если ДокументОбъект <> Неопределено Тогда
// Теперь удаление пройдет успешно, даже если у юзера нет прав на регистры или RLS
ДокументОбъект.Удалить();
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("Ошибка удаления", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
УстановитьПривилегированныйРежим(Ложь);
Важно: Привилегированный режим работает только в коде на стороне сервера (или в привилегированных модулях). Это самый надежный способ диагностировать проблему: если под привилегированным режимом документ удаляется, значит, проблема 100% в правах доступа (роли, RLS или права на регистры). Если же документ не удаляется даже под привилегиями — ищите блокировки базы данных или ошибки в коде обработчиков ПередУдалением.
Подводя итог, если вы столкнулись с невозможностью удаления документа при «полных» правах, рекомендуем следующий алгоритм действий:
Удалить() или УстановитьПометкуУдаления(). Убедитесь, что соответствующее право отмечено в конфигураторе.Соблюдение этих шагов позволит вам быстро найти «слабое звено» в системе прав доступа и обеспечить корректную работу программных алгоритмов удаления объектов.