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

Справочники и Данные · 12 мин

1С: как найти дубли запросом

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

Дубли в справочниках — одна из самых частых проблем учётных баз 1С: два контрагента с одним ИНН, три карточки номенклатуры с одинаковым артикулом, повторные физические лица. Пока дубли не найдены, отчёты расходятся, проводки «размазываются» по разным элементам, а обмены с другими системами дают сбои. Быстрее всего выявить такие повторы помогает запрос на встроенном языке 1С.

Основной приём — группировка по ключевым полям с агрегатной функцией КОЛИЧЕСТВО и отбором через HAVING (ИМЕЮЩИЕ). Запрос возвращает только те комбинации значений, которые встречаются больше одного раза. Дальше остаётся вывести сами элементы-дубли и решить, что с ними делать: пометить на удаление, объединить или передать на ручную разборку.

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

Как устроен поиск дублей запросом

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

Важно понимать разницу между ГДЕ и ИМЕЮЩИЕ. Условие ГДЕ фильтрует строки до группировки, а ИМЕЮЩИЕ — уже сгруппированные итоги. Проверку «количество больше одного» можно написать только в ИМЕЮЩИЕ, потому что до группировки агрегатных значений ещё не существует.

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

Базовый запрос: дубли контрагентов по ИНН

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

ВЫБРАТЬ

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

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

ИЗ

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

ГДЕ

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

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

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

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

ИМЕЮЩИЕ

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

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

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

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

Как вывести сами элементы-дубли

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

ВЫБРАТЬ

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

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

ИЗ

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

ГДЕ

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

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

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

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

ИМЕЮЩИЕ

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

;

ВЫБРАТЬ

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

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

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

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

ИЗ

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

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

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

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

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

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

Порядок действий
  1. 1
    Откройте консоль запросов в режиме предприятия
  2. 2
    Выполните запрос с группировкой и ИМЕЮЩИЕ по ключевому полю
  3. 3
    Проверьте, что в результат попали реальные дубли, а не ложные совпадения
  4. 4
    Выполните второй запрос с выборкой самих элементов через временную таблицу
  5. 5
    Передайте список на обработку: штатный поиск дублей, замену ссылок или ручную разборку

Поиск дублей по нескольким полям и нечёткие совпадения

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

Примеры рабочих комбинаций: для физических лиц — ФИО плюс дата рождения, для контрагентов — ИНН плюс КПП (одно юрлицо с разными КПП обособленных подразделений — это не дубль), для номенклатуры — артикул плюс производитель. Чем больше полей в группировке, тем меньше ложных срабатываний, но и тем выше шанс пропустить реальные дубли с опечатками.

Нормализация значений перед сравнением

Опечатки вида лишних пробелов или разного регистра ловят через функции запроса. В языке запросов 1С доступны СОКРЛП (удаление крайних пробелов), однако замену внутренних двойных пробелов и приведение регистра в запросе сделать сложно. Поэтому для «грязных» наименований часто используют двухпроходный подход: сначала запросом выбирают кандидатов с похожими значениями, а точное сравнение выполняют уже кодом на встроенном языке с функциями НРег(), СтрЗаменить() и СокрЛП().

Дубли в регистрах сведений и табличных частях

Тот же приём работает не только для справочников. Например, дубли строк в регистре сведений «Штрихкоды номенклатуры» (один штрихкод привязан к разным товарам) ищутся группировкой по полю Штрихкод с условием ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 1. Такой запрос быстро показывает конфликты, из-за которых сканер выдаёт не тот товар.

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

Запрос вернул 0 строкДублей по выбранному полю нет

Проверьте другие поля: артикул, наименование, КПП

Сотни групп по пустому значениюНе исключены пустые реквизиты

Добавьте условие ГДЕ Поле <> "" или НЕ Поле ЕСТЬ NULL

Дубли с разными ИННЛожное срабатывание по наименованию

Это разные организации, группируйте по ИНН

Один ИНН, разные КППВозможно, обособленные подразделения

Уточните методику учёта, прежде чем объединять

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

Удалять элементы напрямую запросом нельзя — запросы в 1С только читают данные. Обработка дублей выполняется отдельно, и здесь есть три безопасных пути. Первый — штатная обработка «Поиск и удаление дублей» (в типовых конфигурациях находится в разделе администрирования): она умеет объединять элементы с автоматической заменой ссылок во всех документах и регистрах.

Второй путь — обработка «Групповое изменение реквизитов» или универсальные подборы с заменой ссылок, если штатной обработки в конфигурации нет. Третий — ручная разборка, когда дублей немного и нужно решать по каждому элементу отдельно. В любом случае перед массовой заменой ссылок сделайте резервную копию базы: операция необратима, а ошибочное объединение двух разных контрагентов исправить крайне трудоёмко.

После обработки повторите исходный запрос — он должен вернуть пустой результат. Это простой и надёжный контроль того, что дубли действительно устранены, а не просто переименованы.

Контрольные точки

Как проверить результат

Повторный запрос с ИМЕЮЩИЕ
Норма

Возвращает 0 строк

Тревожный признак

Остались группы с количеством больше 1

Отчёты по контрагенту
Норма

Все документы на одном элементе

Тревожный признак

Обороты разбиты на две карточки

Помеченные на удаление
Норма

Дубли помечены и выведены из оборота

Тревожный признак

Дубли активны и доступны для выбора

Типичные ошибки при поиске дублей запросом

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

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

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

Как выбрать действие

Дублей мало (до нескольких десятков) и они разные по смыслуРазберите вручную, объединяя через штатную обработку по одной паре
Дублей много и критерий совпадения формальный (ИНН, штрихкод)Используйте «Поиск и удаление дублей» с настроенными правилами и предварительным просмотром
Совпадают только похожие наименованияСначала нормализуйте данные (регистр, пробелы), потом повторите запрос
Дубли в регистре штрихкодов или ценУдаляйте лишние записи регистра напрямую после проверки, какая запись актуальна

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

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

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

Как найти дубли физических лиц, если нет ИНН?

Группируйте по комбинации ФИО и даты рождения, предварительно приведя ФИО к одному регистру и убрав лишние пробелы. Если дата рождения заполнена не везде, добавьте в критерий серию и номер документа, удостоверяющего личность, — но помните, что документ мог быть заменён.

Почему запрос с ИМЕЮЩИЕ возвращает ошибку?

Чаще всего в ИМЕЮЩИЕ используется поле, которое не входит в группировку и не обёрнуто в агрегатную функцию. Проверьте, что условие написано на агрегате — например, КОЛИЧЕСТВО(Ссылка) > 1, а не Ссылка > 1. Также убедитесь, что секция ИМЕЮЩИЕ стоит после СГРУППИРОВАТЬ ПО.

Можно ли сразу удалить дубли запросом?

Нет, язык запросов 1С предназначен только для чтения данных. Удаление и замена ссылок выполняются кодом на встроенном языке или штатными обработками. Попытки удалить элементы напрямую из таблиц СУБД приводят к битым ссылкам и нарушению целостности базы.

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

Группируйте по ссылке на документ и реквизитам строки, которые должны быть уникальны (например, номенклатура и характеристика), с условием ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 1. Запрос покажет документы, где один и тот же товар введён несколькими строками, — такие документы стоит проверить перед проведением инвентаризации.

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

Определите формальный критерий выбора «главного» элемента — например, карточку с большим числом документов или с последней датой изменения. Затем настройте штатную обработку поиска дублей на автоматическое объединение по этому правилу и сначала прогоните её на копии базы, сверив итоговые обороты с исходными.

Итог

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

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