Поиск, замена и удаление дубликатов (тонкий и толстый клиент)


Обработка работает на платформе 8.2. Имеет как обычную, так и управляемую форму. Предназначена для поиска дублирующихся объектов по установленным правилам сравнения, замены и последующей пометки на удаления и при необходимости полного удаления дубликатов.

Обработка постоена по типу помощника. На первой странице устанавливается объект метаданных с которым предполагается работать. Список ограничен справочниками и видами характеристик (может быть расширен как угодно раскоменнтированием пары строк в коде). Для принятия решения что на что менять можно настроить критерии определения заменяемых объектов (заполнение реквизитов не учитывает табличные части). Правила сравнения должны включать как минимум одно правило. Вид сравнения «Равенство» и «Содержит». Условие «Содержит» работает аналогично конструкции «Подобно» в запросе. Виды сравнения могут быть расширены раскомментированием строк в коде. Дополнительные сравнения на Владельца и ЭтоГруппа жестко вшито в код во избежании роковых ошибок. В отборе можно ограничить выборку проверяемых данных. На второй странице можно просмотреть и отредактировать (удалить или поменять местами) список дубликатов. На третьей странице можно просмотреть список объектов, в которых будет произведена замена. На этом этапе ещё можно отказаться от выполнения без обработки. На последней странице можно выбрать либо пометку на удаление либо полное удаление замененных объектов. Физическое удаление производится после контроля ссылочной целостности. Обработка не учитывает структуру базы данных, поэтому после удаления дубликатов надо проверить на дубликаты и подчиненные объекты метаданных (например, после удаления дубликатов контрагентов, надо проверить на дубликаты и договора контрагентов).

Внимание! Обработка производит массовую модификацию объектов баз данных и (при определенных настройках) полное удаление объектов.  Поэтому знакомство с обработкой рекомендуется проводить на копиях баз данных. Разработчик ответственности за потерянные данные не несет.

Обработка включает в себя модифицированные части кода из широко известных универсальных обработок 1С.

23 Comments

  1. makas

    Полезная штука. судя по описанию!

    Reply
  2. students

    Привет. Данная обработка может менять ссылки у подчиненных объектов как стандартная из УПП. Например (Контрагент — договора)

    Reply
  3. Kobra_RU

    (2) students,

    Это вопрос? Я стандартные обработки как в УПП так и в других типовых конфигурациях не использую во избежании (был опыт использования встроенной обработки перепроведения документов).

    Эта обработка не учитывает подчинение, т.к. не знает структуру конфигурации. Если мы делаем из 2 контрагентов одного, то результатом будет 1 контрагент с 2 договорами контрагентов (в простейшем случае) от первого и от второго контрагента по одному. Поэтому после этой операции надо чистить и договора контрагентов со сравнением на равенство организации и вида договора, например, или ещё по наименованию (если договоры учтены по номерам и т.п.).Аналогично, номенклатура и единицы измерения номенклатуры (в торговле и УПП) и т.п. А вообще попробуйте на копии базы и все сами увидите…

    Reply
  4. ds_square

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

    Reply
  5. sorb

    Единственная адекватная замена типовой обработке «Поиск и замена дублирующихся элементов справочников» под УФ. Автору плюс и спасибо.

    Reply
  6. prodines

    Нет возможности вести поиск по владельцу — для тех же договоров контрагента.

    Reply
  7. Kobra_RU

    При поиске дубликатов владелец учитывается автоматически. То есть, если мы ведем поиск по совпадению наименований договоров, например, то в качестве дубликатов будут отобраны только те договора, в которых совпадает и наименование и владелец договора. Этот дополнительный элемент поиска жестко встроен в код во избежании фатальных невосстановимых изменений данных (например, замены во всех документах единицы измерения лишь одной номенклатуры).

    Reply
  8. kuza_87

    Автору большое спасибо, для управляемых форм больше ничего не нашел, а самому писать было лень

    Reply
  9. nmgmex

    потестируем) автору плюс

    Reply
  10. kuza_87

    Дубли на удаление нормально помечает, но не удаляет. Что сделать чтобы удалить дубли?

    Reply
  11. Kobra_RU

    Самое простое — не установлен флажок «Удалить замененные объекты с контролем ссылочной целостности».

    А вообще различных вариантов может быть много. Например, у пользователя нет прав на удаление объектов.

    Если объекты удаляются, но не все, надо запустить поиск ссылок и проверить не остались ли ещё не замененные реквизиты. Такие случаи могут быть вызваны особенностями конкретной конфигурации.

    Reply
  12. kuza_87

    (11) самое интересное что в тонком клиенте ссылки не удаляются, а в толстом под этим же пользователем с такими же правами удаляются.

    Reply
  13. Kobra_RU

    Проверил ещё раз на базе (файловый вариант). Все вроде бы работает нормально.

    Обработка полностью открытая, поэтому советую Вам посмотреть в отладчике, в чем там проблема. Код там несложный и понятный, можно сделать выводы даже в серверном варианте без отладочного режима (функция УдалитьОбъектыНаКлиенте()). Если этим займетесь, сообщите о конкретной обнаруженной проблеме — исправлю…

    Reply
  14. BTRVODKA

    Спасибо автору за публикацию!

    Reply
  15. Aleksand1985

    Стартмани сняли, а файл не скачал! Обидно!

    Reply
  16. krolikofff

    Имеется файловая база, БП 2.0 (2.0.56.2), толстый клиент. На этапе «замена ссылок на дубликаты» возникает ошибка — Индекс находится за границами массива

    {Форма.ФормаТК.Форма(1105)}: Индекс находится за границами массива
    Если Измерение.Тип.СодержитТип(ТипЗнч(Ссылка)) И НаборЗаписи[0][Измерение.Имя]=Ссылка Тогда
    

    Как быть?

    Reply
  17. Kobra_RU

    Скорректировал в обработке код.

    Вы можете исправить у себя:

          Для Каждого Измерение ИЗ Последовательность.Измерения Цикл
    Если Измерение.Тип.СодержитТип(ТипЗнч(Ссылка)) И НаборЗаписи[0][Измерение.Имя]=Ссылка Тогда
    НаборЗаписи[0][Измерение.Имя] = ПравильныйЭлемент;
    НадоЗаписывать = Истина;
    КонецЕсли;
    КонецЦикла;
    

    на

         Если НаборЗаписи.Количество() > 0 Тогда
    Для Каждого Измерение ИЗ Последовательность.Измерения Цикл
    Если Измерение.Тип.СодержитТип(ТипЗнч(Ссылка)) И НаборЗаписи[0][Измерение.Имя]=Ссылка Тогда
    НаборЗаписи[0][Измерение.Имя] = ПравильныйЭлемент;
    НадоЗаписывать = Истина;
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;
    

    Показать

    Reply
  18. krolikofff

    (17) Спасибо!!!

    Reply
  19. sobeyko2008

    А как галочки поставить на то что я хочу удалить. Или удалять обязательно все объекты которые нашла обработка? А если я так не хочу?))

    Reply
  20. Kobra_RU

    Эта обработка задумана как технологический инструмент для быстрого и окончательного сноса дубликатов, возникших, например, при ошибках в схемах конвертации данных. Практически все видели, например, две валюты «рубли» с разными кодами. Если же есть желание оставить дубликаты, их можно только пометить на удаление, потом с помощью обработки «Удаление помеченных объектов» удалить, то что необходимо удалить, с остальных пометку снять. И, конечно, Вы можете доработать эту обработку.

    Reply
  21. Ifboop_Figure

    Отличная обработка. Спасибо!

    Reply
  22. @Sonya

    Очень нужная обработка, спасибо! Было бы супер, если бы функция Поменять местами работала для всех выделенных строк!

    Reply
  23. artfa

    годная обработка,

    но в УТ 10.3 и РТ 1.0 ни в какую не захотела удалять одну и ту же (обмен УТ<>РТ), позицию номенклатуры, пришлось удалить непосредственно,

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *