Восстановление ссылок по GUID (универсальная)



Недавно после нестандартного обмена данными я увидел знакомое <Объект не найден>  в полях некоторых элементов базы-приемника и задался вопросом, как можно быстро в базе-источнике найти объект, от которого уехал только ID ? Особенно если реквизит в базе-приемнике составного типа или вообще его тип не ясен… И в ответ написал обработку.

Итак, обработка позволяет по ID определить, какому объекту базы данных он принадлежит. Поддерживаются все ссылочные типы базы данных.

Реализовано три режима: поиск ссылки, создание объекта БД и получение ссылки для объекта БД.

 

Поиск ссылки

Идентификатор, вводимый в поле «Известный GUID» может иметь различные виды:

1. Объект не найден (25:888ba76e-9ccf-aed3-4a2f-1d8152ba0f17)

Обычно такие ссылки, они же «битые» появляются в результате обмена данными, когда ссылка на объект выгрузилась, а сам объект — нет.

2. 25:888ba76e-9ccf-aed3-4a2f-1d8152ba0f17

Частный случай пункта 1.

3. 888ba76e-9ccf-aed3-4a2f-1d8152ba0f17

Обычная ссылка, полученная применением функции Строка() к объекту типа «УникальныйИдентификатор()». Может где-нибудь храниться, например в регистре «Соответствие объектов информационных баз».

4. 888ba76e9ccfaed34a2f1d8152ba0f17

Тоже, что и в пункте 3, без дефисов.

Можно вводить (копипастить) в любом формате. Следует отметить, что если в ID присутствует номер таблицы из структуры хранения БД, то объект определяется из этой таблицы. Например, здесь это номер «25» — число перед «:» в идентификаторе.

Далее — нажимаем кнопку «Найти ссылку» и в поле «Результат» появится ссылка на объект БД (если он найдется, если нет, то «битая»). Если объект не найден, то его можно создать — на второй закладке.

Итак, поиск осуществляется:

— если есть номер таблицы, то сразу в этой таблице;

— если номера нет, то по порядку во всех ссылочных типах БД.

 

Создание объекта

Все тоже самое, только кнопка другая — «Создать объект». Система пытается создать объект и установить для него введенный ID. Если удалось, то пользователю предлагается заполнить форму этого объекта и записать его в БД.

Опять же, если в идентификаторе есть номер таблицы, то создаем объект сразу в этой таблице. Если нет, то выбираем тип создаваемого объекта руками.

 

Получение ссылки

По выбранной ссылке на объект БД система получает ее уникальный идентификатор в 3-х вариантах (для удобства).

Также определяется название таблицы хранения объекта, которому принадлежит выбранная ссылка.

 

Области использования обработки

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

Также, например, в регистре «Соответствие объектов информационных баз» хранится это самое соответствие. Объект в текущей базе ясен, а вот что там за ID лежит — вопрос. Хотя, конечно, тут тип можно определить быстро.

Еще бывали моменты, когда есть список ID-шников и попробуй определи, что это за объекты.

Полезно использовать мою обработку вместе с обработками поиска битых ссылок. 

Обработка написана под 8.2, но можно использовать и для 8.1 с предварительной конвертацией. Формы — обычные.

 

Планируемые доработки

1. Получение ID для любой ссылки. Реализовано.

2. Возможность передавать список ID-шников для поиска ссылок в базе-источнике.

3. Получение ID ссылки на объект в другой базе через COM-соединение и наоборот.

23 Comments

  1. Walther_008

    Добавь флажок отключения проверок при записи, а то вот ситуация:

    Ошибка при восстановлении объекта:

    Не заполнено наименование реквизита.

    {ВнешняяОбработка.ВосстановлениеСсылокПоGUID.МодульОбъекта(266)}: Ошибка при вызове метода контекста (Записать): Не удалось записать: «Дополнительные реквизиты»!

    Конфигурация: БП 2.0.37

    Тип битой ссылки: ПВХ.СвойстваОбъектов

    Reply
  2. s_a_r_u_m_a_n

    (1) Хорошее замечание ) обновил обработку, но не совсем так. Непосредственная запись в базу новых объектов подразумевает под собой соблюдение правил этой базы для ее объектов и ее логики работы. Например, установка номеров документов или кодов справочников, не говоря уже о реквизитах, заполняемых по умолчанию для новых создаваемых объектов. Или установки владельца для подчиненного элемента. Поэтому на этапе создания объекта БД по GUID, когда уже известен тип объекта, я сделал вызов формы этого объекта. Пользователь сам заполняет нужные поля и, при необходимости, записывает элемент в БД.

    Также внесены мелкие исправления и доработки.

    Reply
  3. Новенький_2209

    http://infostart.ru/public/80438/

    http://infostart.ru/public/86266/

    Хоть ссылки что ли поставьте у себя.

    Reply
  4. s_a_r_u_m_a_n

    (3) а причём тут эти ссылки ? обработка написана не опираясь на указанные статьи

    Reply
  5. Новенький_2209

    (4) и что? Вы же статью написали? Скорее всего люди, прочитавшие ее, и скачавшие вашу обработку, возможно захотят узнать еще что-то по этой теме. Эти ссылки как раз в кассу.

    Reply
  6. s_a_r_u_m_a_n

    (5) для этого на сайте есть поиск

    http://infostart.ru/catalog/?s&q=%C2%EE%F1%F1%F2%E0%ED%EE%E2%EB%E5%ED%E8%E5+%E1%E8%F2%FB%­F5+%F1%F1%FB%EB%EE%EA&sa=%CD%E0%E9%F2%E8&typelist=gallery

    Reply
  7. Новенький_2209

    Мда.

    Ну автор вы. Надеюсь политики сокрытия и изобретательства себя окупит.

    Удачи.

    Reply
  8. s_a_r_u_m_a_n

    (7) тролли, сгиньте..

    разве автор обязан отчитываться перед вами за разработки, которые он написал и «за просто так» их выложил для всеобщего пользования ? если хотите — пользуйтесь разработкой, если не хотите — не пользуйтесь..

    набивать себе рейтинг пустыми комментами — дело неблагодарное..

    удачи !

    Reply
  9. s_a_r_u_m_a_n

    (7) и да, новенький_2209, судя по логину вы недавно на сайте, а здесь общаются люди грамотные и знающие русский язык.. держите планку.

    Reply
  10. Odinsov

    Спасибо, пригодилось.

    Reply
  11. pvb2003

    Для УФ будет версия (нужно УТ 11.1 и БП 3.0)?

    Reply
  12. wingnut

    Все замечательно, вот только хорошо бы написать, что при восстановлении из строки GUID надо переворачивать.

    Так что для строки Объект не найден (25:888ba76e9ccfaed34a2f1d8152ba0f17)

    GUID будет выглядеть

    1d8152ba0f17-4a2f-aed3-888b-a76e9ccf

    Я понимаю, что автор подразумевает, что это все уже знают. Однако желательно это тоже указать в тексте.

    Reply
  13. s_a_r_u_m_a_n

    (11) pvb2003, возможно будет, но пока писать не планировал

    Reply
  14. s_a_r_u_m_a_n

    (12) wingnut, вы что-то путаете, никакого «переворачивания» там нет.. посмотрите код обработки — там явно написано, каким образом формируется строка гуида для восстановления ссылки.. обработку писал давно, но эту часть только что специально проверил )

    Reply
  15. An-rey

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

    Может поправите? Последовательность выполнения во вложенном файле.

    Reply
  16. METAL

    (15) An-rey, у меня та же проблема, только в УТ10.3 со справочником Номенклатура

    А именно, при поиске по

    <Объект не найден> (68:ba460050568268dc11e370615466d1f3)

    вроде бы результат есть, внизу пишет Номенклатура, то есть тип определился верно, и в поле Результат что-то есть, но там опять же битая ссылка, правда другая

    <Объект не найден> (68:11e370615466d1f368dc5682ba460050)

    См.скрин http://i.imgur.com/UAoDRkR.png

    При этом точно известно, что нужный объект в искомой базе есть

    И если его указать на третьей закладке и получить GUID и помощью этой обработки, то получается вот такое

    <Объект не найден> (68:5466d1f3-7061-11e3-ba46-0050568268dc)

    И вот по этой строке уже нормально находит!

    (12) wingnut, похоже, Вы правы!

    Reply
  17. METAL

    Таким образом, перед поиском строку из 1С:Предприятия

    <Объект не найден> (68:ba46-0050568268dc-11e3-7061-5466d1f3)

    надо преобразовать в

    <Объект не найден> (68:5466d1f3-7061-11e3-ba46-0050568268dc)

    Если представить ГУИД в исходной строке как 5 групп цифр:

    1. 4 символа

    2. 12 симв.

    3. 4

    4. еще 4

    5. и 8

    В итоге алгоритм напрашивается такой

    1. Сперва разбить строку на эти группы символов

    2. Потом переставить группы в таком порядке

    5-4-3-1-2

    3. Полученное вставить в обработку из данной публикации

    Протестировал вручную, на моём примере работает!

    Надеюсь, автор в ближайшее время поправит разработку!

    Reply
  18. METAL

    Роман (автор), отправил Вам в личку доработанный вариант, можете использовать при желании

    Reply
  19. s_a_r_u_m_a_n

    (17) METAL, ничего преобразовывать не надо. Изначально (посмотрите по тексту описания обработки выше) описан формат битой ссылки 8-4-4-4-12, т.е. как Вы написали во втором варианте, к которому преобразовывали ( <Объект не найден> (68:5466d1f3-7061-11e3-ba46-0050568268dc) ). Другой вопрос — откуда Вы взяли битую ссылку такого рода «<Объект не найден> (68:ba460050568268dc11e370615466d1f3)», которая на Ваш взгляд перевёрнутая и некорректная ?

    Reply
  20. s_a_r_u_m_a_n

    (17) METAL, обработка писалась под 8.2 ещё, возможно что-то в 8.3 или её подрелизах поменялось.

    Reply
  21. b-dm

    Так и не получилось найти ни одну ссылку по GUID. Не рекомендую обработку к использованию.

    Reply
  22. METAL

    (21) Дмитрий, вот пжаааллллста, попробуйте, только прошу — отпишитесь о результатах!

    Reply
  23. gala2009

    (22) Спасибо! воспользовалась вашей обработкой, работает. ссылку по guid нашла, создать объект (удаленное подразделение) получилось

    Reply

Leave a Comment

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