На практике при исправлении ошибок учета или устранении путаницы между объектами справочников возникает задача взаимного обмена ссылками. Например, в базе заведены два сотрудника, и требуется во всех связанных документах, движениях и периодических регистрах заменить ссылки с первого сотрудника на второго, а со второго — на первого. Сложность заключается в том, что типовые инструменты платформы и прикладных библиотек ориентированы на однонаправленное поглощение дублей, а не на их циклический обмен.
В типовых конфигурациях на базе Библиотеки стандартных подсистем (БСП), а также в универсальных сервисных обработках (таких как штатный сервис поиска и удаления дублей или подсистемы инструментов разработчика) операция замены ссылок спроектирована как направленное слияние. Выбирается дублирующий элемент и оригинальный элемент, после чего платформа находит все ссылки на дубль и перенаправляет их на оригинал.
При этом штатный алгоритм выполняет следующие действия:
Если попытаться применить прямое сопоставление двух элементов друг на друга в одной операции или выполнить замену первого объекта на второй без сохранения исходного состояния, произойдет полное схлопывание: обе цепочки документов укажут на один и тот же второй объект, а информация о разделении данных будет безвозвратно утеряна.
Кнопки с названиями вроде «Поменять местами», встречающиеся в некоторых внешних обработках поиска и замены значений, не выполняют перекрестный обмен в базе данных. Они лишь меняют местами значения в полях формы (меняя местами образец для поиска и целевое значение для подстановки), оставляя саму замену строго однонаправленной.
Наиболее надежным и безопасным способом решения задачи в рамках штатных механизмов ссылочной целостности является трехэтапная схема замены с использованием временного служебного элемента-буфера. Этот способ позволяет сохранить все связи без риска потери уникальности ссылок.
Последовательность действий включает следующие шаги:
При использовании программных механизмов БСП, таких как вызов экспортных методов модулей ПоискИУдалениеДублей или ОбщегоНазначения (процедура ЗаменитьСсылки), принцип остается тем же: в структуру замен нельзя передавать циклическую пару без транзитного элемента, так как обработка коллекций записей выполняется последовательно.
В ситуациях, когда требуется не переписывать сотни тысяч движений в регистрах и проведенных документах, а просто скорректировать отображение и принадлежность данных, рассматривают вариант смены реквизитов внутри самих элементов справочника.
Суть подхода состоит в том, что ссылки во всех регистрах и документах остаются неизменными, но у первого элемента меняются наименование, код и связанные персональные данные на данные второго элемента, а у второго — на данные первого (также через промежуточное временное переименование).
Однако применимость этого варианта существенно ограничена архитектурой конкретной конфигурации:
Иногда высказывается предположение о возможности обмена ссылками путем прямых SQL-запросов к таблицам СУБД с обновлением полей ссылочных идентификаторов. Подобный подход категорически не рекомендуется по следующим причинам:
Массовая замена ссылок затрагивает ключевые таблицы базы данных и приводит к блокировкам и модификации существенного объема записей. Перед выполнением любых операций по замене необходимо: