При работе в программах 1С администраторы и разработчики нередко сталкиваются с ситуацией: в списках документов или справочников объекты помечены на удаление, однако стандартная обработка удаления помеченных объектов их не находит. При этом внешние обработки или прямые запросы без проблем видят эти элементы. В некоторых случаях стандартный механизм видит только часть документов одного и того же типа. Разберем детально, почему это происходит и как исправить такое поведение системы.
Наиболее распространенная причина — путаница в правах доступа на уровне ролей конфигурации. В платформе 1С:Предприятие предусмотрено два принципиально разных права на удаление данных:
Shift + Delete без какой-либо проверки ссылочной целостности. Это потенциально опасное право, которое обычно отключают для всех ролей.Если для конкретного объекта метаданных у роли пользователя отключено право Интерактивное удаление помеченных, стандартный платформенный метод НайтиПомеченныеНаУдаление() просто пропускает такие объекты и не возвращает их в список. При этом внешние обработки, написанные через прямой запрос к таблице с условием ПометкаУдаления = Истина, видят записи, что и вызывает недоумение.
Разберем, как проверить и исправить настройки прав в конфигураторе:
ПолныеПрава или специализированную роль администратора).Проанализируем ситуацию, когда документы одного вида видны в обработке лишь частично. Такое поведение напрямую указывает на работу механизмов RLS (ограничения прав на уровне записей).
Стандартная обработка удаления выполняет выборку объектов с учетом текущих прав сеанса. Если в системе настроен RLS (например, по организациям, подразделениям или грифам доступа), документы, по которым у пользователя нет полных прав на чтение или изменение, не попадают в результирующую выборку платформенного алгоритма.
Для устранения этой проблемы выполним следующие действия:
В конфигурациях на базе БСП (Библиотеки стандартных подсистем) форма удаления помеченных объектов запоминает настройки, фильтры и ранее выбранные режимы. Если в форме был применен скрытый отбор по типу данных, часть объектов перестанет отображаться.
Разберем по шагам, как очистить кэш и вернуть стандартное поведение формы:
%LOCALAPPDATA%\1C\1Cv8 и %APPDATA%\1C\1Cv8.Посмотрим на пример кода, позволяющего безопасно удалить помеченные элементы с полной проверкой ссылочной целостности на уровне встроенного языка, аналогично штатной платформенной процедуре:
МассивКУдалению = Новый Массив;
Выборка = Документы.РеализацияТоваровУслуг.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.ПометкаУдаления Тогда
МассивКУдалению.Добавить(Выборка.Ссылка);
КонецЕсли;
КонецЦикла;
Если МассивКУдалению.Количество() > 0 Тогда
ТаблицаНеудаленных = Новый ТаблицаЗначений;
// Параметр Проверять = Истина выполняет штатную проверку ссылок
УдалитьОбъекты(МассивКУдалению, Истина, ТаблицаНеудаленных);
Если ТаблицаНеудаленных.Количество() > 0 Тогда
// Имеются связанные объекты, мешающие удалению
Для Каждого Стр Из ТаблицаНеудаленных Цикл
// Обработка заблокированных связей
КонецЦикла;
КонецЕсли;
КонецЕсли;
Метод УдалитьОбъекты() со вторым параметром Истина гарантирует, что система не нарушит целостность базы данных: объекты, на которые есть ссылки в других документах или регистрах, не будут удалены, а информация о них вернется в результирующую таблицу.