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