При разработке очередного обмена с интернет магазином через API столкнулисть что сайт возвращает ответ в виде:
Код VBS {"ok" :"true" ,"description" :"\u0421\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043a\u0430\u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d" }
из кода ясно что это JSON и используя код ПрочитатьJSON
Код 1C v 8.3 Чтение = Новый ЧтениеJSON;
Чтение. УстановитьСтроку( стрВходящая) ;
ДанныеЛога = ПрочитатьJSON( Чтение) ;
Чтение. Закрыть( ) ;
В переменной ДанныеЛога будет структура в виде
В результате получилась функция с 2-мя вариантами возрата, в зависимости от того как нужно
Код 1C v 8.3
Функция ДекодироватьUniCodeВJSON(стрВходящая)
Чтение = Новый ЧтениеJSON;
Чтение. УстановитьСтроку( стрВходящая) ;
ДанныеЛога = ПрочитатьJSON( Чтение) ;
Чтение. Закрыть( ) ;
Текст = "" ;
Для каждого Элемент Из ДанныеЛога Цикл
Текст = Текст + ? ( НЕ ПустаяСтрока( Текст) , Символы. ПС, "" ) ;
Текст = Текст + Элемент. Ключ + " = " + Элемент. Значение;
КонецЦикла ;
Возврат Текст;
Запись = Новый ЗаписьJSON;
Запись. УстановитьСтроку( Новый ПараметрыЗаписиJSON( ПереносСтрокJSON. Нет) ) ;
ЗаписатьJSON( Запись, ДанныеЛога, ) ;
Возврат Запись. Закрыть( ) ;
КонецФункции
На просторах интернета была найдена еще одна функция:
Код 1C v 8.3
Функция ПереобразоватьЮникод(Строка)
ГотововаяСтрока = "" ;
МасУкр = Новый Массив( 66 ) ;
МасУкр[0 ]= "А" ; МасУкр[1 ]= "Б" ; МасУкр[2 ]= "В" ; МасУкр[3 ]= "Г" ; МасУкр[4 ]= "Ґ" ; МасУкр[5 ]= "Д" ;
МасУкр[6 ]= "Е" ; МасУкр[7 ]= "Є" ; МасУкр[8 ]= "Ж" ; МасУкр[9 ]= "З" ; МасУкр[10 ]= "И" ; МасУкр[11 ]= "І" ;
МасУкр[12 ]= "Ї" ; МасУкр[13 ]= "Й" ; МасУкр[14 ]= "К" ; МасУкр[15 ]= "Л" ; МасУкр[16 ]= "М" ; МасУкр[17 ]= "Н" ;
МасУкр[18 ]= "О" ; МасУкр[19 ]= "П" ; МасУкр[20 ]= "Р" ; МасУкр[21 ]= "С" ; МасУкр[22 ]= "Т" ; МасУкр[23 ]= "У" ;
МасУкр[24 ]= "Ф" ; МасУкр[25 ]= "Х" ; МасУкр[26 ]= "Ц" ; МасУкр[27 ]= "Ч" ; МасУкр[28 ]= "Ш" ; МасУкр[29 ]= "Щ" ;
МасУкр[30 ]= "Ь" ; МасУкр[31 ]= "Ю" ; МасУкр[32 ]= "Я" ;
МасУкр[33 ]= "а" ; МасУкр[34 ]= "б" ; МасУкр[35 ]= "в" ; МасУкр[36 ]= "г" ; МасУкр[37 ]= "ґ" ; МасУкр[38 ]= "д" ;
МасУкр[39 ]= "е" ; МасУкр[40 ]= "є" ; МасУкр[41 ]= "ж" ; МасУкр[42 ]= "з" ; МасУкр[43 ]= "и" ; МасУкр[44 ]= "і" ;
МасУкр[45 ]= "ї" ; МасУкр[46 ]= "й" ; МасУкр[47 ]= "к" ; МасУкр[48 ]= "л" ; МасУкр[49 ]= "м" ; МасУкр[50 ]= "н" ;
МасУкр[51 ]= "о" ; МасУкр[52 ]= "п" ; МасУкр[53 ]= "р" ; МасУкр[54 ]= "с" ; МасУкр[55 ]= "т" ; МасУкр[56 ]= "у" ;
МасУкр[57 ]= "ф" ; МасУкр[58 ]= "х" ; МасУкр[59 ]= "ц" ; МасУкр[60 ]= "ч" ; МасУкр[61 ]= "ш" ; МасУкр[62 ]= "щ" ;
МасУкр[63 ]= "ь" ; МасУкр[31 ]= "ю" ; МасУкр[65 ]= "я" ;
МасКод = Новый Массив( 66 ) ;
МасКод[0 ]= "0410" ; МасКод[1 ]= "0411" ; МасКод[2 ]= "0412" ; МасКод[3 ]= "0413" ; МасКод[4 ]= "0490" ; МасКод[5 ]= "0414" ;
МасКод[6 ]= "0415" ; МасКод[7 ]= "0404" ; МасКод[8 ]= "0416" ; МасКод[9 ]= "0417" ; МасКод[10 ]= "0418" ; МасКод[11 ]= "0406" ;
МасКод[12 ]= "0407" ; МасКод[13 ]= "0419" ; МасКод[14 ]= "041A" ; МасКод[15 ]= "041B" ; МасКод[16 ]= "041C" ; МасКод[17 ]= "041D" ;
МасКод[18 ]= "041E" ; МасКод[19 ]= "041F" ; МасКод[20 ]= "0420" ; МасКод[21 ]= "0421" ; МасКод[22 ]= "0422" ; МасКод[23 ]= "0423" ;
МасКод[24 ]= "0424" ; МасКод[25 ]= "0425" ; МасКод[26 ]= "0426" ; МасКод[27 ]= "0427" ; МасКод[28 ]= "0428" ; МасКод[29 ]= "0429" ;
МасКод[30 ]= "042C" ; МасКод[31 ]= "042E" ; МасКод[32 ]= "042F" ;
МасКод[33 ]= "0430" ; МасКод[34 ]= "0431" ; МасКод[35 ]= "0432" ; МасКод[36 ]= "0413" ; МасКод[37 ]= "0491" ; МасКод[38 ]= "0434" ;
МасКод[39 ]= "0435" ; МасКод[40 ]= "0454" ; МасКод[41 ]= "0436" ; МасКод[42 ]= "0437" ; МасКод[43 ]= "0438" ; МасКод[44 ]= "0456" ;
МасКод[45 ]= "0457" ; МасКод[46 ]= "0439" ; МасКод[47 ]= "043A" ; МасКод[48 ]= "043B" ; МасКод[49 ]= "043C" ; МасКод[50 ]= "043D" ;
МасКод[51 ]= "043E" ; МасКод[52 ]= "043F" ; МасКод[53 ]= "0440" ; МасКод[54 ]= "0441" ; МасКод[55 ]= "0442" ; МасКод[56 ]= "0443" ;
МасКод[57 ]= "0444" ; МасКод[58 ]= "0445" ; МасКод[59 ]= "0446" ; МасКод[60 ]= "0447" ; МасКод[61 ]= "0448" ; МасКод[62 ]= "0449" ;
МасКод[63 ]= "044C" ; МасКод[31 ]= "044E" ; МасКод[65 ]= "044F" ;
тмпСтрока = "" ;
Для Счетчик = 1 По СтрДлина( Строка) Цикл
Если Лев( Строка, 1 ) = "\" Тогда
Если Лев( Строка, 2 ) = "\u" Тогда
тмпСтрока = Прав( Лев( Строка, 6 ) , 4 ) ;
Если МасКод. Найти( тмпСтрока) = Неопределено Тогда
СтрокаЗамены = Прав( тмпСтрока, 1 ) ;
тмпСтрока = СтрЗаменить( тмпСтрока, СтрокаЗамены, ТРег( СтрокаЗамены) ) ;
Если МасКод. Найти( тмпСтрока) = Неопределено Тогда
Сообщить( "Код символа не найден: " + тмпСтрока) ;
Иначе
ГотововаяСтрока = ГотововаяСтрока + МасУкр[МасКод. Найти( тмпСтрока) ] ;
КонецЕсли ;
Иначе
ГотововаяСтрока = ГотововаяСтрока + МасУкр[МасКод. Найти( тмпСтрока) ] ;
КонецЕсли ;
Строка = Прав( Строка, ( СтрДлина( Строка) - 6 ) ) ;
Иначе
Строка = Прав( Строка, ( СтрДлина( Строка) - 2 ) ) ;
КонецЕсли ;
Иначе
ГотововаяСтрока = ГотововаяСтрока + Лев( Строка, 1 ) ;
Строка = Прав( Строка, ( СтрДлина( Строка) - 1 ) ) ;
КонецЕсли ;
КонецЦикла ;
Возврат ГотововаяСтрока ;
КонецФункции
Считать данные из двоичного файла можно при помощи функции ДвоичныеДанные(ИмяФайла). Например:
Код 1C v 8.2 УП ДД = ДвоичныеДанные( ИмяФайла) ;
или через ADODB.Stream
Код 1C v 8.х Процедура Пример(ИмяФайла)
StreamTypeEnum = Новый Структура( "adTypeBinary, adTypeText" , 1 , 2 ) ;
ConnectModeEnum = Новый Структура(
"adModeRead, adModeReadWrite, adModeRecursive, adModeShareDenyNone,
|adModeShareDenyRead, adModeShareDenyWrite, adModeShareExclusive,
|adModeUnknown, adModeWrite" , 1 , 3 , 4194304 , 16 , 4 , 8 , 12 , 0 , 2 ) ;
SaveOptionsEnum = Новый Структура( "adSaveCreateNotExist, adSaveCreateOverWrite" , 1 , 2 ) ;
StreamIn = Новый COMОбъект( "ADODB.Stream" ) ;
StreamIn. Type = StreamTypeEnum. adTypeBinary;
StreamIn. Open( ) ;
StreamIn. LoadFromFile( ИмяФайла) ;
Data = StreamIn. Read( ) ;
StreamIn. Close( ) ;
СодержимоеМассив = Data. Выгрузить( ) ;
Data = Новый COMSafeArray( СодержимоеМассив, "VT_UI1" , СодержимоеМассив. Количество( ) ) ;
StreamOut = Новый COMОбъект( "ADODB.Stream" ) ;
StreamOut. Type = StreamTypeEnum. adTypeBinary;
StreamOut. Mode = ConnectModeEnum. adModeReadWrite;
StreamOut. Open( ) ;
StreamOut. Write( Data) ;
StreamOut. SaveToFile( ИмяФайла, SaveOptionsEnum. adSaveCreateOverWrite) ;
StreamOut. Close( ) ;
КонецПроцедуры
Двоичные данные и кодировка Base64 в 1С 8.Х
Считать данные из двоичного файла можно при помощи функции
ДвоичныеДанные(ИмяФайла). Например:
Код 1C v 8.2 УП ДД = ДвоичныеДанные( ИмяФайла) ;
Здесть ДД - специальный объект, который называется "двоичные данные".
В языке 1С есть функция, которая преобразует двоичные данные в строку
Base64Строка(ДвоичныеДанные). Например:
Код 1C v 8.2 УП Строка64 = Base64Строка( ДвоичныеДанные) ;
Здесть Строка64 - обычная строка, с которой можно делать все, что угодно.
В конце статьи приведена функция
Преобразовать64(Строка64 = неопределено, Массив64 = неопределено) , которая преобразовывает строку в массив байтов, и обратно.
Для того, чтобы получить массив байтов из строки, вызываем ее так:
Код 1C v 8.2 УП Массив64 = Преобразовать64 ( Строка64 , ) ;
Для обратного преобразования вызываем так:
Код 1C v 8.2 УП Строка64 = Преобразовать64 ( , Массив64 ) ;
Преобразовать строку в двоичные данные можно при помощи функции Base64Значение(Строка64)
Все указанные функции, кроме Преобразовать64, являются встроенными функциям платформы.
Далее листинг функции Преобразовать64:
Код 1C v 8.2 УП
&НаСервере
Функция Преобразовать64(Строка64 = неопределено, Массив64 = неопределено)
Таб64 = Новый ТаблицаЗначений;
Таб64 . Колонки. Добавить( "Код" ) ;
Таб64 . Колонки. Добавить( "Символ" ) ;
Нпп = 0 ;
Для Код = КодСимвола( "A" ) По КодСимвола( "Z" ) Цикл
стр = Таб64 . Добавить( ) ;
стр. Код = Нпп;
стр. Символ = Символ( Код) ;
Нпп = Нпп + 1 ;
КонецЦикла ;
Для Код = КодСимвола( "a" ) По КодСимвола( "z" ) Цикл
стр = Таб64 . Добавить( ) ;
стр. Код = Нпп;
стр. Символ = Символ( Код) ;
Нпп = Нпп + 1 ;
КонецЦикла ;
стр = Таб64 . Добавить( ) ;
стр. Код = Нпп;
стр. Символ = "0" ;
Нпп = Нпп + 1 ;
Для Код = 1 По 9 Цикл
стр = Таб64 . Добавить( ) ;
стр. Код = Нпп;
стр. Символ = Формат( Код, "ЧЦ=1; ЧДЦ=0" ) ;
Нпп = Нпп + 1 ;
КонецЦикла ;
стр = Таб64 . Добавить( ) ;
стр. Код = Нпп;
стр. Символ = "+" ;
Нпп = Нпп + 1 ;
стр = Таб64 . Добавить( ) ;
стр. Код = Нпп;
стр. Символ = "/" ;
Если Массив64 = неопределено Тогда
Если Строка64 = неопределено Тогда
Сообщить( "неверный вызов функции" ) ;
Возврат неопределено ;
КонецЕсли ;
Строка64 = СтрЗаменить( Строка64 , Символ( 10 ) , "" ) ;
Строка64 = СтрЗаменить( Строка64 , Символ( 13 ) , "" ) ;
Если СтрДлина( Строка64 ) % 4 < > 0 Тогда
Сообщить( "длина строки на входе должна быть кратна 4" ) ;
Сообщить( СтрДлина( Строка64 ) ) ;
Возврат неопределено ;
КонецЕсли ;
Кол4 = Цел( СтрДлина( Строка64 ) / 4 ) ;
РазмерМ = Кол4 * 3 ;
Если Прав( Строка64 , 2 ) = "==" Тогда
РазмерМ = РазмерМ - 2 ;
ИначеЕсли Прав( Строка64 , 1 ) = "=" Тогда
РазмерМ = РазмерМ - 1 ;
КонецЕсли ;
Массив64 = Новый Массив( РазмерМ) ;
Для А = 1 По Кол4 Цикл
Число3 = 0 ;
Для Б = 1 По 4 Цикл
Буква1 = Сред( Строка64 , ( А- 1 ) * 4 + Б, 1 ) ;
Если Буква1 = "=" Тогда
Код4 = 0 ;
Иначе
стрН = Таб64 . Найти( Буква1 , "Символ" ) ;
Если стрН = Неопределено Тогда
Сообщить( "ошибка при поиске " + КодСимвола( Буква1 ) ) ;
Иначе
Код4 = стрН. Код;
КонецЕсли ;
КонецЕсли ;
Число3 = Число3 * 64 + Код4 ;
КонецЦикла ;
Ост = Число3 % 256 ;
Индекс = ( А- 1 ) * 3 + 2 ;
Если Индекс < = РазмерМ - 1 Тогда
Массив64 [Индекс] = Ост;
КонецЕсли ;
Число3 = ( Число3 - Ост) / 256 ;
Ост = Число3 % 256 ;
Индекс = ( А- 1 ) * 3 + 1 ;
Если Индекс < = РазмерМ - 1 Тогда
Массив64 [Индекс] = Ост;
КонецЕсли ;
Число3 = ( Число3 - Ост) / 256 ;
Ост = Число3 % 256 ;
Массив64 [( А- 1 ) * 3 + 0 ] = Ост;
КонецЦикла ;
Возврат Массив64 ;
Иначе
Строка64 = "" ;
Кол3 = Цел( Массив64 . Количество( ) / 3 ) ;
Если Массив64 . Количество( ) % 3 < > 0 Тогда
Кол3 = Кол3 + 1 ;
КонецЕсли ;
Для А = 1 По Кол3 Цикл
Число3 = Массив64 [( А- 1 ) * 3 ];
Если ( А- 1 ) * 3 + 1 < = Массив64 . ВГраница( ) Тогда
Код3 = Массив64 [( А- 1 ) * 3 + 1 ];
Иначе
Код3 = 0 ;
КонецЕсли ;
Число3 = Число3 * 256 + Код3 ;
Если ( А- 1 ) * 3 + 2 < = Массив64 . ВГраница( ) Тогда
Код3 = Массив64 [( А- 1 ) * 3 + 2 ];
Иначе
Код3 = 0 ;
КонецЕсли ;
Число3 = Число3 * 256 + Код3 ;
Ост4 = Число3 % 64 ;
Число3 = ( Число3 - Ост4 ) / 64 ;
Ост3 = Число3 % 64 ;
Число3 = ( Число3 - Ост3 ) / 64 ;
Ост2 = Число3 % 64 ;
Число3 = ( Число3 - Ост2 ) / 64 ;
Ост1 = Число3 % 64 ;
Число3 = ( Число3 - Ост1 ) / 64 ;
стрН = Таб64 . Найти( Ост1 , "Код" ) ;
Если стрН = неопределено Тогда
Сообщить( "Ошибка при поиске" ) ;
Иначе
Строка64 = Строка64 + стрН. Символ;
КонецЕсли ;
стрН = Таб64 . Найти( Ост2 , "Код" ) ;
Если стрН = неопределено Тогда
Сообщить( "Ошибка при поиске" ) ;
Иначе
Строка64 = Строка64 + стрН. Символ;
КонецЕсли ;
стрН = Таб64 . Найти( Ост3 , "Код" ) ;
Если стрН = неопределено Тогда
Сообщить( "Ошибка при поиске" ) ;
Иначе
Строка64 = Строка64 + стрН. Символ;
КонецЕсли ;
стрН = Таб64 . Найти( Ост4 , "Код" ) ;
Если стрН = неопределено Тогда
Сообщить( "Ошибка при поиске" ) ;
Иначе
Строка64 = Строка64 + стрН. Символ;
КонецЕсли ;
КонецЦикла ;
Если Массив64 . Количество( ) % 3 = 1 Тогда
Строка64 = Лев( Строка64 , СтрДлина( Строка64 ) - 2 ) + "==" ;
ИначеЕсли Массив64 . Количество( ) % 3 = 2 Тогда
Строка64 = Лев( Строка64 , СтрДлина( Строка64 ) - 1 ) + "=" ;
КонецЕсли ;
Возврат Строка64 ;
КонецЕсли ;
КонецФункции