Разработка и Конфигурация · 9 мин
Как найти дубли в 1С с помощью запроса
Как найти дубли в 1С с помощью запроса: группировка с HAVING, поиск по нескольким полям, обработка дублей и типичные ошибки при написании запросов.
Дубли в справочниках 1С — контрагенты, номенклатура, физические лица — появляются при ручном вводе, обменах между базами и загрузках из внешних файлов. Найти их вручную в большой базе нереально, поэтому основной инструмент — запрос с группировкой, который выявляет повторяющиеся комбинации значений.
Логика поиска всегда одинакова: сгруппировать записи по ключевым полям, посчитать количество записей в каждой группе и оставить только те группы, где записей больше одной. Для этого в языке запросов 1С используются конструкции СГРУППИРОВАТЬ ПО и ИМЕЮЩИЕ (HAVING).
Ниже разобраны готовые шаблоны запросов для разных задач: от простого поиска дублей по наименованию до выборки самих «лишних» элементов для дальнейшей обработки, а также типичные ошибки и способы проверки результата.
Базовый запрос: дубли по одному полю
Самая частая задача — найти дубли контрагентов по ИНН или номенклатуры по артикулу. Запрос группирует записи по полю и отбирает группы, где количество записей больше одной:
ВЫБРАТЬ
Контрагенты.ИНН КАК ИНН,
КОЛИЧЕСТВО(Контрагенты.Ссылка) КАК КоличествоЗаписей
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.ИНН <> ""
И НЕ Контрагенты.ПометкаУдаления
СГРУППИРОВАТЬ ПО
Контрагенты.ИНН
ИМЕЮЩИЕ
КОЛИЧЕСТВО(Контрагенты.Ссылка) > 1
Обратите внимание на два условия в секции ГДЕ. Пустые значения исключаются, иначе все элементы с незаполненным ИНН соберутся в одну огромную «группу дублей». Помеченные на удаление элементы тоже исключаются — они не должны мешать анализу актуальных данных.
Результат такого запроса — список значений (ИНН) с количеством повторов. Это удобно для оценки масштаба проблемы, но для обработки нужны сами ссылки на элементы.
Как получить ссылки на дублирующиеся элементы
Чтобы вывести сами элементы справочника, а не только ключи дублей, результат группировки помещают во временную таблицу и соединяют с исходной:
ВЫБРАТЬ
Контрагенты.ИНН КАК ИНН
ПОМЕСТИТЬ ВТ_Дубли
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.ИНН <> ""
И НЕ Контрагенты.ПометкаУдаления
СГРУППИРОВАТЬ ПО
Контрагенты.ИНН
ИМЕЮЩИЕ
КОЛИЧЕСТВО(Контрагенты.Ссылка) > 1
;
////////////////////////////////////////////////////////////
ВЫБРАТЬ
Контрагенты.Ссылка КАК Ссылка,
Контрагенты.Наименование КАК Наименование,
Контрагенты.ИНН КАК ИНН,
Контрагенты.КПП КАК КПП
ИЗ
ВТ_Дубли КАК Дубли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
ПО Дубли.ИНН = Контрагенты.ИНН
ГДЕ
НЕ Контрагенты.ПометкаУдаления
УПОРЯДОЧИТЬ ПО
ИНН, Наименование
Второй запрос пакета возвращает полный список элементов, у которых есть «близнецы». Сортировка по ИНН и наименованию группирует дубли рядом, что удобно для визуальной проверки перед обработкой.
Такой подход с пакетом запросов и временной таблицей работает быстрее, чем вложенный подзапрос в секции ГДЕ, особенно на больших справочниках.
Поиск дублей по нескольким полям
Одного поля часто недостаточно: разные филиалы одного контрагента имеют один ИНН, но разные КПП. Тогда группировку делают по комбинации полей:
ВЫБРАТЬ
Контрагенты.ИНН КАК ИНН,
Контрагенты.КПП КАК КПП,
КОЛИЧЕСТВО(Контрагенты.Ссылка) КАК КоличествоЗаписей
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.ИНН <> ""
И НЕ Контрагенты.ПометкаУдаления
СГРУППИРОВАТЬ ПО
Контрагенты.ИНН,
Контрагенты.КПП
ИМЕЮЩИЕ
КОЛИЧЕСТВО(Контрагенты.Ссылка) > 1
Нечёткий поиск по наименованию
Дубли с опечатками («ООО Ромашка» и «ООО "Ромашка"») запросом с точным сравнением не найти. Частично помогает нормализация: приведение к верхнему регистру и удаление лишних символов через ВЫРАЗИТЬ и строковые функции запроса ограничены, поэтому на практике нормализацию делают кодом перед записью данных или используют штатную обработку «Поиск и удаление дублей» с настраиваемыми правилами сравнения.
Сравнение вариантов
Быстро и точно по заданным полям. Подходит для регулярных проверок и отчётов, но не ловит опечатки и различия в написании.
Штатный инструмент типовых конфигураций: поддерживает нечёткое сравнение и автоматическую замену ссылок. Медленнее на больших объёмах.
Запрос дублей встраивают в процедуру загрузки данных — дубли не попадают в базу вовсе. Требует доработки кода.
Поиск дублей в регистрах сведений
В периодических регистрах сведений дубль — это несколько записей с одинаковой комбинацией измерений на одну дату. Такая ситуация возникает при ошибках обмена или ручной корректировке и приводит к неоднозначным данным в отчётах.
ВЫБРАТЬ
Цены.Номенклатура КАК Номенклатура,
Цены.ТипЦен КАК ТипЦен,
Цены.Период КАК Период,
КОЛИЧЕСТВО(*) КАК КоличествоЗаписей
ИЗ
РегистрСведений.ЦеныНоменклатуры КАК Цены
СГРУППИРОВАТЬ ПО
Цены.Номенклатура,
Цены.ТипЦен,
Цены.Период
ИМЕЮЩИЕ
КОЛИЧЕСТВО(*) > 1
Для независимых регистров сведений (без регистратора) такие дубли физически невозможны, если ключ уникальности настроен корректно — платформа не даст записать вторую строку с тем же набором измерений и периодом. А вот в регистрах, подчинённых регистратору, дубли по смыслу (разные документы, одна дата и измерения) вполне реальны, и запрос выше их выявит.
Что делать с найденными дублями
Безопасный сценарий обработки выглядит так. Сначала запросом получают группы дублей, затем в каждой группе выбирают «главный» элемент — обычно тот, на который больше всего ссылок в базе. Количество ссылок можно оценить через поиск ссылок (НайтиПоСсылкам) в коде.
Далее все ссылки на дубли перенаправляют на главный элемент. В типовых конфигурациях это делает обработка «Поиск и удаление дублей» (раздел «Администрирование» — «Обслуживание») или универсальная обработка «Поиск и замена значений». После замены ссылок лишние элементы помечают на удаление и удаляют штатной процедурой с контролем ссылочной целостности.
- 1Напишите запрос с группировкой и ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 1 по ключевым полям
- 2Исключите пустые значения и помеченные на удаление элементы
- 3Соедините результат с исходной таблицей, чтобы получить ссылки на дубли
- 4Проверьте выборку визуально на небольшом объёме
- 5Сделайте резервную копию базы
- 6Выполните замену ссылок штатной обработкой, затем удалите лишние элементы
Проверка результата и типичные ошибки
После выполнения запроса стоит убедиться, что он находит именно дубли, а не легитимные данные. Возьмите несколько найденных значений и откройте элементы вручную: если это действительно один и тот же контрагент, введённый дважды, запрос работает корректно. Если это разные филиалы с общим ИНН — уточните набор полей группировки.
Контрольный приём: посчитайте общее количество элементов в справочнике и количество строк в выборке дублей. Если дублей оказалось подозрительно много (значительная доля справочника), скорее всего, в условиях ошибка — например, не отфильтрованы пустые значения.
Частые вопросы о поиске дублей в 1С
Можно ли найти дубли без программирования?
Да. В типовых конфигурациях есть обработка «Поиск и удаление дублей» (Администрирование → Обслуживание → Корректировка данных). Она ищет дубли по настраиваемым правилам, включая нечёткое сравнение, и умеет автоматически заменять ссылки. Запрос нужен, когда требуется нестандартный критерий или регулярная автоматическая проверка.
Почему запрос с ИМЕЮЩИЕ выдаёт ошибку в консоли?
Чаще всего агрегатная функция или поле группировки указаны с ошибкой в имени, либо условие по количеству записано в секцию ГДЕ. Проверьте, что все неагрегатные поля из секции ВЫБРАТЬ перечислены в СГРУППИРОВАТЬ ПО, а отбор по КОЛИЧЕСТВО находится именно в ИМЕЮЩИЕ.
Как найти дубли с учётом регистра и пробелов?
Возможности строковых функций в языке запросов ограничены. На практике добавляют в справочник служебное поле с «нормализованным» значением (верхний регистр, без пробелов и знаков препинания), заполняют его при записи элемента и ищут дубли уже по нему.
Как выбрать, какой из дублей оставить основным?
Обычно оставляют элемент с наибольшим числом ссылок в документах и регистрах — его находят через НайтиПоСсылкам. Дополнительные критерии: полнота заполнения реквизитов, наличие актуальных договоров, более поздняя дата изменения.
Можно ли искать дубли в табличной части документа запросом?
Да, принцип тот же: группировка по ссылке на документ и ключевым полям табличной части с условием ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 1. Так находят, например, повторяющиеся строки номенклатуры в одном заказе.
Что важно запомнить
Дубли ищут группировкой с ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 1, обязательно исключая пустые значения и помеченные на удаление. Ссылки на элементы получают соединением с временной таблицей дублей. Обработку выполняют только через замену ссылок после резервного копирования.