gifts2017

Синхронизация элементов по внутреннему идентификатору

Опубликовал Yermek Zhubatyrov (ermek6) в раздел Обработки - Обработка справочников

Обработка для поиска и замены элементов с сопоставлением по внутренним идентификаторам и возможностью выбора соответствующего элемента вручную

Нужно было настроить конвертацию между двумя не связанными базами

Алгоритм следующий:

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

    Сначала использовать существующий
    Если при использовании существующего система выдает ошибку о совпадении кодов, то генерировать новый код

    Так же возможно установить флаг "Обрабатывать ошибку дублирования кодов". В этом случае модуль присвоит новый код элементу, который уже имеется в БД.
     
  6. Созданный на шаге 5 элемент и элемент из ячейки передается обработке поиска и замены значений (включен в макеты данной обработки), которая фоном заменяет "старый" элемент на "новый"
  7. При щелчке на красной ячейке система спрашивает,  выбрать элемент из имеющихся, либо создать вручную. Если выбирается из имеющихся, то алгоритм аналогичен нажатию синей ячейки, но элемент выбирается вручную
  8. Если выбрано создание нового, то модуль спросит, нужно ли использовать имеющийся идентификатор, или создать новый. Если выбрано "Создать новый", то будут сопоставляться только реквизиты. Внутренний идентификатор будет новым. 
  9. Так же модуль запрашивает, нужно ли генерировать новый код. Так же см. рекомендацию из п.5 
  10. При сопоставлении реквизитов система проверяет, разрешились ли ссылочные поля. Если нет, то задает вопрос о необходимости записи данного элемента, с указанием того, какие реквизиты сопоставить не удалось.
    Рекомендуется отказаться от записи, и сопоставить справочники, которые используются для данного справочника. 
  11. Если есть реквизиты, не разрешенные по ссылкам, и выбрано сохранение элемента, система так же спросит, нужно ли заполнять данные поля. 
    Данную возможность можно использовать для случаев, когда точно известно, что используемые в реквизитах справочники будут синхронизированы позднее

Общая рекомендация состоит в том, что начинать следует сначала с элементарных справочников, которые не содержат совсем, или содержат минимальное количество ссылочных реквизитов

 

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

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


Спасибо за рекомендацию и критику!

Скачать файлы

Наименование Файл Версия Размер
Обработка синхронизации по внутреннему идентификатору 2
.epf 33,27Kb
21.08.15
2
.epf 0,6 33,27Kb Скачать

См. также

Contragent+ 5.0 от 2 500
Подписаться Добавить вознаграждение
Комментарии
1. Андрей Карпов (karpik666) 10.08.15 17:15
Вопрос: как объекты разных баз могут быть сопоставлены по GUID, или предполагается, что это одна база? Тогда советую вначале ознакомиться с поиском на инфостарте, прежде чем публиковать.
2. Yermek Zhubatyrov (ermek6) 11.08.15 06:53
Так же, как это делает обработка конвертации данных.
Вся соль этой обработки в том, что она во первых плзволяет не сопоставленный элемент ("красный перец" и "перец красный" для системы разные элементы справочника) и во-вторых позволяет заменить на ссылочном уровне везде где используется "перец краснaый" на "красный перец", то есть во всех объектах.
3. aspirator 23 (aspirator23) 15.08.15 16:59
(2) ermek6, А так ли уж нужно соответствовать по гуиду? Если между базами есть обмен, то можно связать элементы с разными гуидами, а если нет обмена, то с какой целью гуиды "выравнивать"? Это не в укор, а с целью разобраться.
4. Алексей Смирнов (Vextel) 16.08.15 02:23
Мы для синхронизации разных баз тоже использовали похожий смысл. Но мы не меняли ссылку у существующего объекта, а записывали в типовой стандартный регистр СоотвествиеОбъектовДляОбмена, писали туда найденный элемент(который тоже находили, скажем по ИНН+КПП) и УИД из другой базы.
5. Yermek Zhubatyrov (ermek6) 19.08.15 23:36
Разумеется, это одно из возможных решений, и любое из предложенных выше имеет право на существование.
Почему я реализовал такой вариант:
  • Спортивный интерес. Думаю, что это основная причина
  • Данная процедура, по хорошему, запускается единыжды для баз, между которыми планируется вести обмен с помощью конвертации данных
  • Мне кажется, что самый быстрый поиск все таки по внутреннему идентификатору. Замеры не делал, все интуитивно, поэтому прошу камнями не забрасывать