Имя: Пароль:
1C
1С v8
Интеграция с Документооборот. Зачем нужен запрос?
0 aleks_default
 
25.12.19
14:40
В типовой ERP такой код:

Для Каждого ВнешнийОбъект Из ВнешниеОбъекты Цикл
    
        Попытка
            Ссылка = СсылкаИзUUID(ВнешнийОбъект.type, ВнешнийОбъект.id);
        Исключение
            // Тип объекта не найден в текущей конфигурации.
            Продолжить;
        КонецПопытки;
        
        Если Ссылка = Неопределено Тогда
            Продолжить;
        КонецЕсли;
        
        Запрос = Новый Запрос(
            "ВЫБРАТЬ ПЕРВЫЕ 1
            |    Ссылка
            |ИЗ " + ВнешнийОбъект.type + "
            |ГДЕ
            |    Ссылка = &Ссылка");
        Запрос.УстановитьПараметр("Ссылка", Ссылка);
        
        РезультатЗапроса = Запрос.Выполнить();
        Если Не РезультатЗапроса.Пустой() Тогда
            Результат.Добавить(Ссылка);
        КонецЕсли;
        
    КонецЦикла;

Вопрос. Зачем тут нужен проверочный запрос, если функция СсылкаИзUUID() итак уже либо получит ссылку либо вернет неопределено?
1 aleks_default
 
25.12.19
14:49
Вот текст этой типовой функции, если вдруг у кого-то нет ERP

//Получает ссылку на объект по имени объекта конфигурации и ID.
//Параметры:
//    РеквизитТип - строка типа объекта конфигурации
//    РеквизитID - строка идентификатора объекта конфигурации
Функция СсылкаИзUUID(Тип, UUID) Экспорт
    
    СсылкаНаПотребителя = Неопределено;
    
    Если СтрНачинаетсяС(Тип, "Справочник.") Тогда
        СсылкаНаПотребителя = Справочники[СтрЗаменить(Тип,
            "Справочник.", "")].ПолучитьСсылку(Новый УникальныйИдентификатор(UUID));
        
    ИначеЕсли СтрНачинаетсяС(Тип, "Документ.")Тогда
        СсылкаНаПотребителя = Документы[СтрЗаменить(Тип,
            "Документ.", "")].ПолучитьСсылку(Новый УникальныйИдентификатор(UUID));
        
    ИначеЕсли СтрНачинаетсяС(Тип, "ПланСчетов.") Тогда
        СсылкаНаПотребителя = ПланыСчетов[СтрЗаменить(Тип,
            "ПланСчетов.", "")].ПолучитьСсылку(Новый УникальныйИдентификатор(UUID));
        
    ИначеЕсли СтрНачинаетсяС(Тип, "ПланВидовРасчета.") Тогда
        СсылкаНаПотребителя = ПланыВидовРасчета[СтрЗаменить(Тип,
            "ПланВидовРасчета.", "")].ПолучитьСсылку(Новый УникальныйИдентификатор(UUID));
        
    ИначеЕсли СтрНачинаетсяС(Тип, "ПланВидовХарактеристик.") Тогда
        СсылкаНаПотребителя = ПланыВидовХарактеристик[СтрЗаменить(Тип,
            "ПланВидовХарактеристик.", "")].ПолучитьСсылку(Новый УникальныйИдентификатор(UUID));
        
    ИначеЕсли СтрНачинаетсяС(Тип, "БизнесПроцесс.") Тогда
        СсылкаНаПотребителя = БизнесПроцессы[СтрЗаменить(Тип,
            "БизнесПроцесс.", "")].ПолучитьСсылку(Новый УникальныйИдентификатор(UUID));
        
    ИначеЕсли СтрНачинаетсяС(Тип, "Задача.") Тогда
        СсылкаНаПотребителя = Задачи[СтрЗаменить(Тип,
            "Задача.", "")].ПолучитьСсылку(Новый УникальныйИдентификатор(UUID));
        
    ИначеЕсли СтрНачинаетсяС(Тип, "Перечисление.")
        И ЗначениеЗаполнено(UUID) Тогда
        СсылкаНаПотребителя = Перечисления[СтрЗаменить(Тип,
            "Перечисление.", "")][UUID];
        
    КонецЕсли;
    
    Возврат СсылкаНаПотребителя;
    
КонецФункции

Как видим тут все просто
2 aleks_default
 
25.12.19
14:50
Так в чем смысл запроса? Есть идеи?
3 lodger
 
25.12.19
14:54
(2) ПолучитьСсылку не гарантирует существование объекта. по ссылке все равно надо попытаться прочитать данные, чтобы удостовериться что ссылка не битая.
запрос на одну только ссылку экономичнее, чем ПолучитьОбъект(), например.
4 aleks_default
 
25.12.19
14:56
(3)Но этот запрос тоже этого не гарантирует
5 aleks_default
 
25.12.19
14:59
(3)Хотя, наверное да, ты прав. Спасибо!
6 aleks_default
 
25.12.19
15:00
нет, подожди.. а что тогда вернет ПолучитьСсылку() если ссылка битая?
7 aleks_default
 
25.12.19
15:02
битой ссылки в самой таблице справочника или документа быть не может, в этом случае ПолучитьСсылку() вернет неопределено  и значит до запроса дело не дойдет
8 ptiz
 
25.12.19
15:04
(7) "в этом случае ПолучитьСсылку() вернет неопределено " - с чего решил? Вернется ссылка.
9 aleks_default
 
25.12.19
15:15
(8)Точно, он же в любом случае получит ссылку. Только в случае ее отстутсвия в базе она будет "битая". Тогда (3) прав. Чета я тупанул...
10 aleks_default
 
25.12.19
15:16
Вопрос закрыт
11 pechkin
 
25.12.19
15:23
в типовой есть примерно аналогичная функция
СсылкаСуществует(Ссылка)
12 lodger
 
25.12.19
16:52
(0) кстати, плохой цикл.
я бы переписал.
надо так:
определяем какие уникальные ВнешнийОбъект.type есть в ТЗ.
делаем структуру, в нее вставляем выгрузки из ТЗ (это тоже ТЗ) по ключам ВнешнийОбъект.type
для каждого набора ВнешнийОбъект.type, пробегаемся и делаем битые ссылки, пишем запрос и делаем столько запросов в БД, сколько есть ВнешнийОбъект.type
13 lodger
 
25.12.19
16:53
конечно же при условии, что в этом цикле в среднем происходит перебор десятков и сотен ссылок, а не 3-5.