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