Быстрая функция поиска ссылки по УИД(GUID)

11.04.20

Разработка - Инструментарий разработчика

Простая, а самое главное быстрая функция поиска ссылки на объект в информационной базе по УИД(GUID) через запрос.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Быстрая функция поиска ссылки по УИД(GUID):
.epf 8,25Kb
475
475 Скачать (1 SM) Купить за 1 850 руб.

Простая, а самое главное быстрая функция поиска ссылки на объект в информационной базе через запрос.

Часто встречаются задачи, когда по УИД необходимо определить, каким объектом информационной базы он является. Самый простой способ сделать это:

  1. Перебрать все метаданные имеющие ссылки;
  2. Проверить полученную ссылку на существование.

Если с п.1 никаких проблем, так как обход и формирование ссылки происходит довольно быстро,
то вот для п.2 есть сложность, так как стандартный подход, что я встречал было получение объекта и проверка его существования (.ПолучитьОбъект()), что было очень долго для больших конфигураций и по факту приводило к запросу в цикле, так как каждый раз когда проверялось существование  объекта шел запрос к БД на его поиск.

Что сделал я? Все существующие объекты метаданных 1С, у которых возможна ссылка, имеют ряд общих реквизитов. Самый простой пример - «ПометкаУдаления».  Таким образом, мы можем просто составить таблицу всех ссылок и проверить имеет ли «ПометкаУдаления» значение «NULL»:

  • если ДА, значит, она не является валидной ссылкой;
  • если НЕТ, значит, ссылка на объект успешно найдена.

Метаданные, которые могут иметь ссылки:    

  • Справочники;
  • Документы;
  • ПланыВидовХарактеристик;
  • ПланыВидовРасчета;
  • ПланыСчетов;
  • ПланыОбмена;
  • БизнесПроцессы;
  • Задачи;

Чуть ниже в спойлере сама функция, кому этого не хватит, может скачать обработку с примером работы функции (Обработка тестировалась на платформах 8.3.14,15,16 но должна стабильно работать на всех 8x).

 

 

// Осуществляет поиск ссылки по УИД(GUID) или массиву УИДов(GUID)
//
// Параметры:
//   УИД - Строка - Идентификатор строкой.
//       - Массив - Массив идентификаторов строкой.
//
//Возвращаемое значение:
//	- Неопределено - Если не удалось определить ни одну ссылку по параметру УИД.
//	- ЛюбаяСсылка - Если в параметр "УИД" была передана строка.
//	- ТаблицаЗначений  - Если в параметр "УИД" был передан массив строк.
//		* УИД - Строка - Содержит идентифкатор строкой по которому удалось определить ссылку.
//		* Ссылка - ЛюбаяСсылка - Содержит ссылку на объект.
//
// Пример:
// РезультатПоиска = НайтиСсылкуПоУИД("31f35109-f60a-4777-a555-f8a46c5a165d") ...
//
Функция НайтиСсылкуПоУИД(знач УИД) Экспорт
    
    ЭтоМассив = ТипЗнч(УИД) = Тип("Массив");
    
    МассивУидов = Новый Массив;
    Если ЭтоМассив Тогда
        МассивУидов = УИД;
    Иначе
        МассивУидов.Добавить(УИД);
    КонецЕсли;
    
	Результат = Неопределено;
    
    МассивМетаданных = Новый Массив;    
	МассивМетаданных.Добавить(Справочники);
	МассивМетаданных.Добавить(Документы);
	МассивМетаданных.Добавить(ПланыВидовХарактеристик);
	МассивМетаданных.Добавить(ПланыСчетов);
	МассивМетаданных.Добавить(ПланыВидовРасчета);
	МассивМетаданных.Добавить(ПланыОбмена);
	МассивМетаданных.Добавить(БизнесПроцессы);
	МассивМетаданных.Добавить(Задачи);
    
    МассивТипов = Новый Массив; 
    
    Для Каждого СтрМетаданное Из МассивМетаданных Цикл
        Для Каждого Стр Из СтрМетаданное.ТипВсеСсылки().Типы() Цикл
            МассивТипов.Добавить(Стр);
        КонецЦикла;
    КонецЦикла;
        
    ТаблицаСсылок = Новый ТаблицаЗначений;
    ТаблицаСсылок.Колонки.Добавить("УИД"    , Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(36)));
    ТаблицаСсылок.Колонки.Добавить("Ссылка" , Новый ОписаниеТипов(МассивТипов));
    
    Для Каждого СтрМетаданное Из МассивМетаданных Цикл
        Для Каждого Менеджер Из СтрМетаданное Цикл   
            Для Каждого СтрУИД Из МассивУидов Цикл
                Попытка
                    НовСтр = ТаблицаСсылок.Добавить();
                    НовСтр.Ссылка = Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрУИД));
                    НовСтр.УИД    = СтрУИД;
                Исключение
                КонецПопытки;
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;
            
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ТаблицаСсылок.Ссылка КАК Ссылка,
        |   ТаблицаСсылок.УИД КАК УИД
        |ПОМЕСТИТЬ ВТ
        |ИЗ
        |   &ТаблицаСсылок КАК ТаблицаСсылок
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |   ВТ.Ссылка КАК Ссылка,
        |   ВТ.УИД КАК УИД
        |ИЗ
        |   ВТ КАК ВТ
        |ГДЕ
        |   НЕ ВТ.Ссылка.ПометкаУдаления ЕСТЬ NULL";
    
    Запрос.УстановитьПараметр("ТаблицаСсылок",ТаблицаСсылок);
    РезультатЗапроса = Запрос.Выполнить();
    
    Если Не РезультатЗапроса.Пустой() Тогда
        Если ЭтоМассив Тогда
            Результат = РезультатЗапроса.Выгрузить(); 
        Иначе
            ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
            ВыборкаДетальныеЗаписи.Следующий();
            
            Результат = ВыборкаДетальныеЗаписи.Ссылка;
        КонецЕсли;
    КонецЕсли;
    
	Возврат Результат;
		
КонецФункции // НайтиСсылкуПоУИД 

 

 

См. также

SALE! 15%

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159416    872    399    

861

SALE! 15%

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.

8400 7140 руб.

20.08.2024    7769    55    22    

66

Инструментарий разработчика Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9360 руб.

17.05.2024    23433    68    45    

117

SALE! 15%

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 8500 руб.

10.11.2023    10417    36    21    

61

SALE! 15%

Пакетная печать Печатные формы Инструментарий разработчика Программист Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

22200 19980 руб.

06.10.2023    15398    35    7    

70

SALE! 35%

Инструментарий разработчика Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

4800 3120 руб.

14.01.2013    187976    1138    0    

912

SALE! 15%

Инструментарий разработчика Программист 8.3.14 1С:Конвертация данных Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

15000 12750 руб.

07.10.2021    17303    6    32    

42

Инструментарий разработчика Программист Платные (руб)

Менеджер конфигураций 1С — альтернативный стартер информационных баз 1С:Предприятие.

1800 руб.

21.02.2023    7694    8    35    

23
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. CheBurator 2712 12.04.20 04:14 Сейчас в теме
найдет несколько разных объектов - например Справочник.Склады и Справочник.Контрагенты - если у них одинаковый GUID?
SergeRSA; +1 Ответить
2. Kondratenko.as 571 12.04.20 05:52 Сейчас в теме
(1)Да. Если у них одинаковый УИД то вы получите 2 ссылки. Но такого в штатном режиме работы быть не может.
3. awk 744 12.04.20 07:09 Сейчас в теме
(2) Может. Когда есть обмен ситуация достаточно штатная.
bmugem; Dmitri93; fatman78; DrAku1a; SergeRSA; ivanov660; vdscom; user774630; dsdred; CheBurator; +10 Ответить
4. CheBurator 2712 12.04.20 12:36 Сейчас в теме
(3) Именно. когда в КИС - склад. а в, например. ВМС - он и внешний контрагент, и склад.
5. Danil.Potapov 517 13.04.20 09:00 Сейчас в теме
 
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|   ВТ.Ссылка КАК Ссылка,
|   ВТ.УИД КАК УИД
|ИЗ
|   ВТ КАК ВТ
|ГДЕ
|   НЕ ВТ.Ссылка.ПометкаУдаления ЕСТЬ NULL";
Показать


лимит СУБД на количество соединений таблиц не останавливает?
7. Kondratenko.as 571 13.04.20 10:35 Сейчас в теме
(5)УТ, ЗУП, БП, УНФ - все ок.
Можете скинуть ссылку на мануал где это описывается и как это применимо к 1С? (не уверен, что разработчики платформы не учли этот момент)
10. PerlAmutor 155 13.04.20 11:13 Сейчас в теме
(7) Это особенность работы SQL сервера. Не рекомендуют делать больше 15 соединений в запросе (считай 15 типов ссылок). Оптимизатор запросов SQL такое не любит.
12. VKislitsin 1013 13.04.20 21:33 Сейчас в теме
(7)
Можете скинуть ссылку на мануал где это описывается и как это применимо к 1С? (не уверен, что разработчики платформы не учли этот момент)

https://its.1c.ru/db/v8316doc#bookmark:dev:TI000001289
Microsoft SQL Server
● В запросе можно использовать не более 256 таблиц (для версий Microsoft SQL Server 2000 и Microsoft SQL Server 2005)

На SQL Server 2014 и тестовой базе "Управление холдингом" (700Гб) у меня получился запрос с 975-ю соединениями. Отработал корректно. Правда "быстрым" назвать язык не поворачивается - работало 4 минуты (поиск одной ссылки). Перебором менеджеров срабатывает за несколько секунд.
13. Kondratenko.as 571 13.04.20 22:56 Сейчас в теме
(12)Спасибо за информацию. Можете если есть время конечно, сделать замер на поиск 10,100 - ссылок. Очень интересно отвалится или нет + сравнить с перебором. насколько разница по времени. Есть идея разбить на порции (не одним запросом, а скажем по ограниченному количеству метаданных). К сожалению у меня максимальная база это УТ на 180 гб. И можно узнать характеристики сервера и саму платформу?

Мои:
CPU: 8 core Intel Xeon E3-1270 v6 3.8 GHz
RAM: 30 ГБ
Debian 8
8.3.16.1148
PG 11.6
14. VKislitsin 1013 13.04.20 23:48 Сейчас в теме
(13) Я думаю, тут оборудованием измерять нет смысла. Я выполнял на таком: 24 * E5-2690 v4 * 2.6GHz, RAM 256 Гб, Win Server 2012r2, 8.3.10.2561, MS SQL Server 2014.

Проводить дальнейшие тесты, к сожалению, сейчас нет возможности. У меня задачи по массовому поиску ссылок нет.

Что касается путей совершенствования - если это делалось для ИсторииДанных, то на мой взгляд, лучше ограничить типы метаданных только теми, для которых включено использование Истории.
15. Kondratenko.as 571 14.04.20 03:29 Сейчас в теме
(14) "Для которых включено использование Истории" - не все так просто, в пользовательском интерфейсе можно выключить использование Истории и при этом версии не удалятся и будут висеть мертвым грузом. Я думаю на след недели напишу статью по истории данных, как ток дождусь ответа от 1С, по поводу ошибки платформы которую им скинул. Но спасибо за ваш комментарий.
16. VKislitsin 1013 14.04.20 07:56 Сейчас в теме
(15) Андрей, а зачем получать объект с целью проверки существования ссылки?
для п.2 есть сложность, так как стандартный подход, что я встречал было получение объекта и проверка его существования (.ПолучитьОбъект()),

Вот такой код работает быстро:
ТекстЗапроса = "
        |ВЫБРАТЬ
        |    Ссылка
        |ИЗ
        |    Справочник.ИмяСправочника КАК Таблица
        |ГДЕ
        |    Ссылка = &Ссылка
        |";
			
    Запрос = Новый Запрос;
    Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("Ссылка", ИскомаяСсылка);
Возврат НЕ Запрос.Выполнить().Пустой();
Показать

И если надо пакетно, то можно собрать циклом километровый запрос со всеми типами через ОБЪЕДИНИТЬ ВСЕ. По крайней мере, это избавит от кучи левых соединений.
Mails79; Kondratenko.as; bulpi; +3 Ответить
19. Kondratenko.as 571 14.04.20 12:31 Сейчас в теме
(16)Вы правы тоже уже к подобному пришел, вчера экспериментировал. Работает на порядок быстрее.
20. AneJIbcuH 40 14.04.20 16:51 Сейчас в теме
в БСП есть функция
ОбщегоНазначения.СсылкаСуществует(ПроверяемаяСсылка)
Там запрос, почти как в (16)
21. Kondratenko.as 571 14.04.20 19:18 Сейчас в теме
(20)Она в данном случаи не подходит. Там используется конструкция "Ссылка.Метаданные().ПолноеИмя()" - чтобы определить саму таблицу для обращения, что в данном случаи лишняя операция и ее использование это запрос в цикле будет.
36. NoRazum 29 18.10.21 12:11 Сейчас в теме
(12) в ЕРП у меня запрос еще дольше выполнялся. Слишком много соединений.
9. PerlAmutor 155 13.04.20 11:09 Сейчас в теме
(5) Кстати дельное замечание. В ERP при поиске документа по штрих-коду приблизительно та же ситуация возникает, если пользователи отбор не выставили на форме. SQL сервер таких издевательств не выдерживает и просит упростить запрос, ошибка на английском, что-то типа "query too complex". Также возникает, когда составляют кривые запросы для РегистраБухгалтерии, где Субконто имеет большое количество возможных типов.

Подобные запросы могут быстро отрабатываться, а могут вообще не отрабатываться, висеть неделями. Причем это зависит от многих факторов, а не только от данных в ИБ.
11. Kondratenko.as 571 13.04.20 15:22 Сейчас в теме
(9)Спасибо. Учту в дальнейших разработках.
6. Evg-Lylyk 4841 13.04.20 09:13 Сейчас в теме
(0) А перечисление? ПометкаУдаления почему не Ссылка.Ссылка
Интересно, а для какой задачи это нужно?
8. Kondratenko.as 571 13.04.20 10:47 Сейчас в теме
(6) Перечисление создается в конфигураторе, вы не сможете его получить через метод "ПолучитьСсылку()".
Можно и ссылку и "ВерсияДанных" - главное это узнать что он не null.
Тут не принципиально.


"Интересно, а для какой задачи это нужно?"

Я ее реализовал когда писал обработку по работе с Историей данных (новый механизм платформы).
17. bulpi 217 14.04.20 11:58 Сейчас в теме
Не понял. А что мешает просто проверить Ссылка.Пустая() ?
18. nomad_irk 76 14.04.20 12:01 Сейчас в теме
(17)Тем что "битая" ссылка - не пустая, "пустой" - объект по этой ссылке.
Азверин; Kondratenko.as; +2 Ответить
22. lvictor58 137 21.04.20 10:02 Сейчас в теме
А разве нельзя проверить на "битую" ссылку используя ПолучитьОбъект()? И не городить весь этот огород с запросами.
23. nomad_irk 76 21.04.20 11:04 Сейчас в теме
(22)Просто представьте, что записей в 1-ой таблице 1Миллиард, битых ссылок при этом - 100к.
Чтобы узнать битые ссылки придется проверять весь 1Миллиард записей.
24. lvictor58 137 21.04.20 11:44 Сейчас в теме
На объект мы проверяем конкретную ссылку полученную по конкретному УИДу. И насколько я себе представлял сущность самого уид-а - это его уникальность. Даже из миллиарда объектов не должно быть нескольких с одинаковым. Какой же он тогда нах... УНИКАЛЬНЫЙ!
25. Kondratenko.as 571 21.04.20 22:42 Сейчас в теме
(24) Уникальность гарантируется только в 1 базе. Если вы делаете обмен между несколькими базами с сохранением оригиналов УИД. То такое может быть и бывает часто.
26. nomad_irk 76 21.04.20 22:53 Сейчас в теме
(24)Их не будет в одной таблице несколько, а вот в разных таблицах - запросто.
Вы, видимо, слабо себе представляете, сколько потребуется времени на проверку 1Миллиарда записей на битые ссылки.
27. lvictor58 137 22.04.20 13:16 Сейчас в теме
(26) Действительно слабо...
по крайней мере сколько не пытался по УИД-у получить объект всегда получал ожидаемый, а не понятно какой из случайно выбранной таблицы.
(24). А если Вы делаете обмен между разными базами, то ежу понятно, что поиск объекта надо проводить не по внутреннему ИД. Что бы потом не выгребать косяки, и не получать по башке за такую организацию работ по обмену данными.
Ну да ладно, не та это тема, что бы ее 2 дня мусолить.
28. Skotarev 15 27.05.21 19:22 Сейчас в теме
А возможно ли определить тип объекта по guid?
Столкнулся с проблемой при работе в web-клиенте.
Поясню проблему, в тонком клиенте открываем форму документа - все хорошо, открываем ее же в веб - падает в ошибку и ссылается на какой-то тип данных, но указан только идентификатор.
29. kembrik 10 04.06.21 15:28 Сейчас в теме
(28) Наверное неактуально уже, но я в такой ситуации обработочку маленькую держу наготове, туда - ссылку на косячный док, и вывожу в текстовое поле его уже сериализованный в Json

СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, КосячныйОбъект, НазначениеТипаXML.Явное);
СериализованнаяСтрока = ЗаписьJSON.Закрыть();

А там уже поиск по косячному GUID и вуаля, "все деньги на экране")
30. Skotarev 15 05.06.21 10:07 Сейчас в теме
(29) Актуально, очень даже.
Только это совсем не документ, скорее всего.
В частности, УТ 11, клиент-серверная, серверная часть на Debian.
Проявляется в форме списка документа "Заказ клиента", справочника "Номенклатура".
31. kembrik 10 07.06.21 12:49 Сейчас в теме
(30) А киньте ошибочку, посмотрим

На раз речь идёт про форму списка, скорее всего динамическую, тут можно запрос динамического списка в конструктор запросов запросов кинуть и галочку "вместо ссылок показывать GUID", а там уже поиском

опять же, можно обойти все метаданные, и по Гуиду попробовать получить объект, где получит там и искомое. Но это мы практически вернемся к топику обсуждения
32. Skotarev 15 07.06.21 13:20 Сейчас в теме
(31) Скриншот приложил.
Прикрепленные файлы:
34. kembrik 10 07.06.21 16:15 Сейчас в теме
(32) Тут непросто всё, тут Гуид как тип пробует выступить, что то у вас в клиент-серверной сериализации сбоит. Есть "Информация для технической поддержки" там получим примерное место падение, ну или в технологическом журнале посмотреть. Ладно, это уже беседа не в рамках темы, в ЛС лучше
35. Skotarev 15 07.06.21 16:55 Сейчас в теме
(34) Буду очень признателен за помощь.
В "Информация для технической поддержки" ровно то же что и в сообщении.
В л/с написать почему-то не удается.
33. Skotarev 15 07.06.21 13:36 Сейчас в теме
(31) Скорее это какой-то объект формы, но понять какой - не могу, в тонком клиенте все ведь хорошо.
37. zabaluev 464 01.12.21 22:23 Сейчас в теме
Совсем не быстрая функция поиска.
Прикрепленные файлы:
38. romulanin 24.12.21 10:59 Сейчас в теме
Долго выполняется поиск. В разы дольше чем через привычной получить объект. Поиск делал подразделения обычным способом секунд 10, а через ваш вариант больше 3 минут
39. andrey_sag 55 13.12.22 10:29 Сейчас в теме
Слямзил часть кода, вроде наоборот упростил. Зачем запрос? Почему исключено брать помеченные на удаление?
 Для Каждого СтрМетаданное Из МассивМетаданных Цикл
        Для Каждого Менеджер Из СтрМетаданное Цикл   
            Для Каждого СтрУИД Из МассивУидов Цикл
				Попытка
					НайденнаяСсылка = Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрУИД));
					Если СтрНайти(Строка(НайденнаяСсылка), "Объект не найден") = 0 Тогда
	                    НовСтр = ТаблицаСсылок.Добавить();
	                    НовСтр.Ссылка = НайденнаяСсылка;
					КонецЕсли;
                Исключение
                КонецПопытки;
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;
Возврат ТаблицаСсылок.ВыгрузитьКолонку("Ссылка");
Показать
Прикрепленные файлы:
НайтиСсылку.epf
Aleksey3A; Goggy; nagaitseff; +3 1 Ответить
40. ILNIK 34 15.12.22 09:34 Сейчас в теме
(39) это не исключение брать помеченные на удаление, а проверка на существование объекта , видимо
mihuilka; +1 Ответить
41. AneJIbcuH 40 22.12.22 06:01 Сейчас в теме
(39) СтрНайти(Строка(НайденнаяСсылка), "Объект не найден") = 0

Не оптимально при большом количестве объектов. Строка(НайденнаяСсылка) - это неявный запрос на получение представления, а значит запрос в цикле.
42. Alex Y 178 14.02.23 15:21 Сейчас в теме
Взял обработку "как есть". Запустил на небольшой БП3. После нескольких минут получил:

Невосстановимая ошибка
Ошибка при выполнении запроса POST к ресурсу /e1cib/logForm:
по причине:
Ошибка СУБД:
Microsoft SQL Server Native Client 11.0: При оптимизации запроса обработчик запросов исчерпал пространство стека. Упростите запрос.
HRESULT=80040E14, SQLSrvr: SQLSTATE=42000, state=1, Severity=11, native=8621, line=1
43. Green_Mann 18.04.23 12:15 Сейчас в теме
Пробовал предложенный автором алгоритм на ERP, окончания не дождался.
Скомуниздил немного идею и чуть переработал, отрабатывает за секунды.
Вдруг кому-то пригодится.

Большое спасибо автору за материал!

Если Не ЗначениеЗаполнено(GUID) Тогда
		Возврат;
	КонецЕсли;
	
	СоответствиеМетаданных = Новый Соответствие;    
	
	СоответствиеМетаданных.Вставить("Справочники",				Справочники);
	СоответствиеМетаданных.Вставить("Документы",				Документы);
	СоответствиеМетаданных.Вставить("ПланыВидовХарактеристик",	ПланыВидовХарактеристик);
	СоответствиеМетаданных.Вставить("ПланыСчетов",				ПланыСчетов);
	СоответствиеМетаданных.Вставить("ПланыВидовРасчета",		ПланыВидовРасчета);
	СоответствиеМетаданных.Вставить("ПланыОбмена",				ПланыОбмена);
	СоответствиеМетаданных.Вставить("БизнесПроцессы",			БизнесПроцессы);
	СоответствиеМетаданных.Вставить("Задачи",					Задачи);
	
	Объект.Ссылки.Очистить();
	
	УИДляПоиска	= Новый УникальныйИдентификатор(СокрЛП(GUID));
	
	Для Каждого ОбъектМетаданных Из СоответствиеМетаданных Цикл
		
		Для Каждого Стр Из Метаданные[ОбъектМетаданных.Ключ] Цикл
			НайденнаяСсылка	= ОбъектМетаданных.Значение[Стр.Имя].ПолучитьСсылку(УИДляПоиска);
			Если ОбщегоНазначения.СсылкаСуществует(НайденнаяСсылка) Тогда
				Объект.Ссылки.Добавить().Ссылка	= НайденнаяСсылка;
			КонецЕсли;
		КонецЦикла;
		
	КонецЦикла;
	
	ОбщегоНазначения.СообщитьПользователю("Конец");
Показать
Прикрепленные файлы:
ПоискСсылкиПоGUID.epf
Aragor7; kabantus; Хвостатос; kpdozer; +4 Ответить
44. Hans 3 31.05.23 10:49 Сейчас в теме
(43) Кривая поделка у автора. А у тебя норм.
47. Serg2000mr 670 24.10.23 23:44 Сейчас в теме
(43) Так будет в 2 раза быстрее:
Код
45. Hans 3 31.05.23 10:56 Сейчас в теме
Автор зачем то сделал

| ВТ КАК ВТ
|ГДЕ
| НЕ ВТ.Ссылка.ПометкаУдаления ЕСТЬ NULL";

И пошло соединение со всеми таблицами базы.
46. user1274184 28.09.23 09:40 Сейчас в теме
Криво. Роняет базу с ошибкой:

Невосстановимая ошибка
Ошибка при выполнении запроса POST к ресурсу /e1cib/logForm:
по причине:
Ошибка СУБД:
54000: ERROR: joins can have at most 32767 columns
48. simuljakr 203 23.01.24 19:06 Сейчас в теме
Переделал под обычные формы.
Не возражаете, если запощу от своего имени ? (со ссылкой на Вашу разработку)
49. Smilk 26.01.24 14:38 Сейчас в теме
    Для Каждого СтрМетаданное Из МассивМетаданных Цикл
        Для Каждого Менеджер Из СтрМетаданное Цикл   
            Для Каждого СтрУИД Из МассивУидов Цикл
				
				Попытка 
					СсылкаНаОбъект = Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрУИД));
					
					Если СтрНайти(СсылкаНаОбъект,"<Объект не найден>") = 0 Тогда 
						Если ОбщегоНазначения.СсылкаСуществует(СсылкаНаОбъект) Тогда
							НовСтр = ТаблицаСсылок.Добавить();
							НовСтр.Ссылка = СсылкаНаОбъект;
							НовСтр.УИД    = СтрУИД;
						КонецЕсли;
					КонецЕсли; 
					
                Исключение
				КонецПопытки; 
				
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;
Показать


Вот так работает тоже быстро.
50. adeptis 10 05.03.24 14:49 Сейчас в теме
Хорошая штука, работает. Только добавил возможность добавления вместо GUID прямо строки с ошибкой типа:
<Объект не найден> (84:bf5600145e3710ab11dda4c605dbe824).

Вообще хорошо стало!
51. kuzyara 2090 04.09.24 09:26 Сейчас в теме
есть ещё такая обработка от Юры
Прикрепленные файлы:
ПомощникРаботыСИдентификаторамиОбъектов.epf
Оставьте свое сообщение