Как правильно объединить дублирующиеся элементы справочника и перенести все ссылки на один нужный объект в 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом Управленческий учет
← К списку

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

Прежде чем приступить к конкретным решениям, давайте выясним причину и общие принципы, которые помогут нам действовать осознанно:

  1. Сущность ссылки в 1С: Важно понимать, что ссылка в 1С — это особый тип данных. Мы можем прочитать ее, чтобы получить доступ к объекту, но не можем напрямую изменить или записать саму ссылку, в отличие от реквизитов объекта. Изменение ссылки на объект подразумевает изменение всех мест, где на него ссылаются другие объекты (документы, регистры, другие справочники).
  2. Предотвращение дублей: Для поддержания чистоты данных в базе мы настоятельно рекомендуем регулярно проверять справочники на наличие дублей и устранять причины их возникновения. Это может быть настройка контроля уникальности, обучение пользователей или регламенты ввода данных.
  3. Тестирование — наш лучший друг: Все операции по массовой замене ссылок и удалению дублей являются потенциально опасными. Мы настоятельно рекомендуем выполнять их сначала на резервной копии или тестовой базе. Это позволит нам избежать необратимых последствий для рабочей информационной базы и убедиться в корректности выполненных действий.

Теперь рассмотрим подробнее основные подходы к решению нашей задачи.

1. Использование подсистемы "Инструменты разработчика" (от TormozIT)

Если в вашей конфигурации установлена подсистема "Инструменты разработчика", то это, пожалуй, один из самых мощных и гибких инструментов для решения нашей задачи. В её состав входит функционал "Поиск дублей и замена ссылок".

Давайте проанализируем возможности этого инструмента:

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

Упоминание исправления бага в теме форума подтверждает, что подсистема активно поддерживается и развивается её автором, что является дополнительным плюсом при её использовании.

2. Использование встроенной обработки "Поиск и удаление дублей" в типовых конфигурациях 1С

Большинство стандартных конфигураций 1С (например, "Управление Торговлей", "Бухгалтерия Предприятия", "Комплексная автоматизация") включают в себя встроенную обработку "Поиск и удаление дублей". Она также предоставляет функционал для замены ссылок.

Давайте разберем по шагам, как мы можем использовать эту обработку:

  1. Назначение: Эта обработка предназначена для поиска и объединения повторяющихся элементов в справочниках, планах видов характеристик, планах счетов и планах видов расчета.
  2. Механизм работы:
    • Мы выбираем область поиска, например, конкретный справочник (в нашем случае, справочник "Должности").
    • Задаем условия отбора элементов и правила сравнения для поиска дублей. Например, для контрагентов это может быть сравнение по наименованию, ИНН/КПП; для номенклатуры — по артикулу; для должностей — по наименованию или коду, если они уникальны.
    • После выполнения поиска система представит нам список предполагаемых дублей.
  3. Процесс замены:
    • Из найденных дублей мы выбираем один элемент, который будет являться "оригиналом" (правильным).
    • Остальные дублирующие элементы автоматически помечаются на удаление.
    • Все ссылки, которые ранее указывали на помеченные дублирующие элементы, будут заменены ссылками на выбранный нами "оригинал".
    • Окончательное удаление помеченных объектов производится с помощью отдельной обработки "Удаление помеченных объектов", которую мы запускаем после завершения работы с "Поиском и удалением дублей".

Эта обработка является хорошим решением для типовых случаев и не требует дополнительных установок.

3. Программная замена ссылок с использованием БСП (Библиотеки стандартных подсистем)

Для разработчиков, которым необходима автоматизация процесса или интеграция замены ссылок в более сложные бизнес-процессы, существует возможность программной замены ссылок с использованием процедур из Библиотеки стандартных подсистем (БСП). Это позволяет нам создавать собственные механизмы для управления дублями.

Посмотрим на пример использования:

  1. Функция `ЗаменитьСсылки`: В общих модулях БСП, таких как ОбщегоНазначения или ПоискИУдалениеДублей, мы найдем процедуру ЗаменитьСсылки.
  2. Параметры: Эта процедура принимает структуру параметров, ключевым из которых является Соответствие (Map) ПарыЗамен (ReplacementPairs). В этом соответствии ключом выступает старая ссылка (дубль), а значением — новая ссылка (оригинал), на которую мы хотим перебросить все указатели.
  3. Действия с дублями: Мы можем указать, что делать с дублем после успешной замены: помечать на удаление, удалять непосредственно или не предпринимать никаких действий.
  4. Результат выполнения: Процедура возвращает таблицу значений с подробной информацией о выполненных заменах и возможных ошибках (например, ошибки блокировки, изменения данных другим пользователем, ошибки записи). Это позволяет нам контролировать процесс и реагировать на проблемы.

Давайте рассмотрим пример кода для программной замены ссылок:


// Пример программной замены ссылок с использованием БСП
// Предполагаем, что у нас есть старая ссылка (Дубль) и новая ссылка (Оригинал)
// Например, мы хотим перенести все ссылки с одной должности на другую.

// 1. Создаем соответствие, где ключ - старая ссылка, значение - новая ссылка
ПеремещенияСсылок = Новый Соответствие;

// Допустим, у нас есть две ссылки на элементы справочника "Должности"
// Получим ссылки на дублирующую должность и на правильную должность
// (в реальной ситуации мы бы их искали по наименованию, коду и т.д.)
ДублирующаяДолжность = Справочники.Должности.НайтиПоНаименованию("Старая должность (дубль)");
ПравильнаяДолжность  = Справочники.Должности.НайтиПоНаименованию("Правильная должность");

Если ДублирующаяДолжность <> Неопределено И ПравильнаяДолжность <> Неопределено Тогда

    // Добавляем пару для замены
    ПеремещенияСсылок.Вставить(ДублирующаяДолжность, ПравильнаяДолжность);

    // 2. Формируем структуру параметров для процедуры ЗаменитьСсылки
    ПараметрыЗамены = Новый Структура;
    ПараметрыЗамены.Вставить("ПарыЗамен", ПеремещенияСсылок);
    // Что делать с дублем после замены: ПометитьНаУдаление, УдалитьНепосредственно, НеДействовать
    ПараметрыЗамены.Вставить("ДействиеСДублем", Перечисления.ДействияСДублями.ПометитьНаУдаление); 
    // Можно добавить другие параметры, если это требуется конкретной процедурой ЗаменитьСсылки
    // Например, "РежимЗамещенияВНезависимыхРегистрах" и т.д.

    // 3. Вызываем процедуру замены ссылок
    // В зависимости от версии БСП и конфигурации, процедура может находиться в разных общих модулях.
    // Чаще всего это ОбщегоНазначенияБСП или ПоискИУдалениеДублей.
    РезультатЗамены = ПоискИУдалениеДублей.ЗаменитьСсылки(ПараметрыЗамены); 

    // 4. Анализируем результат
    Если РезультатЗамены.Количество() > 0 Тогда
        Сообщить("Замена ссылок выполнена. Результаты:");
        Для Каждого СтрокаРезультата Из РезультатЗамены Цикл
            Сообщить("   Заменена ссылка " + СтрокаРезультата.СтараяСсылка + " на " + СтрокаРезультата.НоваяСсылка + 
                     ". Тип объекта: " + СтрокаРезультата.ТипОбъектаМетаданных + 
                     ". Объект: " + СтрокаРезультата.Объект + 
                     ". Статус: " + СтрокаРезультата.Статус + 
                     ". Описание ошибки: " + СтрокаРезультата.ОписаниеОшибки);
        КонецЦикла;
    Иначе
        Сообщить("Замена ссылок не потребовалась или не была выполнена.");
    КонецЕсли;

Иначе
    Сообщить("Не удалось найти ДублирующуюДолжность или ПравильнуюДолжность. Проверьте наименования.");
КонецЕсли;

Этот подход дает нам максимальный контроль над процессом и позволяет интегрировать его в любые автоматизированные сценарии.

Мы рассмотрели три основных способа переброса ссылок с одного объекта справочника на другой в 1С. Выбор конкретного метода зависит от ваших потребностей, наличия установленных подсистем и уровня ваших навыков. Всегда помните о важности предварительного тестирования на копии базы!

← К списку