Почему стандартный поиск дублей в 1С:Бухгалтерия 3.0 работает медленно и как это исправить?

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

Многие технические специалисты и администраторы систем на базе 1С:Предприятие 8.3 сталкиваются с ситуацией, когда стандартная типовая обработка Поиск и удаление дублей начинает работать крайне неэффективно. В крупных информационных базах, таких как 1С:Бухгалтерия предприятия 3.0, процесс поиска может занимать часы, даже если требуется найти дубликаты по одному проиндексированному полю в справочнике среднего объема (например, 70 000 – 100 000 записей).

В этой статье мы подробно разберем, почему стандартные механизмы могут «зависать», проанализируем внутреннюю логику работы системы и рассмотрим альтернативные способы быстрого поиска дублей с помощью запросов.

Анализируем причины низкой производительности стандартной обработки

Когда мы запускаем стандартный поиск, система выполняет гораздо более сложные операции, чем кажется на первый взгляд. Разберем по шагам, что происходит «под капотом»:

  1. Глубокий анализ ссылочной целостности. В отличие от простого запроса, стандартная обработка на этапе поиска пытается не только найти одинаковые элементы, но и предварительно оценить их «вес». Система анализирует количество ссылок на каждый найденный дубль во всей базе данных (документы, регистры сведений, регистры накопления). Это необходимо для автоматического определения «оригинала» — того элемента, который используется чаще всего.
  2. Проверка прав доступа (RLS). Если в вашей базе включено ограничение прав на уровне записей (RLS), любой запрос, даже самый простой, обрастает огромным количеством вложенных подзапросов. Система обязана проверить права пользователя на каждый из 70 000 элементов и на каждую связанную с ними запись в других таблицах.
  3. Алгоритмы сравнения строк. Если в настройках поиска выбрано правило Похожи по строке или Похожи по созвучию, 1С перестает использовать стандартные индексы SQL. Вместо этого в памяти сервера запускаются ресурсоемкие алгоритмы нечеткого сравнения (например, вычисление расстояния Левенштейна). На больших объемах данных это приводит к геометрической прогрессии затрат времени.
  4. Отрисовка интерфейса и передача данных. В управляемом приложении найденные данные должны быть переданы с сервера на клиент и отображены в динамическом списке или дереве значений. Формирование этой структуры для тысяч строк с расчетом метаданных (иконок, признаков удаления и т.д.) создает колоссальную нагрузку на фоновое задание и сетевой канал.

Использование «православного» запроса для мгновенного поиска

Как показывает практика, если нам нужно просто получить список дублей по конкретному полю (например, Артикул), лучше всего воспользоваться консолью запросов. Проанализируем пример кода, который возвращает результат за доли секунды, в то время как стандартная обработка может работать 2 часа.

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


ВЫБРАТЬ
    Номенклатура.Артикул КАК Артикул
ПОМЕСТИТЬ Дубли
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    НЕ Номенклатура.ПометкаУдаления
    И Номенклатура.Артикул <> ""
СГРУППИРОВАТЬ ПО
    Номенклатура.Артикул
ИМЕЮЩИЕ
    КОЛИЧЕСТВО(*) > 1
;

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


ВЫБРАТЬ
    Номенклатура.Ссылка КАК Номенклатура,
    Номенклатура.Код КАК Код,
    Номенклатура.Артикул КАК Артикул
ИЗ
    Дубли КАК Дубли
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
        ПО Дубли.Артикул = Номенклатура.Артикул

Выясним причину высокой скорости этого подхода: индексация. Если поле Артикул проиндексировано в конфигураторе, SQL-серверу не нужно сканировать всю таблицу. Он использует индекс для мгновенной группировки. Именно этот подход рекомендуется использовать для предварительной оценки масштаба проблемы перед запуском тяжелых стандартных процедур.

Пошаговая инструкция по ускорению процесса удаления дублей

Если работа со стандартной обработкой неизбежна (например, нужно именно автоматическое слияние ссылок), выполним следующие рекомендации для ускорения процесса:

  1. Обновление полнотекстового индекса. Типовой поиск часто опирается на Полнотекстовый поиск (ПТП). Если индекс не актуален, система тратит время на его частичное перестроение или переходит к неэффективному сканированию таблиц. Перейдем в Администрирование — Поддержка и обслуживание — Управление полнотекстовым поиском и выполним очистку и полное обновление индекса.
  2. Отключение RLS на время обслуживания. Если политика безопасности компании позволяет, запустим поиск дублей под пользователем с полными правами, у которого отключены ограничения RLS. Это сократит количество условий в SQL-запросах в несколько раз.
  3. Проверка TempDB. При поиске дублей на серверной базе активно используется системная база TempDB. Убедимся, что она расположена на быстром SSD-диске и имеет достаточно места для расширения. Медленный диск под TempDB — частая причина «зависания» 1С на операциях с временными таблицами.
  4. Использование внешних инструментов. Разберем ситуацию: если стандартная обработка из БСП (Библиотеки Стандартных Подсистем) работает слишком долго, можно воспользоваться инструментом Универсальный отбор и обработка объектов. Она работает более «прямолинейно», не выполняя лишних аналитических проверок до того момента, пока вы не нажмете кнопку выполнения замены.

Методика работы с большими справочниками

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

Также важно помнить, что после того, как поиск завершен, этап Замена ссылок потребует монопольного доступа или отсутствия активной работы пользователей с заменяемыми объектами, так как блокировки таблиц при массовой записи могут остановить работу всего предприятия.

Подведем итог: медленная работа стандартного поиска дублей — это цена за «интеллектуальность» алгоритма. Используя прямые запросы для поиска и соблюдая регламент обслуживания SQL-сервера, мы можем значительно сократить время простоя и оперативно привести данные в порядок.

← На главную