В практике разработчика 1С часто встречается ситуация: при попытке вызвать метод Удалить() для объекта (например, документа или элемента справочника) система выдает ошибку «Нарушение прав доступа». При этом использование флага ОбменДанными.Загрузка = Истина решает проблему. Давайте подробно разберем, почему так происходит и где искать «собаку», которая мешает штатному удалению данных.
Первым делом проанализируем записи в Журнале регистрации. Часто платформа прямо указывает, какого именно права не хватает. Если в ЖР фигурирует требование права «Администрирование данных», это важный сигнал. Это право требуется не только для изменения структуры базы, но и для очистки некоторых системных таблиц, связанных с объектом.
Одной из самых частых причин являются независимые регистры сведений, где ваш объект выбран в качестве значения измерения, и для этого измерения установлен признак «Ведущее». Рассмотрим механизм: при физическом удалении объекта платформа пытается автоматически очистить записи в таких регистрах. Если у пользователя нет прав на «Удаление» или «Изменение» в этом конкретном регистре, система заблокирует удаление основного объекта.
Проанализируем конфигурацию на наличие таких связей. Даже если стандартный поиск ссылок ничего не находит, ведущее измерение может «держать» объект на уровне СУБД.
Объект может быть зарегистрирован на узлах планов обмена. Даже если мы программно очищаем регистрацию, как в примере ниже, у объекта сохраняется внутренняя связь со служебными таблицами изменений.
Посмотрим на пример кода, который авторы используют для очистки регистрации:
Для Каждого МДПланОбмена Из Метаданные.ПланыОбмена Цикл
Выборка = ПланыОбмена[МДПланОбмена.Имя].Выбрать();
Пока Выборка.Следующий() Цикл
Если НЕ Выборка.ЭтотУзел Тогда
ПланыОбмена.УдалитьРегистрациюИзменений(Выборка.Ссылка, ОбъектДляУдаления.Ссылка);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если после такой очистки ошибка сохраняется, значит, платформа требует право «Администрирование данных» для окончательной подчистки таблиц регистрации в момент вызова Удалить().
В современных версиях платформы 8.3 активно используется механизм «История данных» (Data History). Если для удаляемого типа объекта включено версионирование на уровне платформы, то метод Удалить() инициирует очистку всей истории версий этого объекта. Эта операция зачастую требует повышенных административных привилегий, что и вызывает отказ в доступе для обычного пользователя.
Выясним причину в программном коде. Проанализируем все подписки на события ПередУдалением и ПриУдалении. В «нетленках» или типовых конфигурациях там может быть зашит код, обращающийся к защищенным константам или выполняющий запись в регистры, на которые у текущего пользователя нет прав.
Также проверим настройки RLS (Row Level Security). Ошибка прав может возникать, если условие RLS запрещает чтение связанных данных (например, движений документа), которые платформа должна прочитать перед удалением для обеспечения целостности.
Рассмотрим, что происходит при установке этого флага. Флаг Загрузка = Истина сообщает платформе и конфигурации, что выполняется перенос данных, и большинство проверок (включая многие подписки на события и некоторые проверки прав RLS) следует пропустить. Это «грубый» способ удаления, который обходит системные механизмы контроля целостности, поэтому он срабатывает там, где обычный метод Удалить() пасует.
ПередУдалением.