Многие технические специалисты и администраторы систем на базе 1С:Предприятие 8.3 сталкиваются с ситуацией, когда стандартная типовая обработка Поиск и удаление дублей начинает работать крайне неэффективно. В крупных информационных базах, таких как 1С:Бухгалтерия предприятия 3.0, процесс поиска может занимать часы, даже если требуется найти дубликаты по одному проиндексированному полю в справочнике среднего объема (например, 70 000 – 100 000 записей).
В этой статье мы подробно разберем, почему стандартные механизмы могут «зависать», проанализируем внутреннюю логику работы системы и рассмотрим альтернативные способы быстрого поиска дублей с помощью запросов.
Когда мы запускаем стандартный поиск, система выполняет гораздо более сложные операции, чем кажется на первый взгляд. Разберем по шагам, что происходит «под капотом»:
RLS), любой запрос, даже самый простой, обрастает огромным количеством вложенных подзапросов. Система обязана проверить права пользователя на каждый из 70 000 элементов и на каждую связанную с ними запись в других таблицах.Похожи по строке или Похожи по созвучию, 1С перестает использовать стандартные индексы SQL. Вместо этого в памяти сервера запускаются ресурсоемкие алгоритмы нечеткого сравнения (например, вычисление расстояния Левенштейна). На больших объемах данных это приводит к геометрической прогрессии затрат времени.Как показывает практика, если нам нужно просто получить список дублей по конкретному полю (например, Артикул), лучше всего воспользоваться консолью запросов. Проанализируем пример кода, который возвращает результат за доли секунды, в то время как стандартная обработка может работать 2 часа.
Рассмотрим структуру этого запроса. Сначала мы создаем временную таблицу, в которой группируем записи по целевому полю и отбираем только те, что встречаются более одного раза:
ВЫБРАТЬ
Номенклатура.Артикул КАК Артикул
ПОМЕСТИТЬ Дубли
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
НЕ Номенклатура.ПометкаУдаления
И Номенклатура.Артикул <> ""
СГРУППИРОВАТЬ ПО
Номенклатура.Артикул
ИМЕЮЩИЕ
КОЛИЧЕСТВО(*) > 1
;
Затем мы соединяем полученную таблицу Дубли с основной таблицей справочника, чтобы вывести все поля, необходимые для визуальной идентификации элементов пользователем:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
Номенклатура.Код КАК Код,
Номенклатура.Артикул КАК Артикул
ИЗ
Дубли КАК Дубли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
ПО Дубли.Артикул = Номенклатура.Артикул
Выясним причину высокой скорости этого подхода: индексация. Если поле Артикул проиндексировано в конфигураторе, SQL-серверу не нужно сканировать всю таблицу. Он использует индекс для мгновенной группировки. Именно этот подход рекомендуется использовать для предварительной оценки масштаба проблемы перед запуском тяжелых стандартных процедур.
Если работа со стандартной обработкой неизбежна (например, нужно именно автоматическое слияние ссылок), выполним следующие рекомендации для ускорения процесса:
Полнотекстовый поиск (ПТП). Если индекс не актуален, система тратит время на его частичное перестроение или переходит к неэффективному сканированию таблиц. Перейдем в Администрирование — Поддержка и обслуживание — Управление полнотекстовым поиском и выполним очистку и полное обновление индекса.RLS. Это сократит количество условий в SQL-запросах в несколько раз.TempDB. Убедимся, что она расположена на быстром SSD-диске и имеет достаточно места для расширения. Медленный диск под TempDB — частая причина «зависания» 1С на операциях с временными таблицами.БСП (Библиотеки Стандартных Подсистем) работает слишком долго, можно воспользоваться инструментом Универсальный отбор и обработка объектов. Она работает более «прямолинейно», не выполняя лишних аналитических проверок до того момента, пока вы не нажмете кнопку выполнения замены.Рассмотрим стратегию работы, если количество записей превышает 100 000. В этом случае мы рекомендуем не искать все дубли сразу. Проанализируем ситуацию и настроим отборы в стандартной обработке таким образом, чтобы обрабатывать справочник частями (например, по группам номенклатуры или по первым буквам наименования). Это позволит системе работать с меньшими объемами данных в памяти и быстрее освобождать ресурсы сервера.
Также важно помнить, что после того, как поиск завершен, этап Замена ссылок потребует монопольного доступа или отсутствия активной работы пользователей с заменяемыми объектами, так как блокировки таблиц при массовой записи могут остановить работу всего предприятия.
Подведем итог: медленная работа стандартного поиска дублей — это цена за «интеллектуальность» алгоритма. Используя прямые запросы для поиска и соблюдая регламент обслуживания SQL-сервера, мы можем значительно сократить время простоя и оперативно привести данные в порядок.