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