Дублирующиеся записи в базе 1С:Предприятие — одна из самых распространённых проблем, которая приводит к искажению отчётности, ошибкам в расчётах и замедлению работы системы. Чаще всего дубли появляются из-за человеческого фактора (повторный ввод одних и тех же данных), сбоев при обмене данными или некорректной работы обработок. Вручную искать такие записи в больших справочниках или документах — неэффективно, поэтому оптимальное решение — использовать SQL-запросы или встроенный язык .

В этой статье разберём, как найти дубли в разными способами: от простых запросов для новичков до сложных конструкций для опытных пользователей. Особое внимание уделим поиску дублей в справочниках, документах и регистрах, а также рассмотрим, как автоматизировать процесс с помощью обработок. Все примеры актуальны для платформы 1С:Предприятие 8.3 и выше, но majority принципов применимы и к более ранним версиям.

Прежде чем приступать к поиску дублей, важно понять, какие именно данные считаются дублирующимися. Это могут быть:

  • 📌 Полные дубли — записи с одинаковыми значениями во всех полях (например, два одинаковых контрагента с одним и тем же ИНН и названием).
  • 🔍 Частичные дубли — записи с совпадающими ключевыми полями (например, одинаковый артикул товара, но разные наименования).
  • 📅 Дубли по дате/времени — документы с одинаковыми реквизитами, созданные в один день (актуально для заказов, платежей).
📊 Как часто вы сталкиваетесь с дублями в 1С?
Ежедневно
Раз в неделю
Раз в месяц
Редко или никогда

1. Базовые запросы для поиска дублей в справочниках

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

Используем конструкцию ГРУППИРОВКА ПО с условием КОЛИЧЕСТВО() > 1:

ВЫБРАТЬ

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

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

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

ИЗ

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

ГРУППИРОВКА ПО

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

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

ИМЕЮЩИЕ

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

Этот запрос вернёт список ИНН и наименований, которые встречаются в справочнике более одного раза. Чтобы увидеть конкретные записи (а не только группы), модифицируем запрос:

ВЫБРАТЬ

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

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

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

ИЗ

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

ГДЕ

Контрагенты.Ссылка В (

ВЫБРАТЬ

КонтрагентыВложенные.Ссылка

ИЗ

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

ГРУППИРОВКА ПО

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

КонтрагентыВложенные.Наименование

ИМЕЮЩИЕ

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

)

⚠️ Внимание: Если в справочнике есть помеченные на удаление объекты, их нужно исключить из запроса с помощью условия НЕ Контрагенты.ПометкаУдаления. Иначе результат будет искажён.

Для удобства можно добавить в выборку Контрагенты.ЭтоГруппа, чтобы отделить группы справочника от элементов. Также полезно вывести Контрагенты.Код — это поможет быстрее идентифицировать дубли в интерфейсе .

2. Поиск дублей в документах по реквизитам

Дубли в документах чаще всего возникают при повторном вводе одних и тех же операций (например, два одинаковых платежных поручения с одной суммой и контрагентом). Рассмотрим, как найти такие записи в документе ПоступлениеТоваровУслуг.

Допустим, нас интересуют дубли по трём полям: Контрагент, Дата и СуммаДокумента. Запрос будет выглядеть так:

ВЫБРАТЬ

Поступления.Ссылка КАК Ссылка,

Поступления.Дата КАК Дата,

Поступления.Контрагент КАК Контрагент,

Поступления.СуммаДокумента КАК Сумма

ИЗ

Документ.ПоступлениеТоваровУслуг КАК Поступления

ГДЕ

Поступления.Ссылка В (

ВЫБРАТЬ

ПоступленияВложенные.Ссылка

ИЗ

Документ.ПоступлениеТоваровУслуг КАК ПоступленияВложенные

ГРУППИРОВКА ПО

ПоступленияВложенные.Контрагент,

ПоступленияВложенные.Дата,

ПоступленияВложенные.СуммаДокумента

ИМЕЮЩИЕ

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

)

Если нужно найти дубли только за определённый период, добавьте условие по дате:

ИЗ

Документ.ПоступлениеТоваровУслуг КАК Поступления

ГДЕ

Поступления.Дата МЕЖДУ &НачалоПериода И &КонецПериода

Здесь &НачалоПериода и &КонецПериода — параметры запроса, которые можно задать в коде или вручную при выполнении.

💡

Чтобы быстро проанализировать дубли документов, экспортируйте результат запроса в Excel и отсортируйте по полю Сумма. Часто дубли имеют одинаковую сумму, но разные номера.

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

Регистры накопления и сведений — одни из самых «тяжёлых» объектов в , и дубли в них могут серьёзно замедлить работу системы. Рассмотрим, как искать повторяющиеся записи в регистре ТоварыНаСкладах.

Предположим, нас интересуют дубли по полям Номенклатура, Склад и Партия. Запрос для регистра сведений:

ВЫБРАТЬ

ТоварыНаСкладах.Номенклатура КАК Номенклатура,

ТоварыНаСкладах.Склад КАК Склад,

ТоварыНаСкладах.Партия КАК Партия,

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

ИЗ

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

ГРУППИРОВКА ПО

ТоварыНаСкладах.Номенклатура,

ТоварыНаСкладах.Склад,

ТоварыНаСкладах.Партия

ИМЕЮЩИЕ

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

Для регистра накопления (например, Продажи) логика аналогична, но можно добавить проверку по Регистратор (документ, который сформировал запись):

ВЫБРАТЬ

Продажи.Номенклатура КАК Номенклатура,

Продажи.Контрагент КАК Контрагент,

Продажи.Регистратор КАК Регистратор,

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

ИЗ

РегистрНакопления.Продажи КАК Продажи

ГРУППИРОВКА ПО

Продажи.Номенклатура,

Продажи.Контрагент,

Продажи.Регистратор

ИМЕЮЩИЕ

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

⚠️ Внимание: В регистрах сведений дубли могут появляться из-за некорректных обработок загрузки данных или ошибок в коде. Перед удалением дублей обязательно проверьте, не связаны ли они с актуальными движениями документов.
Тип объекта Пример запроса Что ищем
Справочник ГРУППИРОВКА ПО ИНН, Наименование Контрагенты с одинаковым ИНН и названием
Документ ГРУППИРОВКА ПО Контрагент, Дата, Сумма Повторные платежи или поступления
Регистр сведений ГРУППИРОВКА ПО Номенклатура, Склад Повторные записи остатков
Регистр накопления ГРУППИРОВКА ПО Контрагент, Регистратор Дублирующиеся движения документов

4. Поиск дублей с учётом неточных совпадений

Иногда дубли не являются полными копиями, но имеют незначительные различия (например, опечатки в наименовании или разные пробелы). В таких случаях помогают функции СОКРЛП() (сокращение лишних пробелов) и НРЕГ() (приведение к нижнему регистру).

Пример запроса для поиска контрагентов с «похожими» наименованиями:

ВЫБРАТЬ

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

СОКРЛП(НРЕГ(Контрагенты.Наименование)) КАК НормализованноеНаименование,

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

ИЗ

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

ГРУППИРОВКА ПО

СОКРЛП(НРЕГ(Контрагенты.Наименование))

ИМЕЮЩИЕ

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

Этот запрос найдёт записи типа:

  • 📛 "ООО Ромашка" и "ООО РОМАШКА" (разный регистр),
  • 📛 "ИП Иванов" и "ИП Иванов " (лишние пробелы),
  • 📛 "Альфа-Банк" и "Альфа Банк" (разные разделители).

Для более сложного сравнения можно использовать функцию ЛЕВ() (левовое вхождение) или НАЙТИ(). Например, чтобы найти контрагентов с похожими началами названий:

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

НАЙТИ(НРЕГ(Контрагенты.Наименование), "росс") > 0

Это вернёт всех контрагентов, в названии которых есть сочетание "росс" (независимо от регистра).

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

Для поиска контрагентов с похожими (но не идентичными) ИНН используйте конструкцию:

ВЫБРАТЬ

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

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

ИЗ

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

ГДЕ

ЛЕВ(Контрагенты.ИНН, 8) = "7707083"

Этот запрос найдёт все ИНН, которые начинаются с 7707083 (например, 7707083852 и 7707083123).

5. Автоматизация поиска дублей с помощью обработок

Если дубли в базе появляются регулярно, целесообразно создать обработку для автоматического поиска. Это сэкономит время и позволит запускать проверку по расписанию.

Пример простой обработки на встроенном языке :

Процедура НайтиДублиКонтрагентов()

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

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

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

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

|ИЗ

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

|ГДЕ

| Контрагенты.Ссылка В (

| ВЫБРАТЬ

| КонтрагентыВложенные.Ссылка

| ИЗ

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

| ГРУППИРОВКА ПО

| КонтрагентыВложенные.ИНН,

| КонтрагентыВложенные.Наименование

| ИМЕЮЩИЕ

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

| )";

Результат = Запрос.Выполнить();

Выборка = Результат.Выбрать();

ТаблицаРезультатов = Новый ТаблицаЗначений;

ТаблицаРезультатов.Колонки.Добавить("Ссылка");

ТаблицаРезультатов.Колонки.Добавить("ИНН");

ТаблицаРезультатов.Колонки.Добавить("Наименование");

Пока Выборка.Следующий() Цикл

НоваяСтрока = ТаблицаРезультатов.Добавить();

НоваяСтрока.Ссылка = Выборка.Ссылка;

НоваяСтрока.ИНН = Выборка.ИНН;

НоваяСтрока.Наименование = Выборка.Наименование;

КонецЦикла;

ОткрытьФормуМодально("Обработка.ФормаРезультатовПоискаДублей", ТаблицаРезультатов);

КонецПроцедуры

Эта обработка:

  1. Выполняет запрос на поиск дублей.
  2. Сохраняет результат в ТаблицуЗначений.
  3. Открывает форму с результатами для дальнейшего анализа.

Для удобства можно добавить в обработку:

  • 📅 Фильтр по дате создания (чтобы искать только свежие дубли).
  • 🔄 Кнопку «Удалить дубли» (с подтверждением и логированием).
  • 📊 Экспорт в Excel для дальнейшей работы.

Гибкий запрос с параметрами (даты, справочники)

Возможность сохранения результата в файл

Логирование действий (какие дубли были удалены)

Проверка прав пользователя перед удалением-->

6. Поиск дублей в больших базах: оптимизация запросов

Если база содержит миллионы записей, простые запросы с ГРУППИРОВКА ПО могут работать слишком долго. В таких случаях используйте:

  1. Индексы — убедитесь, что поля, по которым ищутся дубли, проиндексированы в конфигурации.
  2. Временные таблицы — разбивайте сложные запросы на части.
  3. Пакетную обработку — ищите дубли порциями (например, по 10 000 записей).

Пример оптимизированного запроса с использованием временной таблицы:

ВЫБРАТЬ

Документы.Ссылка КАК Ссылка

ПОМЕСТИТЬ ВТДокументы

ИЗ

Документ.РеализацияТоваровУслуг КАК Документы

ГДЕ

Документы.Дата МЕЖДУ &НачалоПериода И &КонецПериода;

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

ВЫБРАТЬ

ВТДокументы.Ссылка КАК Ссылка,

Документы.Контрагент КАК Контрагент,

Документы.СуммаДокумента КАК Сумма

ИЗ

ВТДокументы КАК ВТДокументы

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК Документы

ПО ВТДокументы.Ссылка = Документы.Ссылка

ГДЕ

ВТДокументы.Ссылка В (

ВЫБРАТЬ

ВТДокументыВложенные.Ссылка

ИЗ

ВТДокументы КАК ВТДокументыВложенные

ГРУППИРОВКА ПО

ВТДокументыВложенные.Контрагент,

ВТДокументыВложенные.СуммаДокумента

ИМЕЮЩИЕ

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

)

Использование временных таблиц ускоряет выполнение запроса в 2–5 раз при работе с большими объёмами данных (от 500 000 записей).

⚠️ Внимание: В некоторых конфигурациях (например, 1С:ERP или 1С:УТ 11) длинные запросы могут блокировать базу. Запускайте их в нерабочее время или на тестовой копии.

7. Типичные ошибки при поиске дублей и как их избежать

При работе с запросами на поиск дублей пользователи часто допускают ошибки, которые приводят к:

  • 🐢 Зависанию системы (слишком сложные запросы без оптимизации).
  • 🗑️ Потере данных (удаление не тех записей).
  • 🔍 Ложным срабатываниям (например, когда разные контрагенты случайно имеют одинаковый ИНН).

Разберём самые распространённые ошибки и способы их избежать:

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

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

ВЫБРАТЬ

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

Номенклатура.Артикул КАК Артикул

ИЗ

Справочник.Номенклатура КАК Номенклатура

ГДЕ

НЕ Номенклатура.ЭтоГруппа

И Номенклатура.Ссылка В (

ВЫБРАТЬ

НоменклатураВложенная.Ссылка

ИЗ

Справочник.Номенклатура КАК НоменклатураВложенная

ГДЕ

НЕ НоменклатураВложенная.ЭтоГруппа

ГРУППИРОВКА ПО

НоменклатураВложенная.Артикул

ИМЕЮЩИЕ

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

)

8. Как устранить найденные дубли

Найти дубли — половина дела. Главное — правильно их устранить, не нарушив целостность данных. Рассмотрим основные способы:

  1. Объединение записей:
    • 🔗 Перенесите все ссылки с дубля на основную запись (например, в документах или регистрах).
    • 🗑️ Удалите дублирующую запись.
  • Пометка на удаление:
    • 🗓️ Если дубли старые и не используются, пометьте их на удаление.
    • 🔄 Периодически очищайте базу от помеченных объектов.
    • Исправление вручную:
      • ✍️ Если дубли имеют важные различия, редактируйте их вручную.

    Пример кода для объединения дублей в справочнике Контрагенты:

    Процедура ОбъединитьДубли(ОсновнаяЗапись, ДублирующаяЗапись)
    

    // Переносим ссылки из документов

    Запрос = Новый Запрос;

    Запрос.Текст =

    "ВЫБРАТЬ

    | Документы.Ссылка КАК Ссылка

    |ИЗ

    | Документ.ЗаказПокупателя КАК Документы

    |ГДЕ

    | Документы.Контрагент = &ДублирующаяЗапись";

    Запрос.УстановитьПараметр("ДублирующаяЗапись", ДублирующаяЗапись);

    Результат = Запрос.Выполнить();

    Выборка = Результат.Выбрать();

    Пока Выборка.Следующий() Цикл

    Док = Выборка.Ссылка.ПолучитьОбъект();

    Док.Контрагент = ОсновнаяЗапись;

    Док.Записать();

    КонецЦикла;

    // Удаляем дублирующую запись

    ДублирующаяЗапись.УстановитьПометкуУдаления(Истина);

    ДублирующаяЗапись.Записать();

    КонецПроцедуры

    ⚠️ Внимание: Перед массовым объединением дублей проверьте, нет ли у них уникальных движений в регистрах. Например, если дублирующий контрагент использовался в закрытых периодах, его удаление может нарушить отчётность.
    💡

    Перед удалением дублей всегда проверяйте, не используются ли они в актуальных документах или регистрах. Лучше сначала пометьте их на удаление и протестируйте работу системы.

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

    ❓ Как найти дубли в справочнике, если у них разные ИНН, но похожие названия?

    Используйте функцию РАЗНОСТЬСТРОК() или ЛЕВ() для сравнения начальных частей наименований. Пример:

    ВЫБРАТЬ
    

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

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

    РАЗНОСТЬСТРОК(Контрагенты.Наименование, Контрагенты2.Наименование) КАК Разница

    ИЗ

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

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

    ГДЕ

    Контрагенты.Ссылка <> Контрагенты2.Ссылка

    И ЛЕВ(Контрагенты.Наименование, 10) = ЛЕВ(Контрагенты2.Наименование, 10)

    Этот запрос найдёт пары контрагентов, у которых первые 10 символов названия совпадают.

    ❓ Можно ли найти дубли в 1С без использования запросов?

    Да, но это менее эффективно. Альтернативные способы:

    • 🔍 Поиск по справочнику с сортировкой по ключевому полю (например, ИНН) и ручным сравнением.
    • 📊 Отчёты — некоторые конфигурации (например, 1С:УТ) имеют встроенные отчёты по дублям.
    • 🤖 Внешние обработки — например, "Поиск и замена дублей" из каталога 1С.

    Однако для больших баз (от 10 000 записей) ручные методы неэффективны.

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

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

    ВЫБРАТЬ
    

    Счета.Контрагент КАК Контрагент,

    Счета.Дата КАК Дата,

    Счета.СуммаДокумента КАК Сумма,

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

    ИЗ

    Документ.СчётНаОплатуПокупателю КАК Счета

    ГРУППИРОВКА ПО

    Счета.Контрагент,

    Счета.Дата,

    Счета.СуммаДокумента

    ИМЕЮЩИЕ

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

    Если нужно увидеть конкретные документы, использу