Имя: Пароль:
1C
1С v8
КД 3.0 Непонятно работает СначалаПоУникальномуИдентификаторуПотомПоПолямПоиска
0 soopchik
 
29.11.20
02:21
Всем доброго времени суток.

Не могу понять как же всё таки искать сначала по GUID а потом по полям поиска
По коду наблюдаю такой алгоритм
что после поиска по GUID
Программно формируется текст запроса в который потом добавляется левое соединение с регистром ПубличныеИдентификаторыСинхронизируемыхОбъектов
И условие на то что записей в нём с найденной ссылкой не должно быть
О чем в целом и сказано на ИТС
"Если в загружаемом объекте есть информация об исходном GUID и вариант идентификации для объекта "По GUID" или "По GUID и полям поиска", то поиск выполняется среди всех объектов заданного типа, кроме тех, для которых в РПИ уже установлены соответствия."
(хотя возможно это и не об этом но очень уж похоже)
И выходит так что объекты с одними и теми же полями поиска но с разными GUID все равно дублируются, т.к.
первый создаётся в базе и для него создается запись в регистре
а для второго не подбирается ссылка созданная при первом потому что для этой самой подобранной по полям поиска ссылке есть запись в этом регистре
БСП 3.0.3.341

Не подскажите как все же обойти эту ситуацию, без допилов в БСП ?
Я так понимаю что там все должно быть не сложно и я просто где-то не там смотрю.
Спасибо.
1 hhhh
 
29.11.20
03:08
(0) в каком модуле и в какой процедуре смотрите?
2 soopchik
 
29.11.20
12:47
(1) модуль: ОбменДаннымиXDTOСервер
Функция СтруктураОбъектаXDTOВДанныеИБ(
В ней ДанныеИБ = СсылкаОбъектаПоСвойствамОбъектаXDTO(

Фрагмент кода:

Если ПоискЗапросом Тогда
            Запрос = Новый Запрос;
            
            ТекстЗапроса =
            "ВЫБРАТЬ
            |    Таблица.Ссылка КАК Ссылка
            |ИЗ
            |    [ПолноеИмя] КАК Таблица
            |ГДЕ
            |    [УсловиеОтбора]";
            
            Отбор = Новый Массив;
            
            Для Каждого ПолеПоиска Из ПоляПоиска Цикл
                
                Если ОбменДаннымиПовтИсп.ЭтоСтроковыйРеквизитНеограниченнойДлины(ПравилоКонвертации.ПолноеИмя, ПолеПоиска.Ключ) Тогда
                    
                    ОтборСтрокой = "ВЫРАЗИТЬ(Таблица.[Ключ] КАК СТРОКА([ДлинаСтроки])) = &[Ключ]";
                    ОтборСтрокой = СтрЗаменить(ОтборСтрокой, "[Ключ]", ПолеПоиска.Ключ);
                    ОтборСтрокой = СтрЗаменить(ОтборСтрокой, "[ДлинаСтроки]", Формат(СтрДлина(ПолеПоиска.Значение), "ЧГ=0"));
                    Отбор.Добавить(ОтборСтрокой);
                    
                Иначе
                    
                    Отбор.Добавить(СтрЗаменить("Таблица.[Ключ] = &[Ключ]", "[Ключ]", ПолеПоиска.Ключ));
                    
                КонецЕсли;
                
                Запрос.УстановитьПараметр(ПолеПоиска.Ключ, ПолеПоиска.Значение);
                
            КонецЦикла;
            
            УсловиеОтбора = СтрСоединить(Отбор, " И ");
            
            Если АнализироватьПубличныеИдентификаторы Тогда
                // Из поиска необходимо исключить уже сопоставленные ранее объекты.
                ТекстСоединения = "    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПубличныеИдентификаторыСинхронизируемыхОбъектов КАК ПубличныеИдентификаторы
                    |    ПО ПубличныеИдентификаторы.Ссылка = Таблица.Ссылка И ПубличныеИдентификаторы.УзелИнформационнойБазы = &УзелОбмена";
                УсловиеОтбора = УсловиеОтбора + Символы.ПС + "    И ПубличныеИдентификаторы.Ссылка is null";
                ТекстЗапроса = СтрЗаменить(ТекстЗапроса,  "ГДЕ", ТекстСоединения + Символы.ПС + "    ГДЕ");
                Запрос.УстановитьПараметр("УзелОбмена", УзелОбмена);
            КонецЕсли;
3 soopchik
 
29.11.20
12:50
(1) Переменная оооооо по условию (т.е. всегда):

АнализироватьПубличныеИдентификаторы = ВариантИдентификации = "СначалаПоУникальномуИдентификаторуПотомПоПолямПоиска"
            И ДанныеXDTOСодержатСсылку
            И ЗначениеЗаполнено(УзелОбмена);