При разработке механизмов удаления помеченных объектов в 1С:Предприятие 8.3 часто возникает необходимость ограничить область поиска конкретными объектами метаданных. Однако стандартная функция НайтиПомеченныеНаУдаление нередко игнорирует передаваемые параметры, возвращая все найденные объекты в системе. Давайте разберем, почему это происходит и как гарантированно получить нужный список элементов.
Основная сложность заключается в том, что поведение метода НайтиПомеченныеНаУдаление существенно менялось от версии к версии платформы. Начиная с версии 8.3.15, 1С изменила логику работы параметров. Если вы передаете Неопределено или пустые массивы, метод может интерпретировать это как команду поиска по всем доступным объектам конфигурации.
Кроме того, если ваша конфигурация работает в режиме совместимости с версиями 8.3.4 и ниже, параметры отбора метаданных будут игнорироваться системой автоматически. Также важно помнить, что на мобильной платформе данные параметры поиска не учитываются вовсе, поэтому для кроссплатформенных решений стоит предусмотреть альтернативные методы обработки данных.
Наиболее надежным способом добиться нужного результата, когда прямое указание объектов поиска (второй параметр метода) не приносит успеха, является использование параметра ИсключитьОбъекты. Суть метода заключается в том, чтобы передать в третий параметр массива все объекты метаданных, которые вам не нужны, оставив в поиске только необходимые.
Рассмотрим пошаговый алгоритм реализации такого подхода:
Метаданные.Документы или Метаданные.Справочники.НайтиПомеченныеНаУдаление.Посмотрим на пример реализации кода для исключения объектов:
ИсключитьОбъекты = Новый Массив;
Для каждого стр из Метаданные.Документы Цикл
Если стр = Метаданные.Документы.НужныйНамДокумент Тогда
Продолжить;
КонецЕсли;
ИсключитьОбъекты.Добавить(стр);
КонецЦикла;
// Добавляем все справочники в исключения
Для каждого стр из Метаданные.Справочники Цикл
ИсключитьОбъекты.Добавить(стр);
КонецЦикла;
НайденныеОбъекты = НайтиПомеченныеНаУдаление(, , ИсключитьОбъекты);
Если ваша версия платформы и настройки позволяют использовать прямой отбор, убедитесь, что первый параметр (область поиска) заполнен корректно. Согласно документации, для активации поиска по конкретным объектам, необходимо передать массив, содержащий объекты метаданных, во второй параметр функции.
Попробуем использовать следующую конструкцию:
ОбластьПоиска = Новый Массив; // Оставляем пустым, если не используем разделение данных
ВключитьОбъекты = Новый Массив;
ВключитьОбъекты.Добавить(\"Документ.РеализацияТоваровУслуг\");
НайденныеОбъекты = НайтиПомеченныеНаУдаление(ОбластьПоиска, ВключитьОбъекты);
Важно: Если вы используете управляемое приложение, данный код будет работать корректно, однако в обычном режиме запуска может потребоваться дополнительная настройка сеанса или использование метода исключения объектов, описанного выше.
Часто задают вопрос: что быстрее, встроенная функция НайтиПомеченныеНаУдаление или самописный запрос к базе данных? Анализ показывает, что встроенная функция работает существенно быстрее, так как она исполняется на уровне ядра платформы (C++) и обходит этап построения тяжелого SQL-плана, который возник бы при объединении множества таблиц запросом через ОБЪЕДИНИТЬ ВСЕ.
При использовании данного метода всегда учитывайте следующее:
Неопределено во всех параметрах только в том случае, если вам действительно нужно просканировать всю базу данных.ИсключитьОбъекты является самым стабильным «костылем», решающим проблему в текущих реалиях платформы 8.3.15+.Развитие механизмов 1С требует гибкого подхода, и знание подобных нюансов работы функций позволяет создавать более надежные и быстрые решения для задач администрирования данных.