Имя: Пароль:
1C
1С v8
ГУИД в массив байт, а затем сконвертировать в base64 строку
0 fantomrik
 
12.01.18
09:44
Коллеги привет!

Делаю задачку по интеграции 1С и некого сайта. Мне нужно посылать определенные запросы, в теле которого определенным значением должен выступать GUID. Я попробовал передавать стандартный Новый УникальныйИдетификатор, но сайту он не подходит.

Программист со стороны сайта попросил следующее и привел пример, как надо сделать:

- ГУИДЫ должны быть преобразованы в массив байт а затем сконвертированы в base64 строку.

https://hostingkartinok.com/show-image.php?id=ca8266833c3b9d545a9e5df8f69557a7

Собственно не понимаю как в 1С мне это сделать?
1 fantomrik
 
12.01.18
09:50
И вобще такое возможно чисто в 1С сделать или надо просить писать для данной задачи DLL-ку ребят с другого отдела?
2 xaozai
 
12.01.18
10:01
3 Юрий Лазаренко
 
12.01.18
10:03
(0) А что может быть не так с ГУИДом? В ГУИДе используются только латинские символы, с ними при передаче на сайт ничего произойти не может, это же не кириллица.
4 v77
 
12.01.18
10:11
(0) ну возьми ГУИД как строку, ГУИД состоит из 16-ричных циферок, забей эти циферки в массив, массив закодируй в base64
приступай!
5 fantomrik
 
12.01.18
10:14
(2) спасибо, из статьи получается, если

1) Если из гуида убрать символы "-", то это и есть двоичные данные закодированные в base64:

Base64Строка(Base64Значение("4e090376071043d29609c398fa23caa9")) = "4e090376071043d29609c398fa23caa9"

2) в статье описана функция, как получить из строки массив байтов, но в 1С нет же функции  как из этого массива собрать base64 строку, что хочет от меня программист сайта.

(3) Не знаю, уточню у него.

(4) Как массив закодировать в base64? В base64 можно же только двоичные данные закодировать вроде в 1С
6 v77
 
12.01.18
10:14
в 1с есть ДвоичныеДанные и ПотокВПамяти
7 v77
 
12.01.18
10:17
(5) ну ты попробуй такой же ГУИД как в примере из (0) закодируй как в (5). если прокатит, то вопрос решен
8 fantomrik
 
12.01.18
10:20
(7) закодировать через ПотокВПамяти?
9 dezss
 
12.01.18
10:22
Проси у него пример строки и результат.
Потом пробуй строку записать в файл, из него в ДвоичныеДанные, а их уже в base64.
10 dezss
 
12.01.18
10:24
(9)+ Если не будет сходиться (только проверь на всех возможных кодировках файла), то преобразуй уже в массив байт (хотя я в этом никакого смысла не вижу, так как двоичные данные им по сути и являются).
11 v77
 
12.01.18
10:34
(8) ну как ты делал

Base64Строка(Base64Значение("4e090376071043d29609c398fa23caa9")) = "4e090376071043d29609c398fa23caa9"
12 fantomrik
 
12.01.18
16:10
Решил задачу благодаря Использование классов .Net в 1С для новичков

Скачал http://files.rsdn.ru/19608/ФайлыNetObjectToIDispatch.zip , зарегал и делаю так:

NetObject = Новый COMОбъект("NetObjectToIDispatch45") ;
    
ИтоговыйGUID =  NetObject.ПолучитьТип("System.Convert").ToBase64String(NetObject.ПолучитьТип("System.Guid").Parse("08ed0482-a722-4182-b410-e77f3acc34e6").ToByteArray());

(ИтоговыйGUID = "ggTtCCKngkG0EOd/Osw05g==")
13 dezss
 
12.01.18
16:40
(12) блин...один я не пойму, почему результат меньше исходного текста?
или ГУИД все же не совсем текст и в виде массива байт он короче своего строкового представления?
14 Вафель
 
12.01.18
16:42
(13) гуид - это 16байт
15 dezss
 
12.01.18
16:47
(14) блин, точна...спасибо...
1с развращает в этом плане, забываешь азы)))
16 H A D G E H O G s
 
12.01.18
16:59
УИДСтрокой="08ed0482-a722-4182-b410-e77f3acc34e6";
    УИДСтрокой=СтрЗаменить(УИДСтрокой,"-","");
    БуферДанных=ПолучитьБуферДвоичныхДанныхИзHexСтроки(УИДСтрокой);
    Результат=ПолучитьBase64СтрокуИзБуфераДвоичныхДанных(БуферДанных);
    Сообщить(Результат);
17 H A D G E H O G s
 
12.01.18
16:59
Добро пожаловать в новый светлый мир, Нео
18 Вафель
 
12.01.18
17:34
(16) у тебя в итоге получается CO0EgqciQYK0EOd/Osw05g==, а не как в (12)
19 Вафель
 
12.01.18
17:34
основной затык здесь получить гуид в виде byteArray
20 dezss
 
12.01.18
17:41
(16) нужно еще порядок байт тогда поставить по феншую))))
21 H A D G E H O G s
 
12.01.18
17:50
Это ваш C# чудит
22 H A D G E H O G s
 
12.01.18
18:00
УИДСтрокой="08ed0482-a722-4182-b410-e77f3acc34e6";
    УИДСтрокой=СтрЗаменить(УИДСтрокой,"-","");
    БуферДанных=ПолучитьБуферДвоичныхДанныхИзHexСтроки(УИДСтрокой);
    КартаИнверсии=Новый Соответствие;
    КартаИнверсии.Вставить(4,1);
    КартаИнверсии.Вставить(3,2);
    КартаИнверсии.Вставить(6,5);
    КартаИнверсии.Вставить(8,7);
    Для Каждого КлючИнверсии Из КартаИнверсии Цикл
        ЗначениеПриемника=БуферДанных.Получить(КлючИнверсии.Значение-1);
        ЗначениеИсточника=БуферДанных.Получить(КлючИнверсии.Ключ-1);
        БуферДанных.Установить(КлючИнверсии.Ключ-1,ЗначениеПриемника);
        БуферДанных.Установить(КлючИнверсии.Значение-1,ЗначениеИсточника);
    КонецЦикла;
    Результат=ПолучитьBase64СтрокуИзБуфераДвоичныхДанных(БуферДанных);
    Сообщить(Результат);
23 Serginio1
 
12.01.18
18:29
(21) Угу, может 1С не так конвертирует байты?
Вспомно про v8: Как перевести ГУИД в число и обратно?
24 H A D G E H O G s
 
12.01.18
18:33
Ваша C# балована.
25 Вафель
 
12.01.18
18:38
с гуидами вообще 1с как-то неохотно дружит
26 Serginio1
 
12.01.18
19:11
27 fantomrik
 
17.01.18
10:35
(22) самое оптимальное решение (0) СПАСИБО!!!
28 H A D G E H O G s
 
22.01.18
13:41
БуферДанных=ПолучитьБуферДвоичныхДанныхИзBase64Строки(Результат);
    Для Каждого КлючИнверсии Из КартаИнверсии Цикл
        ЗначениеПриемника=БуферДанных.Получить(КлючИнверсии.Ключ-1);
        ЗначениеИсточника=БуферДанных.Получить(КлючИнверсии.Значение-1);
        БуферДанных.Установить(КлючИнверсии.Ключ-1,ЗначениеИсточника);
        БуферДанных.Установить(КлючИнверсии.Значение-1,ЗначениеПриемника);
    КонецЦикла;
    УИДСтрокой=ПолучитьHexСтрокуИзБуфераДвоичныхДанных(БуферДанных);
    Результат=сред(УИДСтрокой,1,8)+"-"+сред(УИДСтрокой,9,4)+"-"+сред(УИДСтрокой,13,4)+"-"+сред(УИДСтрокой,17,4)+"-"+сред(УИДСтрокой,21);
    Сообщить(Результат);
29 fantomrik
 
22.01.18
13:52
(28) Мозг !!! :)
Спасибо!
30 fantomrik
 
24.01.18
11:42
(28) тут кстати кусочек с "КартаИнверсии" пропущен) А так благодаря H A D G E H O G имеем чудные процедуры перевода ГУИД в Base64 и обратно



Функция ГУИД_Из_1С_в_Base64(ГУИД_Из_1С_Строкой)
    
    ГУИД_Из_1С_Строкой_ = СтрЗаменить(ГУИД_Из_1С_Строкой,"-","");
    БуферДанных         = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ГУИД_Из_1С_Строкой_);
    
    КартаИнверсии = Новый Соответствие;
    КартаИнверсии.Вставить(4,1);
    КартаИнверсии.Вставить(3,2);
    КартаИнверсии.Вставить(6,5);
    КартаИнверсии.Вставить(8,7);
    
    Для Каждого КлючИнверсии Из КартаИнверсии Цикл
        ЗначениеПриемника = БуферДанных.Получить(КлючИнверсии.Значение-1);
        ЗначениеИсточника = БуферДанных.Получить(КлючИнверсии.Ключ-1);
        БуферДанных.Установить(КлючИнверсии.Ключ-1,ЗначениеПриемника);
        БуферДанных.Установить(КлючИнверсии.Значение-1,ЗначениеИсточника);
    КонецЦикла;
    
    Возврат ПолучитьBase64СтрокуИзБуфераДвоичныхДанных(БуферДанных);
    
КонецФункции

Функция ГУИД_Из_Base64_В_1С(ГУИД_Base64_Строкой)
    
    БуферДанных = ПолучитьБуферДвоичныхДанныхИзBase64Строки(ГУИД_Base64_Строкой);
    
    КартаИнверсии = Новый Соответствие;
    КартаИнверсии.Вставить(4,1);
    КартаИнверсии.Вставить(3,2);
    КартаИнверсии.Вставить(6,5);
    КартаИнверсии.Вставить(8,7);
    
    Для Каждого КлючИнверсии Из КартаИнверсии Цикл
        ЗначениеПриемника = БуферДанных.Получить(КлючИнверсии.Ключ-1);
        ЗначениеИсточника = БуферДанных.Получить(КлючИнверсии.Значение-1);
        БуферДанных.Установить(КлючИнверсии.Ключ-1,ЗначениеИсточника);
        БуферДанных.Установить(КлючИнверсии.Значение-1,ЗначениеПриемника);
    КонецЦикла;
    
    УИДСтрокой = ПолучитьHexСтрокуИзБуфераДвоичныхДанных(БуферДанных);
    Результат  = Сред(УИДСтрокой,1,8)+"-"+Сред(УИДСтрокой,9,4)+"-"+Сред(УИДСтрокой,13,4)+"-"+Сред(УИДСтрокой,17,4)+"-"+Сред(УИДСтрокой,21);
    
    Возврат Нрег(Результат);
    
КонецФункции
AdBlock убивает бесплатный контент. 1Сергей