Дублирующиеся записи в базе 1С:Предприятие — одна из самых распространённых проблем, которая приводит к искажению отчётности, ошибкам в расчётах и замедлению работы системы. Чаще всего дубли появляются из-за человеческого фактора (повторный ввод одних и тех же данных), сбоев при обмене данными или некорректной работы обработок. Вручную искать такие записи в больших справочниках или документах — неэффективно, поэтому оптимальное решение — использовать SQL-запросы или встроенный язык 1С.
В этой статье разберём, как найти дубли в 1С разными способами: от простых запросов для новичков до сложных конструкций для опытных пользователей. Особое внимание уделим поиску дублей в справочниках, документах и регистрах, а также рассмотрим, как автоматизировать процесс с помощью обработок. Все примеры актуальны для платформы 1С:Предприятие 8.3 и выше, но majority принципов применимы и к более ранним версиям.
Прежде чем приступать к поиску дублей, важно понять, какие именно данные считаются дублирующимися. Это могут быть:
- 📌 Полные дубли — записи с одинаковыми значениями во всех полях (например, два одинаковых контрагента с одним и тем же ИНН и названием).
- 🔍 Частичные дубли — записи с совпадающими ключевыми полями (например, одинаковый артикул товара, но разные наименования).
- 📅 Дубли по дате/времени — документы с одинаковыми реквизитами, созданные в один день (актуально для заказов, платежей).
1. Базовые запросы для поиска дублей в справочниках
Начнём с самого простого — поиска полных дублей в справочниках. Предположим, у вас есть справочник Контрагенты, и вы хотите найти записи с одинаковыми ИНН и Наименованием.
Используем конструкцию ГРУППИРОВКА ПО с условием КОЛИЧЕСТВО() > 1:
ВЫБРАТЬ
Контрагенты.ИНН КАК ИНН,
Контрагенты.Наименование КАК Наименование,
КОЛИЧЕСТВО(*) КАК Количество
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГРУППИРОВКА ПО
Контрагенты.ИНН,
Контрагенты.Наименование
ИМЕЮЩИЕ
КОЛИЧЕСТВО(*) > 1
Этот запрос вернёт список ИНН и наименований, которые встречаются в справочнике более одного раза. Чтобы увидеть конкретные записи (а не только группы), модифицируем запрос:
ВЫБРАТЬ
Контрагенты.Ссылка КАК Ссылка,
Контрагенты.ИНН КАК ИНН,
Контрагенты.Наименование КАК Наименование
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.Ссылка В (
ВЫБРАТЬ
КонтрагентыВложенные.Ссылка
ИЗ
Справочник.Контрагенты КАК КонтрагентыВложенные
ГРУППИРОВКА ПО
КонтрагентыВложенные.ИНН,
КонтрагентыВложенные.Наименование
ИМЕЮЩИЕ
КОЛИЧЕСТВО(*) > 1
)
⚠️ Внимание: Если в справочнике есть помеченные на удаление объекты, их нужно исключить из запроса с помощью условия НЕ Контрагенты.ПометкаУдаления. Иначе результат будет искажён.
Для удобства можно добавить в выборку Контрагенты.ЭтоГруппа, чтобы отделить группы справочника от элементов. Также полезно вывести Контрагенты.Код — это поможет быстрее идентифицировать дубли в интерфейсе 1С.
2. Поиск дублей в документах по реквизитам
Дубли в документах чаще всего возникают при повторном вводе одних и тех же операций (например, два одинаковых платежных поручения с одной суммой и контрагентом). Рассмотрим, как найти такие записи в документе ПоступлениеТоваровУслуг.
Допустим, нас интересуют дубли по трём полям: Контрагент, Дата и СуммаДокумента. Запрос будет выглядеть так:
ВЫБРАТЬ
Поступления.Ссылка КАК Ссылка,
Поступления.Дата КАК Дата,
Поступления.Контрагент КАК Контрагент,
Поступления.СуммаДокумента КАК Сумма
ИЗ
Документ.ПоступлениеТоваровУслуг КАК Поступления
ГДЕ
Поступления.Ссылка В (
ВЫБРАТЬ
ПоступленияВложенные.Ссылка
ИЗ
Документ.ПоступлениеТоваровУслуг КАК ПоступленияВложенные
ГРУППИРОВКА ПО
ПоступленияВложенные.Контрагент,
ПоступленияВложенные.Дата,
ПоступленияВложенные.СуммаДокумента
ИМЕЮЩИЕ
КОЛИЧЕСТВО(*) > 1
)
Если нужно найти дубли только за определённый период, добавьте условие по дате:
ИЗ
Документ.ПоступлениеТоваровУслуг КАК Поступления
ГДЕ
Поступления.Дата МЕЖДУ &НачалоПериода И &КонецПериода
Здесь &НачалоПериода и &КонецПериода — параметры запроса, которые можно задать в коде или вручную при выполнении.
Чтобы быстро проанализировать дубли документов, экспортируйте результат запроса в Excel и отсортируйте по полю Сумма. Часто дубли имеют одинаковую сумму, но разные номера.
3. Поиск дублей в регистрах накопления и сведений
Регистры накопления и сведений — одни из самых «тяжёлых» объектов в 1С, и дубли в них могут серьёзно замедлить работу системы. Рассмотрим, как искать повторяющиеся записи в регистре ТоварыНаСкладах.
Предположим, нас интересуют дубли по полям Номенклатура, Склад и Партия. Запрос для регистра сведений:
ВЫБРАТЬ
ТоварыНаСкладах.Номенклатура КАК Номенклатура,
ТоварыНаСкладах.Склад КАК Склад,
ТоварыНаСкладах.Партия КАК Партия,
КОЛИЧЕСТВО(*) КАК КоличествоЗаписей
ИЗ
РегистрСведений.ТоварыНаСкладах КАК ТоварыНаСкладах
ГРУППИРОВКА ПО
ТоварыНаСкладах.Номенклатура,
ТоварыНаСкладах.Склад,
ТоварыНаСкладах.Партия
ИМЕЮЩИЕ
КОЛИЧЕСТВО(*) > 1
Для регистра накопления (например, Продажи) логика аналогична, но можно добавить проверку по Регистратор (документ, который сформировал запись):
ВЫБРАТЬ
Продажи.Номенклатура КАК Номенклатура,
Продажи.Контрагент КАК Контрагент,
Продажи.Регистратор КАК Регистратор,
КОЛИЧЕСТВО(*) КАК Количество
ИЗ
РегистрНакопления.Продажи КАК Продажи
ГРУППИРОВКА ПО
Продажи.Номенклатура,
Продажи.Контрагент,
Продажи.Регистратор
ИМЕЮЩИЕ
КОЛИЧЕСТВО(*) > 1
⚠️ Внимание: В регистрах сведений дубли могут появляться из-за некорректных обработок загрузки данных или ошибок в коде. Перед удалением дублей обязательно проверьте, не связаны ли они с актуальными движениями документов.
| Тип объекта | Пример запроса | Что ищем |
|---|---|---|
| Справочник | ГРУППИРОВКА ПО ИНН, Наименование |
Контрагенты с одинаковым ИНН и названием |
| Документ | ГРУППИРОВКА ПО Контрагент, Дата, Сумма |
Повторные платежи или поступления |
| Регистр сведений | ГРУППИРОВКА ПО Номенклатура, Склад |
Повторные записи остатков |
| Регистр накопления | ГРУППИРОВКА ПО Контрагент, Регистратор |
Дублирующиеся движения документов |
4. Поиск дублей с учётом неточных совпадений
Иногда дубли не являются полными копиями, но имеют незначительные различия (например, опечатки в наименовании или разные пробелы). В таких случаях помогают функции СОКРЛП() (сокращение лишних пробелов) и НРЕГ() (приведение к нижнему регистру).
Пример запроса для поиска контрагентов с «похожими» наименованиями:
ВЫБРАТЬ
Контрагенты.Наименование КАК Наименование,
СОКРЛП(НРЕГ(Контрагенты.Наименование)) КАК НормализованноеНаименование,
КОЛИЧЕСТВО(*) КАК Количество
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГРУППИРОВКА ПО
СОКРЛП(НРЕГ(Контрагенты.Наименование))
ИМЕЮЩИЕ
КОЛИЧЕСТВО(*) > 1
Этот запрос найдёт записи типа:
- 📛
"ООО Ромашка"и"ООО РОМАШКА"(разный регистр), - 📛
"ИП Иванов"и"ИП Иванов "(лишние пробелы), - 📛
"Альфа-Банк"и"Альфа Банк"(разные разделители).
Для более сложного сравнения можно использовать функцию ЛЕВ() (левовое вхождение) или НАЙТИ(). Например, чтобы найти контрагентов с похожими началами названий:
ВЫБРАТЬ
Контрагенты.Наименование КАК Наименование
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
НАЙТИ(НРЕГ(Контрагенты.Наименование), "росс") > 0
Это вернёт всех контрагентов, в названии которых есть сочетание "росс" (независимо от регистра).
Как найти дубли по частичному совпадению ИНН?
Для поиска контрагентов с похожими (но не идентичными) ИНН используйте конструкцию:
ВЫБРАТЬ
Контрагенты.ИНН КАК ИНН,
Контрагенты.Наименование КАК Наименование
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
ЛЕВ(Контрагенты.ИНН, 8) = "7707083"
Этот запрос найдёт все ИНН, которые начинаются с 7707083 (например, 7707083852 и 7707083123).
5. Автоматизация поиска дублей с помощью обработок
Если дубли в базе появляются регулярно, целесообразно создать обработку для автоматического поиска. Это сэкономит время и позволит запускать проверку по расписанию.
Пример простой обработки на встроенном языке 1С:
Процедура НайтиДублиКонтрагентов()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка,
| Контрагенты.ИНН КАК ИНН,
| Контрагенты.Наименование КАК Наименование
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.Ссылка В (
| ВЫБРАТЬ
| КонтрагентыВложенные.Ссылка
| ИЗ
| Справочник.Контрагенты КАК КонтрагентыВложенные
| ГРУППИРОВКА ПО
| КонтрагентыВложенные.ИНН,
| КонтрагентыВложенные.Наименование
| ИМЕЮЩИЕ
| КОЛИЧЕСТВО(*) > 1
| )";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
ТаблицаРезультатов = Новый ТаблицаЗначений;
ТаблицаРезультатов.Колонки.Добавить("Ссылка");
ТаблицаРезультатов.Колонки.Добавить("ИНН");
ТаблицаРезультатов.Колонки.Добавить("Наименование");
Пока Выборка.Следующий() Цикл
НоваяСтрока = ТаблицаРезультатов.Добавить();
НоваяСтрока.Ссылка = Выборка.Ссылка;
НоваяСтрока.ИНН = Выборка.ИНН;
НоваяСтрока.Наименование = Выборка.Наименование;
КонецЦикла;
ОткрытьФормуМодально("Обработка.ФормаРезультатовПоискаДублей", ТаблицаРезультатов);
КонецПроцедуры
Эта обработка:
- Выполняет запрос на поиск дублей.
- Сохраняет результат в
ТаблицуЗначений. - Открывает форму с результатами для дальнейшего анализа.
Для удобства можно добавить в обработку:
- 📅 Фильтр по дате создания (чтобы искать только свежие дубли).
- 🔄 Кнопку «Удалить дубли» (с подтверждением и логированием).
- 📊 Экспорт в Excel для дальнейшей работы.
Гибкий запрос с параметрами (даты, справочники)
Возможность сохранения результата в файл
Логирование действий (какие дубли были удалены)
Проверка прав пользователя перед удалением-->
6. Поиск дублей в больших базах: оптимизация запросов
Если база 1С содержит миллионы записей, простые запросы с ГРУППИРОВКА ПО могут работать слишком долго. В таких случаях используйте:
- Индексы — убедитесь, что поля, по которым ищутся дубли, проиндексированы в конфигурации.
- Временные таблицы — разбивайте сложные запросы на части.
- Пакетную обработку — ищите дубли порциями (например, по 10 000 записей).
Пример оптимизированного запроса с использованием временной таблицы:
ВЫБРАТЬ
Документы.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТДокументы
ИЗ
Документ.РеализацияТоваровУслуг КАК Документы
ГДЕ
Документы.Дата МЕЖДУ &НачалоПериода И &КонецПериода;
//////////////////////////////////////////////
ВЫБРАТЬ
ВТДокументы.Ссылка КАК Ссылка,
Документы.Контрагент КАК Контрагент,
Документы.СуммаДокумента КАК Сумма
ИЗ
ВТДокументы КАК ВТДокументы
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК Документы
ПО ВТДокументы.Ссылка = Документы.Ссылка
ГДЕ
ВТДокументы.Ссылка В (
ВЫБРАТЬ
ВТДокументыВложенные.Ссылка
ИЗ
ВТДокументы КАК ВТДокументыВложенные
ГРУППИРОВКА ПО
ВТДокументыВложенные.Контрагент,
ВТДокументыВложенные.СуммаДокумента
ИМЕЮЩИЕ
КОЛИЧЕСТВО(*) > 1
)
Использование временных таблиц ускоряет выполнение запроса в 2–5 раз при работе с большими объёмами данных (от 500 000 записей).
⚠️ Внимание: В некоторых конфигурациях (например, 1С:ERP или 1С:УТ 11) длинные запросы могут блокировать базу. Запускайте их в нерабочее время или на тестовой копии.
7. Типичные ошибки при поиске дублей и как их избежать
При работе с запросами на поиск дублей пользователи часто допускают ошибки, которые приводят к:
- 🐢 Зависанию системы (слишком сложные запросы без оптимизации).
- 🗑️ Потере данных (удаление не тех записей).
- 🔍 Ложным срабатываниям (например, когда разные контрагенты случайно имеют одинаковый ИНН).
Разберём самые распространённые ошибки и способы их избежать:
| Ошибка | Последствия | Как избежать |
|---|---|---|
| Поиск дублей без фильтра по дате | Запрос выполняется слишком долго | Всегда ограничивайте период поиска |
| Удаление дублей без резервной копии | Потеря важных данных | Создавайте бэкап перед массовыми изменениями |
| Игнорирование помеченных на удаление объектов | В результатах появляются «мусорные» записи | Добавляйте условие НЕ ПометкаУдаления |
| Сравнение только по одному полю (например, только по ИНН) | Ложные срабатывания (разные контрагенты с одинаковым ИНН) | Используйте комбинацию полей (ИНН + Наименование + КПП) |
Ещё одна типичная проблема — дубли в иерархических справочниках (например, группы и элементы в Номенклатуре). Чтобы их найти, нужно исключить группы из поиска:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка,
Номенклатура.Артикул КАК Артикул
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
НЕ Номенклатура.ЭтоГруппа
И Номенклатура.Ссылка В (
ВЫБРАТЬ
НоменклатураВложенная.Ссылка
ИЗ
Справочник.Номенклатура КАК НоменклатураВложенная
ГДЕ
НЕ НоменклатураВложенная.ЭтоГруппа
ГРУППИРОВКА ПО
НоменклатураВложенная.Артикул
ИМЕЮЩИЕ
КОЛИЧЕСТВО(*) > 1
)
8. Как устранить найденные дубли
Найти дубли — половина дела. Главное — правильно их устранить, не нарушив целостность данных. Рассмотрим основные способы:
-
Объединение записей:
- 🔗 Перенесите все ссылки с дубля на основную запись (например, в документах или регистрах).
- 🗑️ Удалите дублирующую запись.
- 🗓️ Если дубли старые и не используются, пометьте их на удаление.
- 🔄 Периодически очищайте базу от помеченных объектов.
- ✍️ Если дубли имеют важные различия, редактируйте их вручную.
Пример кода для объединения дублей в справочнике Контрагенты:
Процедура ОбъединитьДубли(ОсновнаяЗапись, ДублирующаяЗапись)
// Переносим ссылки из документов
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Документы.Ссылка КАК Ссылка
|ИЗ
| Документ.ЗаказПокупателя КАК Документы
|ГДЕ
| Документы.Контрагент = &ДублирующаяЗапись";
Запрос.УстановитьПараметр("ДублирующаяЗапись", ДублирующаяЗапись);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Док = Выборка.Ссылка.ПолучитьОбъект();
Док.Контрагент = ОсновнаяЗапись;
Док.Записать();
КонецЦикла;
// Удаляем дублирующую запись
ДублирующаяЗапись.УстановитьПометкуУдаления(Истина);
ДублирующаяЗапись.Записать();
КонецПроцедуры
⚠️ Внимание: Перед массовым объединением дублей проверьте, нет ли у них уникальных движений в регистрах. Например, если дублирующий контрагент использовался в закрытых периодах, его удаление может нарушить отчётность.
Перед удалением дублей всегда проверяйте, не используются ли они в актуальных документах или регистрах. Лучше сначала пометьте их на удаление и протестируйте работу системы.
FAQ: Частые вопросы по поиску дублей в 1С
❓ Как найти дубли в справочнике, если у них разные ИНН, но похожие названия?
Используйте функцию РАЗНОСТЬСТРОК() или ЛЕВ() для сравнения начальных частей наименований. Пример:
ВЫБРАТЬ
Контрагенты.Наименование КАК Наименование1,
Контрагенты2.Наименование КАК Наименование2,
РАЗНОСТЬСТРОК(Контрагенты.Наименование, Контрагенты2.Наименование) КАК Разница
ИЗ
Справочник.Контрагенты КАК Контрагенты,
Справочник.Контрагенты КАК Контрагенты2
ГДЕ
Контрагенты.Ссылка <> Контрагенты2.Ссылка
И ЛЕВ(Контрагенты.Наименование, 10) = ЛЕВ(Контрагенты2.Наименование, 10)
Этот запрос найдёт пары контрагентов, у которых первые 10 символов названия совпадают.
❓ Можно ли найти дубли в 1С без использования запросов?
Да, но это менее эффективно. Альтернативные способы:
- 🔍 Поиск по справочнику с сортировкой по ключевому полю (например, ИНН) и ручным сравнением.
- 📊 Отчёты — некоторые конфигурации (например, 1С:УТ) имеют встроенные отчёты по дублям.
- 🤖 Внешние обработки — например, "Поиск и замена дублей" из каталога 1С.
Однако для больших баз (от 10 000 записей) ручные методы неэффективны.
❓ Как найти дубли в документах, если они имеют разные номера, но одинаковые реквизиты?
Используйте группировку по всем значимым полям, кроме номера. Пример для документа СчётНаОплатуПокупателю:
ВЫБРАТЬ
Счета.Контрагент КАК Контрагент,
Счета.Дата КАК Дата,
Счета.СуммаДокумента КАК Сумма,
КОЛИЧЕСТВО(*) КАК Количество
ИЗ
Документ.СчётНаОплатуПокупателю КАК Счета
ГРУППИРОВКА ПО
Счета.Контрагент,
Счета.Дата,
Счета.СуммаДокумента
ИМЕЮЩИЕ
КОЛИЧЕСТВО(*) > 1
Если нужно увидеть конкретные документы, использу