К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как найти дубли в 1С с помощью запроса

Как найти дубли в 1С с помощью запроса: группировка с HAVING, поиск по нескольким полям, обработка дублей и типичные ошибки при написании запросов.

Дубли в справочниках 1С — контрагенты, номенклатура, физические лица — появляются при ручном вводе, обменах между базами и загрузках из внешних файлов. Найти их вручную в большой базе нереально, поэтому основной инструмент — запрос с группировкой, который выявляет повторяющиеся комбинации значений.

Логика поиска всегда одинакова: сгруппировать записи по ключевым полям, посчитать количество записей в каждой группе и оставить только те группы, где записей больше одной. Для этого в языке запросов 1С используются конструкции СГРУППИРОВАТЬ ПО и ИМЕЮЩИЕ (HAVING).

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

Базовый запрос: дубли по одному полю

Самая частая задача — найти дубли контрагентов по ИНН или номенклатуры по артикулу. Запрос группирует записи по полю и отбирает группы, где количество записей больше одной:

ВЫБРАТЬ

Контрагенты.ИНН КАК ИНН,

КОЛИЧЕСТВО(Контрагенты.Ссылка) КАК КоличествоЗаписей

ИЗ

Справочник.Контрагенты КАК Контрагенты

ГДЕ

Контрагенты.ИНН <> ""

И НЕ Контрагенты.ПометкаУдаления

СГРУППИРОВАТЬ ПО

Контрагенты.ИНН

ИМЕЮЩИЕ

КОЛИЧЕСТВО(Контрагенты.Ссылка) > 1

Обратите внимание на два условия в секции ГДЕ. Пустые значения исключаются, иначе все элементы с незаполненным ИНН соберутся в одну огромную «группу дублей». Помеченные на удаление элементы тоже исключаются — они не должны мешать анализу актуальных данных.

Результат такого запроса — список значений (ИНН) с количеством повторов. Это удобно для оценки масштаба проблемы, но для обработки нужны сами ссылки на элементы.

Как получить ссылки на дублирующиеся элементы

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

ВЫБРАТЬ

Контрагенты.ИНН КАК ИНН

ПОМЕСТИТЬ ВТ_Дубли

ИЗ

Справочник.Контрагенты КАК Контрагенты

ГДЕ

Контрагенты.ИНН <> ""

И НЕ Контрагенты.ПометкаУдаления

СГРУППИРОВАТЬ ПО

Контрагенты.ИНН

ИМЕЮЩИЕ

КОЛИЧЕСТВО(Контрагенты.Ссылка) > 1

;

////////////////////////////////////////////////////////////

ВЫБРАТЬ

Контрагенты.Ссылка КАК Ссылка,

Контрагенты.Наименование КАК Наименование,

Контрагенты.ИНН КАК ИНН,

Контрагенты.КПП КАК КПП

ИЗ

ВТ_Дубли КАК Дубли

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты

ПО Дубли.ИНН = Контрагенты.ИНН

ГДЕ

НЕ Контрагенты.ПометкаУдаления

УПОРЯДОЧИТЬ ПО

ИНН, Наименование

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

Такой подход с пакетом запросов и временной таблицей работает быстрее, чем вложенный подзапрос в секции ГДЕ, особенно на больших справочниках.

Поиск дублей по нескольким полям

Одного поля часто недостаточно: разные филиалы одного контрагента имеют один ИНН, но разные КПП. Тогда группировку делают по комбинации полей:

ВЫБРАТЬ

Контрагенты.ИНН КАК ИНН,

Контрагенты.КПП КАК КПП,

КОЛИЧЕСТВО(Контрагенты.Ссылка) КАК КоличествоЗаписей

ИЗ

Справочник.Контрагенты КАК Контрагенты

ГДЕ

Контрагенты.ИНН <> ""

И НЕ Контрагенты.ПометкаУдаления

СГРУППИРОВАТЬ ПО

Контрагенты.ИНН,

Контрагенты.КПП

ИМЕЮЩИЕ

КОЛИЧЕСТВО(Контрагенты.Ссылка) > 1

Нечёткий поиск по наименованию

Дубли с опечатками («ООО Ромашка» и «ООО "Ромашка"») запросом с точным сравнением не найти. Частично помогает нормализация: приведение к верхнему регистру и удаление лишних символов через ВЫРАЗИТЬ и строковые функции запроса ограничены, поэтому на практике нормализацию делают кодом перед записью данных или используют штатную обработку «Поиск и удаление дублей» с настраиваемыми правилами сравнения.

Сравнение вариантов

Запрос с группировкой

Быстро и точно по заданным полям. Подходит для регулярных проверок и отчётов, но не ловит опечатки и различия в написании.

Обработка «Поиск и удаление дублей»

Штатный инструмент типовых конфигураций: поддерживает нечёткое сравнение и автоматическую замену ссылок. Медленнее на больших объёмах.

Регламентная проверка перед обменом

Запрос дублей встраивают в процедуру загрузки данных — дубли не попадают в базу вовсе. Требует доработки кода.

Поиск дублей в регистрах сведений

В периодических регистрах сведений дубль — это несколько записей с одинаковой комбинацией измерений на одну дату. Такая ситуация возникает при ошибках обмена или ручной корректировке и приводит к неоднозначным данным в отчётах.

ВЫБРАТЬ

Цены.Номенклатура КАК Номенклатура,

Цены.ТипЦен КАК ТипЦен,

Цены.Период КАК Период,

КОЛИЧЕСТВО(*) КАК КоличествоЗаписей

ИЗ

РегистрСведений.ЦеныНоменклатуры КАК Цены

СГРУППИРОВАТЬ ПО

Цены.Номенклатура,

Цены.ТипЦен,

Цены.Период

ИМЕЮЩИЕ

КОЛИЧЕСТВО(*) > 1

Для независимых регистров сведений (без регистратора) такие дубли физически невозможны, если ключ уникальности настроен корректно — платформа не даст записать вторую строку с тем же набором измерений и периодом. А вот в регистрах, подчинённых регистратору, дубли по смыслу (разные документы, одна дата и измерения) вполне реальны, и запрос выше их выявит.

Что делать с найденными дублями

Безопасный сценарий обработки выглядит так. Сначала запросом получают группы дублей, затем в каждой группе выбирают «главный» элемент — обычно тот, на который больше всего ссылок в базе. Количество ссылок можно оценить через поиск ссылок (НайтиПоСсылкам) в коде.

Далее все ссылки на дубли перенаправляют на главный элемент. В типовых конфигурациях это делает обработка «Поиск и удаление дублей» (раздел «Администрирование» — «Обслуживание») или универсальная обработка «Поиск и замена значений». После замены ссылок лишние элементы помечают на удаление и удаляют штатной процедурой с контролем ссылочной целостности.

Порядок действий
  1. 1
    Напишите запрос с группировкой и ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 1 по ключевым полям
  2. 2
    Исключите пустые значения и помеченные на удаление элементы
  3. 3
    Соедините результат с исходной таблицей, чтобы получить ссылки на дубли
  4. 4
    Проверьте выборку визуально на небольшом объёме
  5. 5
    Сделайте резервную копию базы
  6. 6
    Выполните замену ссылок штатной обработкой, затем удалите лишние элементы

Проверка результата и типичные ошибки

После выполнения запроса стоит убедиться, что он находит именно дубли, а не легитимные данные. Возьмите несколько найденных значений и откройте элементы вручную: если это действительно один и тот же контрагент, введённый дважды, запрос работает корректно. Если это разные филиалы с общим ИНН — уточните набор полей группировки.

Контрольный приём: посчитайте общее количество элементов в справочнике и количество строк в выборке дублей. Если дублей оказалось подозрительно много (значительная доля справочника), скорее всего, в условиях ошибка — например, не отфильтрованы пустые значения.

Типичные ошибки
01
Не исключены пустые значения ключа — все элементы без ИНН считаются одной группой дублей и искажают результат
02
Условие по количеству записей написано в секции ГДЕ вместо ИМЕЮЩИЕ — запрос падает с ошибкой или фильтрует строки до группировки
03
Сравнение строк без учёта регистра и пробелов — «Ромашка» и «ромашка » считаются разными значениями, дубль не находится
04
Удаление дублей без замены ссылок — в документах остаются битые ссылки вида «Объект не найден»
05
Поиск только по наименованию — совпадение имён разных контрагентов ошибочно принимается за дубль

Частые вопросы о поиске дублей в 1С

Можно ли найти дубли без программирования?

Да. В типовых конфигурациях есть обработка «Поиск и удаление дублей» (Администрирование → Обслуживание → Корректировка данных). Она ищет дубли по настраиваемым правилам, включая нечёткое сравнение, и умеет автоматически заменять ссылки. Запрос нужен, когда требуется нестандартный критерий или регулярная автоматическая проверка.

Почему запрос с ИМЕЮЩИЕ выдаёт ошибку в консоли?

Чаще всего агрегатная функция или поле группировки указаны с ошибкой в имени, либо условие по количеству записано в секцию ГДЕ. Проверьте, что все неагрегатные поля из секции ВЫБРАТЬ перечислены в СГРУППИРОВАТЬ ПО, а отбор по КОЛИЧЕСТВО находится именно в ИМЕЮЩИЕ.

Как найти дубли с учётом регистра и пробелов?

Возможности строковых функций в языке запросов ограничены. На практике добавляют в справочник служебное поле с «нормализованным» значением (верхний регистр, без пробелов и знаков препинания), заполняют его при записи элемента и ищут дубли уже по нему.

Как выбрать, какой из дублей оставить основным?

Обычно оставляют элемент с наибольшим числом ссылок в документах и регистрах — его находят через НайтиПоСсылкам. Дополнительные критерии: полнота заполнения реквизитов, наличие актуальных договоров, более поздняя дата изменения.

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

Да, принцип тот же: группировка по ссылке на документ и ключевым полям табличной части с условием ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 1. Так находят, например, повторяющиеся строки номенклатуры в одном заказе.

Итог

Что важно запомнить

Дубли ищут группировкой с ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 1, обязательно исключая пустые значения и помеченные на удаление. Ссылки на элементы получают соединением с временной таблицей дублей. Обработку выполняют только через замену ссылок после резервного копирования.