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

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

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

Причина 1: Разница между правами «Интерактивное удаление» и «Интерактивное удаление помеченных»

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

  1. Интерактивное удаление — позволяет пользователю физически стереть объект из базы данных нажатием комбинации клавиш Shift + Delete без какой-либо проверки ссылочной целостности. Это потенциально опасное право, которое обычно отключают для всех ролей.
  2. Интерактивное удаление помеченных — штатное право, разрешающее пользователю и стандартным системным обработкам платформы обрабатывать помеченные элементы с обязательным контролем ссылочной целостности.

Если для конкретного объекта метаданных у роли пользователя отключено право Интерактивное удаление помеченных, стандартный платформенный метод НайтиПомеченныеНаУдаление() просто пропускает такие объекты и не возвращает их в список. При этом внешние обработки, написанные через прямой запрос к таблице с условием ПометкаУдаления = Истина, видят записи, что и вызывает недоумение.

Разберем, как проверить и исправить настройки прав в конфигураторе:

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

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

Проанализируем ситуацию, когда документы одного вида видны в обработке лишь частично. Такое поведение напрямую указывает на работу механизмов RLS (ограничения прав на уровне записей).

Стандартная обработка удаления выполняет выборку объектов с учетом текущих прав сеанса. Если в системе настроен RLS (например, по организациям, подразделениям или грифам доступа), документы, по которым у пользователя нет полных прав на чтение или изменение, не попадают в результирующую выборку платформенного алгоритма.

Для устранения этой проблемы выполним следующие действия:

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

Причина 3: Пользовательские настройки формы и кэш приложения

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

Разберем по шагам, как очистить кэш и вернуть стандартное поведение формы:

  1. В окне обработки удаления помеченных объектов нажмем Еще → Установить стандартные настройки.
  2. Если проблема сохраняется, выполним очистку локального кэша тонкого/толстого клиента, удалив временные файлы из каталогов %LOCALAPPDATA%\1C\1Cv8 и %APPDATA%\1C\1Cv8.

Программный контроль удаления объектов на встроенном языке

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


МассивКУдалению = Новый Массив;
Выборка = Документы.РеализацияТоваровУслуг.Выбрать();

Пока Выборка.Следующий() Цикл
    Если Выборка.ПометкаУдаления Тогда
        МассивКУдалению.Добавить(Выборка.Ссылка);
    КонецЕсли;
КонецЦикла;

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

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

← На главную