Имя: Пароль:
1C
1С v8
ЗначениеВСтрокуВнутр -> УникальныйИдентификатор
,
0 totparen
 
07.12.16
22:51
Нет ли у кого готовых функций преобразований внутреннего кода объекта 7.7 в уникальный идентификатор 8.х и обратно?
1 Torquader
 
07.12.16
22:59
Внутренний код 7.7 - это два числа - код вида и код элемента, а GUID - это уникальное 16-байтное значение.
Как вы представляете себе преобразование одного в другое ?
2 Mauser
 
07.12.16
23:00
(1) Это второй вопрос. Ты функцию готовую давай, чо непонятного?
3 totparen
 
07.12.16
23:08
(2) Точняк! Дайте готовый код. Если придется делать, обязательно выложу.
4 Torquader
 
07.12.16
23:10
ПЕРЕМ мсоотПреобразование;
Функция Ид1СВГуид(пстрИдНаВходе)
Если ТипЗнч(мсоотПреобразование)<>Тип("Соответствие")Тогда
  мсоотПреобразование=Новый Соответствие;
КонецЕсли;
лРезультат=мсоотПреобразование.Получить(пстрИдНаВходе);
Если лРезультат=НЕОПРЕДЕЛЕНО Тогда
  лРезультат=Новый УникальныйИдентификатор;
  мсоотПреобразование.Вставить(пстрИдНаВходе,лРезультат);
КонецЕсли;
Возврат лРезультат;
КонецФункции
5 totparen
 
07.12.16
23:15
(4) не подходит ))
Из 7.7 хочется выгрузить ссылку, конвернув ее в уникальный идентификатор, который можно записать в 1с 8

Ну и обратно, если из 1с 8 получить ссылку, ранее выгруженную из 7.7 , конвертнуть ее сразу в значение. Без всяких вспомогательных хранилищ данных.
6 youalex
 
07.12.16
23:22
(5) в 77 - ссылка это не уид, а инкремент (в 36-ичной системе). Преобразовать в гуид на лету - не получится.
7 Torquader
 
07.12.16
23:25
(6) Я ему об этом уже в (1) говорил, но он хочет - "чтобы работало".

(5) Или сохранять таблицу преобразований или собирать GUID из каких-то кусков, что может привести к пересечению с уже существующими в базе.

Теоретически, GUID-ы можно получать пулом - если элементов какого-то справочника в 7.7 меньше, чем пул GUID-ов, то в код можно вставить один GUID, а остальные получать по идентификатору (номеру по порядку) элемента.
8 totparen
 
07.12.16
23:26
(6) думаю этот "инкремент" по определенным правилам можно преобразовать в гуид. И обратно.
9 youalex
 
07.12.16
23:27
(8) конечно. Через таблицу соответствий- пожалуйста.
10 youalex
 
07.12.16
23:34
Нет, конечно, наверное, можно перевести id 77 из 36-теричной системы счисления в гексовый уид, не забыв при этом, что ид в 77 может в себя включать идентификатор УРБД, например, но, имхо, соотвествие и проще (для отладки в т.ч.), и нагляднее.
11 Torquader
 
07.12.16
23:38
(10) С учётом того, что и КД хранит соответствия GUID-ов друг другу - то это единственно правильный путь.
12 totparen
 
08.12.16
07:53
(11) КД хранит ГУИД, лишь в некоторых случаях. Если объект создаётся в процессе обмена, то соответствия не используются.

Пока не нашёл никаких проблем преобразовать

{"O","0","0","0","0","0","      1611   2232069TG "}
{"O","0","0","0","0","0","      2457   2233888ЦБ "}
{"B","0","0","0","0","0","       172      6111ЦБ "}

В идентификатор вида "o0000000-1611-0000-0000-2232069000tg"
13 Mauser
 
08.12.16
07:56
>"...tg"
Спасибо за отличное настроение!
14 totparen
 
08.12.16
07:57
(13) )) точно...
15 totparen
 
08.12.16
07:57
Нужно будет учесть..
16 Адинэснег
 
08.12.16
08:10
(12) ёёёёёёёё-мммм-оооо-ёёёё-0017315582
17 Это_mike
 
08.12.16
08:31
ТС продолжает веселить...
18 totparen
 
09.12.16
10:42
Вот функция кодирования:

Функция ПолучитьУникальныйИдентификатор(пСсылка)
    // На выходе должна получиться строка вида "XXYYYYZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZZZZZZZZZ"
    // X - тип ссылка (справочник, документ). Символ в HEX
    // Y - вид (номенклатура, реализация). Число, 4-ре цифры.
    // Z - ИД объекта. Строка в HEX

    // {"B","0","0","84","0","0","         1   "}
    лВнутрСтрока = ЗначениеВСтрокуВнутр(пСсылка);
    
    // "B","0","0","84","0","0","         1   "
    лСтрокаСРазделителями = Сред(лВнутрСтрока,2,СтрДлина(лВнутрСтрока)-2);
    
    лСписок = СоздатьОбъект("СписокЗначений");
    лСписок.ИзСтрокиСРазделителями(лСтрокаСРазделителями);
    
    НеВажно = "";
    лТип = лСписок.ПолучитьЗначение(1,НеВажно); // "B"
    лВид = лСписок.ПолучитьЗначение(4,НеВажно); // "84" - предполагается, что это всегда число, 4-ре цифры.
    лИДОбъекта = лСписок.ПолучитьЗначение(7,НеВажно); // "         1   "
    
    // Преобразование только типизированных значений.
    // Длина идентификатора должна быть равной 13 символов.
    Если СтрДлина(лИДОбъекта) <> 13 Тогда
        ош = 1/0; // Ошибка! Длина идентификатора ожидается 13 символов.
    КонецЕсли;
    
    // "42008420202020202020202031202020"
    лРезультат = СтрокуВХекс(лТип) + Формат(лВид,"Ч(0)4") + СтрокуВХекс(лИДОбъекта);
                          
    // "42008420-2020-2020-2020-202031202020"
    лРезультат = Лев(лРезультат,8) + "-" +
        Сред(лРезультат,9,4) + "-" +
        Сред(лРезультат,14,4) + "-" +
        Сред(лРезультат,19,4) + "-" +
        Прав(лРезультат,12);
    
    Сообщить(лРезультат);
    
    Возврат лРезультат;
КонецФункции    // ПолучитьУникальныйИдентификатор