Имя: Пароль:
1C
 
Получить тип объекта из строки вида "Объект не найден"
,
0 Franchiser
 
гуру
11.11.22
18:41
Возможно ли получить тип вида "ДокументыСсылка.МойДокумент" ?
1 Смотрящий
 
11.11.22
18:48
Да
2 Franchiser
 
гуру
11.11.22
18:49
код в студию, в интернете не нашел
3 Franchiser
 
гуру
11.11.22
18:50
то что видел: делают перебором менеджера Документов, Справочников и т.д.
4 Смотрящий
 
11.11.22
19:00
(3) Дык, перебор же ж. Тип не хранит вид объекта
5 Franchiser
 
гуру
11.11.22
19:11
А что тогда значит цифры до двоеточия "55:"?
6 Смотрящий
 
11.11.22
19:22
(5) Покажите всю строку. Пжалуйста.
7 CepeLLlka
 
11.11.22
19:28
8 Franchiser
 
гуру
11.11.22
19:48
(7) и где там про получение типа?
9 Franchiser
 
гуру
11.11.22
19:49
(6)<Объект не найден> (84:bf5600145e3710ab11dda4c605dbe824) .
10 CepeLLlka
 
11.11.22
19:52
(8)Там предлагается обработка, которая может создать тебе ссылочный объект по "Объект не найден".

Скачиваешь обработку, лезешь под капот, профит!
11 Franchiser
 
гуру
11.11.22
19:54
У меня уже есть такая обработка. Но если ссылок много то очень долго работает перебор всех типов документов, справочников и т.д. хочу оптимизировать. Так можно тип получить или нет?
12 Aleksey
 
11.11.22
19:55
(11) Как думаешь что будет если у разных видов документов/справочников будет одинаковый ГУИД?
13 Aleksey
 
11.11.22
19:56
Т.е. в общем случае финт ушами из обработки сработает если нет одинаковых гуид в разных таблицах, ибо ответ на твой вопрос - нет, нельзя получить. Переходите на 7-ку там это реализовано
14 Смотрящий
 
11.11.22
20:16
(9) Чет я в чтроке не наблюдаю заявленное "55"
15 vde69
 
11.11.22
20:46
84 - это внутренний номер типа, ты сначала можешь создать ссылки всех типов метаданных и создать таблицу соответствия (она для конкретной базы будет уникальной) и уже по этой таблице будешь быстро создавать
16 kittystark
 
11.11.22
22:18
вот держи

&НаСервере
Функция  ПолучитьИзМетаданных_ВидОбъекта( возвращатьТД = ложь )
    
    Соотв_номерИзМетаданных_ВидОбъекта = новый Соответствие;    
    ВеткиМетаданных = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок( "Документы,Справочники" );
    
    Если возвращатьТД тогда
        индСтр = 1;
        ТД = новый ТабличныйДокумент;        
        ТД.Область( индСтр, 1 ).текст = "Метадно";
        ТД.Область( индСтр, 2 ).текст = "Вид";
        ТД.Область( индСтр, 3 ).текст = "Номер";
    КонецЕсли;
        
    Для Каждого ВеткаМетаданных из ВеткиМетаданных цикл
        Для Каждого обж из Метаданные[ВеткаМетаданных] цикл
            
            внутр             = ЗначениеВСтрокуВнутр( Вычислить("" + ВеткаМетаданных + "." + обж.Имя + ".ПустаяСсылка()") );
            видОбъекта         = обж.Имя;
            номерИзМетаданных     = RegExpReplace(внутр,".*\,(\d+):00000000000000000000000000000000}","$1");
            Соотв_номерИзМетаданных_ВидОбъекта[ номерИзМетаданных ] = "" + ВеткаМетаданных + "." + видОбъекта ;
            
            
            Если возвращатьТД тогда
                индСтр = индСтр + 1;
                ТД.Область( индСтр, 1 ).текст = ВеткаМетаданных;
                ТД.Область( индСтр, 2 ).текст = видОбъекта;
                ТД.Область( индСтр, 3 ).текст = номерИзМетаданных;
                ТД.Область( индСтр, 4 ).текст = внутр;
            КонецЕсли;
            
        КонецЦикла;
    КонецЦикла;
    
    Возврат ?( возвращатьТД, ТД, Соотв_номерИзМетаданных_ВидОбъекта );    
КонецФункции                


Function RegExpReplace( str, pattern, replacement, force_empty_str = 0 ) export
    //если последний параметр не ноль, тогда при отсутствии совпадения по шаблону - будет вернута пустая   строка
    //если же последний параметр опущен,  то при отсутствии совпадения по шаблону - будет вернута исходная строка
    Попытка
        RegExp = new COMObject("vbscript.regexp");
         RegExp.IgnoreCase    = true;
         RegExp.MultiLine    = true;
        RegExp.Global        = true;
         RegExp.Pattern         = pattern;    
        if force_empty_str = 0 then
            return RegExp.Replace(str,replacement);
        else
            if RegExp.Test(str) then
                return RegExp.Replace(str,replacement);
            else
                return "";
            endIf;
        endIf;
    Исключение
        return ОписаниеОшибки();
    КонецПопытки;
EndFunction


&НаКлиенте
Функция структураГУИДов( Объект_не_найден_Стр ) Экспорт
    
    номерВидаОбъектаСтр     = RegExpReplace( Объект_не_найден_Стр,     "^<Объект не найден> \((\d+):(.{32})\)$"     , "$1");
    ГУИД_БезТирешекСтр        = RegExpReplace( Объект_не_найден_Стр,     "^<Объект не найден> \((\d+):(.{32})\)$"    , "$2");
    ГУИД_СТирешкамиСтр    = RegExpReplace( ГУИД_БезТирешекСтр,    "(.{4})(.{12})(.{4})(.{4})(.{8})"        , "$5-$4-$3-$1-$2");
    ГУИД_Настоящий        = Новый УникальныйИдентификатор( ГУИД_СТирешкамиСтр );
    
    Возврат новый Структура("номерИзМетаданных, ВидОбъекта, ГУИД_БезТирешекСтр, ГУИД_СТирешкамиСтр, ГУИД_Настоящий, ДатаСоздания",
                             номерВидаОбъектаСтр,
                             соотв_номерИзМетаданных_ВидОбъекта[ номерВидаОбъектаСтр ],
                             ГУИД_БезТирешекСтр,
                             ГУИД_СТирешкамиСтр,
                             ГУИД_Настоящий,
                             ДатаСозданияСсылки( ГУИД_СТирешкамиСтр )
                            );    
КонецФункции


&НаСервере
Процедура ВосстановитьСсылку( структураГУИДов, НовоеЗначение )
    
    менеджерОбъекта = Вычислить(структураГУИДов.ВидОбъекта);
    
    Если Найти( структураГУИДов.ВидОбъекта, "Документ" ) = 1 тогда
        восстанавливаемыйОбъект = менеджерОбъекта.СоздатьДокумент();
        восстанавливаемыйОбъект.Дата  = структураГУИДов.ДатаСоздания;
        восстанавливаемыйОбъект.Номер = НовоеЗначение;
    КонецЕсли;
    
    Если Найти( структураГУИДов.ВидОбъекта, "Справочник" ) = 1 тогда
        восстанавливаемыйОбъект = менеджерОбъекта.СоздатьЭлемент();
        восстанавливаемыйОбъект.Наименование = НовоеЗначение;
    КонецЕсли;
    
    восстанавливаемыйОбъект .УстановитьСсылкуНового(  менеджерОбъекта.ПолучитьСсылку( структураГУИДов.ГУИД_Настоящий ) );    
    восстанавливаемыйОбъект.Записать();

КонецПроцедуры
17 Franchiser
 
гуру
11.11.22
23:24
(14) потому что я уже исправил все ссылки. Прислал пример из интернета.
(15)(16) спасибо, попробую
18 Franchiser
 
гуру
11.11.22
23:49
(12) гуид уникален в рамках одной таблицы
19 TormozIT
 
гуру
12.11.22
00:39
ирОбщий.ПреобразоватьЗначениеИзSDBLЛкс()
20 Михаил Козлов
 
12.11.22
09:08
(12) (19)+ Делал обмен так чтобы ГУИД расходной накладной = ГУИД приходной. В рамках одной БД.
21 Franchiser
 
гуру
12.11.22
13:23
(19)+
22 Franchiser
 
гуру
12.11.22
13:26
(19) а можешь сюда кинуть? у меня ИР только в виде внешних обработок
23 Конструктор1С
 
12.11.22
14:21
(11) ну раз получи структуру хранения БД, номера таблиц закешируй в соответствие, потом тупо перебирай свои ссылки
24 Franchiser
 
гуру
12.11.22
14:33
(23) а чему там соответствует номер таблицы?
25 kittystark
 
12.11.22
15:41
(24) я ж в (16) уже код дал,
см. первую функцию ПолучитьИзМетаданных_ВидОбъекта( возвращатьТД = ложь ) - там ветку "code" нужно развернуть:

Соотв_номерИзМетаданных_ВидОбъекта[ номерИзМетаданных ] = "" + ВеткаМетаданных + "." + видОбъекта;

уже даже табдок формируется - неужели так трудно...
кинь его на форму, или вызови ТД.Показать() - все увидишь
26 Franchiser
 
гуру
12.11.22
17:59
(25) я на будущее, сейчас не за компом. Что то мне код не очень нравится
27 Конструктор1С
 
12.11.22
18:26
(24) <Объект не найден> (84:bf5600145e3710ab11dda4c605dbe824)

формат этого безобразия
<Объект не найден> ([Номер таблицы в струкутре хранения]:[ГУИД])

Документ.ПриходнаяНакладная
В структуре хранения _Document45
<Объект не найден> (45:bf5600145e3710ab11dda4c605dbe824)
28 Aleksey
 
13.11.22
13:51
(17),(20) Я в курсе поэтому и написал, что будет если тупо перебирать все таблички подставлять гуиды и проверять нашли что то или нет. Он найдет первый элемент и прекратит поиск, но не факт что первый будет нужным
29 Franchiser
 
гуру
13.11.22
14:20
(28) так почему ты написал "нет, нельзя получить"?