Как в 1С найти дубликаты документов по контрагенту и сумме?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

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

Способ 1: Простой запрос для поиска групп дублей

Самый простой способ — это сгруппировать все документы по интересующим нас полям (Контрагент и Сумма) и посчитать количество документов в каждой группе. Если количество больше единицы, значит, в этой группе есть дубликаты.

Этот запрос не покажет сами документы, но выведет список пар "Контрагент - Сумма", по которым существуют дубли. Это удобно для быстрой диагностики.

Пример запроса:


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

Разберем по шагам:

  1. ВЫБРАТЬ ...: Мы выбираем контрагента, сумму и считаем количество документов (КОЛИЧЕСТВО(...)) в каждой группе.
  2. ИЗ Документ.РеализацияГП ...: Указываем, что данные берем из документов "РеализацияГП". Вы можете заменить это на любой другой нужный вам тип документа, например, Документ.ЗаказКлиента.
  3. ГДЕ ...: Устанавливаем фильтр по периоду, чтобы не анализировать всю базу данных.
  4. СГРУППИРОВАТЬ ПО ...: Это ключевая часть. Мы объединяем в группы все записи, у которых поля Контрагент и Сумма полностью совпадают.
  5. ИМЕЮЩИЕ КОЛИЧЕСТВО(...) > 1: После группировки мы отбираем только те группы, в которых оказалось больше одного документа. Это и есть наши дубли.

Хотя этот запрос полезен для анализа, он не решает главной задачи — не выводит ссылки на сами дублирующиеся документы.

Способ 2: Запрос с временной таблицей для получения ссылок на документы-дубли

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

Полный текст запроса:


// Шаг 1: Находим группы дублей и помещаем их во временную таблицу
ВЫБРАТЬ
    РеализацияГП.Контрагент КАК Контрагент,
    РеализацияГП.Сумма КАК Сумма
ПОМЕСТИТЬ ВТ_Дубли
ИЗ
    Документ.РеализацияГП КАК РеализацияГП
ГДЕ
    РеализацияГП.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
СГРУППИРОВАТЬ ПО
    РеализацияГП.Контрагент,
    РеализацияГП.Сумма
ИМЕЮЩИЕ
    КОЛИЧЕСТВО(РеализацияГП.Ссылка) > 1
;

////////////////////////////////////////////////////////////////////////////////
// Шаг 2: Выбираем все документы, которые попали в найденные группы
ВЫБРАТЬ
    РеализацияГП.Ссылка КАК Ссылка,
    РеализацияГП.Дата,
    РеализацияГП.Контрагент,
    РеализацияГП.Сумма
ИЗ
    Документ.РеализацияГП КАК РеализацияГП
ГДЕ
    (РеализацияГП.Контрагент, РеализацияГП.Сумма) В
        (ВЫБРАТЬ
            ВТ_Дубли.Контрагент,
            ВТ_Дубли.Сумма
        ИЗ
            ВТ_Дубли)
    И РеализацияГП.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания

Проанализируем этот запрос:

  1. Первый пакет запроса:
    • Он очень похож на наш первый пример. Мы находим все сочетания Контрагент и Сумма, которые встречаются более одного раза за указанный период.
    • Ключевое отличие — команда ПОМЕСТИТЬ ВТ_Дубли. Она не выводит результат на экран, а сохраняет его во временной таблице с именем ВТ_Дубли. Эта таблица будет существовать только во время выполнения всего пакета запросов.
  2. Второй пакет запроса:
    • Здесь мы снова обращаемся к таблице документов РеализацияГП.
    • Главная магия происходит в условии ГДЕ. Конструкция (Поле1, Поле2) В (ВЫБРАТЬ Поле1, Поле2 ИЗ ...) позволяет проверить вхождение кортежа (пары значений) в результат вложенного запроса.
    • Мы выбираем все документы, у которых пара (РеализацияГП.Контрагент, РеализацияГП.Сумма) присутствует в нашей временной таблице ВТ_Дубли.
    • Важный момент! Обратите внимание, что во втором запросе мы повторяем условие по дате (И РеализацияГП.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания). Это необходимо, чтобы избежать ошибки. Если не добавить этот фильтр, запрос найдет дубли за нужный период, а затем выведет все документы по этим контрагентам и суммам за всю историю базы, а не только за выбранный интервал.

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

Способ 3: Использование стандартной обработки «Поиск и удаление дублей»

Для пользователей, не владеющих языком запросов, или для более безопасной работы с данными, в большинстве типовых конфигураций 1С есть встроенный инструмент. Он не только находит дубликаты, но и помогает корректно их удалить, заменяя ссылки на удаляемый элемент.

Как его использовать:

  1. Откройте раздел "Администрирование" (или "НСИ и администрирование") -> "Обслуживание" -> "Корректировка данных".
  2. Найдите и запустите обработку "Поиск и удаление дублей".
  3. В поле "Искать в" выберите нужный объект, например, Документ.РеализацияГП.
  4. В таблице "Правила отбора" задайте поля для сравнения. Нажмите "Добавить" и выберите "Контрагент", затем снова "Добавить" и выберите "Сумма".
  5. Нажмите кнопку "Найти дубли".
  6. Обработка выведет сгруппированный список найденных дубликатов. В каждой группе она автоматически предложит один документ как "оригинал" (обычно тот, на который больше ссылок в системе).
  7. Вы можете изменить выбор оригинала. После этого нажмите "Удалить дубли". Программа пометит на удаление все дубликаты и заменит все ссылки на них ссылками на выбранный вами оригинал.

Преимущества этого метода:

Таким образом, если ваша задача — просто получить список дублей для анализа, лучшим решением будет запрос с временной таблицей. Если же вам нужно найти и корректно удалить дубликаты, настоятельно рекомендуется использовать стандартную обработку «Поиск и удаление дублей».

← На главную