Получаю от Kafka json
[
    {
        "topic": "AWIS3_CatalogSettlements",
        "key": "AAAAA89IMGU1ZjBjYjYtNGIzYS0xMWU0LWFiNmQtMDA1MDU2ODAxMzI5",
        "value": "AAAAA9BIMGU1ZjBjYjYtNGIzYS0xMWU0LWFiNmQtMDA1MDU2ODAxMzI5CjE­5Mjg0INCe0YHRgtGA0ZbQudC60LhIYmZkZmFhYjUtNzRjZS00ZTRjLTk3ZWY­tYzRlZjNjY2NjOGNhAEhlNGFiMTU3MC00YjMzLTExZTQtYWI2ZC0wMDUwNTY­4MDEzMjlINTYzY2VkMTMtZjIxMC0xMWUzLThjNGEtMDA1MDU2ODAwMmNmJDQ­5LjgxMjM4ODAwMDAwMDAwMCQzMC4zMTU2ODgwMDAwMDAwMDBIODU1ZTU0OTg­tNTQ0NS0xMWVkLWEzNjEtNDhkZjM3YjkyMDk2SDAwMDAwMDAwLTAwMDAtMDA­wMC0wMDAwLTAwMDAwMDAwMDAwMAAA",
        "partition": 0,
        "offset": 33009
    }
]

Передаю значение "value" как строка Строка64 в код

 ДвДанные = Base64Значение(Строка64);
 ЧтениеДвДанных = Новый ЧтениеДанных(ДвДанные);
 ДекодированнаяСтрока = ЧтениеДвДанных.ПрочитатьСимволы();
 ЧтениеДвДанных.Закрыть();

в ДекодированнаяСтрока получаю ответ

   �H
   0e5f0cb6-4b3a-11e4-ab6d-00505680132919284
   Острійки
   H
   bfdfaab5-74ce-4e4c-97ef-c4ef3cccc8ca
   H
   e4ab1570-4b33-11e4-ab6d-005056801329
   H
   563ced13-f210-11e3-8c4a-0050568002cf$
   49.812388000000000$30.315688000000000
   H
   855e5498-5445-11ed-a361-48df37b92096
   H
   00000000-0000-0000-0000-000000000000

как видим данные читаются есть название населенного пункта(Острійки), есть координаты(49.812388000000000$30.315688000000000), и какие то GUID все это разделено символом "H"

Вопрос как заставить платформу прочитать эти данные в более нормальном(читабельном) виде?
---
в данном случаи было несколько ошибок постараюсь кратко описать
1. формат при создании подписчика binary работал по первоначально переданной ссылке, а для работы с avro надо было использовать ссылку которая возвращается при при создании подписчика
2. при получении данных надо передать в заголовках
Accept application/vnd.kafka.avro.v2+json
Content-Type application/vnd.kafka.avro.v2+json

после этих исправлений удалось данные корректно получить в json
всем спасибо кто принимал участие
---
Вопрос как заставить платформу прочитать эти данные в более нормальном(читабельном) виде?
А платформа об этом знает? Сомневаюсь.
А гуиды вполне возможно идентификаторы самой системы кафки. Посмотрите документацию. Возможно по ним можно получить подробное описание.
 Ну и соответственно составлять таблицу соответствий этих гуид и своих объектов в базе.
---
сначала хочется получить как то вменяемо эти данные, т.е. в какой то универсальной коллекции
---
в какой то универсальной коллекции Массив подойдет в качестве "универсальной коллекции"? Если да, то вам его создаст СтрРазделить() с символом "H" в качестве разделителя.

Или "H$", тогда и координаты тоже сразу станут отдельными элементами массива.
---
https://infostart.ru/1c/articles/990211/
https://infostart.ru/public/1222593/
---
конечно видел эту статью, ответа на свой вопрос не нашел
---
а так что хоть ?

```1c
    ДекодированнаяСтрока = ЧтениеДвДанных.ПрочитатьСтроку();
```
---
Ну или так

```1c
    ДекодированнаяСтрока = ПолучитьСтрокуИзДвоичныхДанных(Base64Значение(Строка64));
```
---
Да и.. точно на выходе нужно строку иметь.. ? а не коллекцию какую-нить чего-нибудь
---
на выходе все что угодно что бы прочитать нормально
---
Нет, не то
Может покопать в этом направлении: просто когда наоборот 1С должна отдавать, то работает такой код, а тут надо наоборот

```1c
    codeVerifier = ГенерацияСлучайногоНабораСимволов48(ТекущаяУниверсальнаяДатаВМиллисекундах());
    //КонецЕсли;
    //Если Не ЗначениеЗаполнено(codeChallenge) Тогда
    Хэш = Новый ХешированиеДанных(ХешФункция.SHA256);
    Хэш.Добавить(codeVerifier);

    СтрокаBase64 = Base64Строка(Хэш.ХешСумма);
    СтрокаBase64 = СтрЗаменить(СтрокаBase64, "=", ");
    СтрокаBase64 = СтрЗаменить(СтрокаBase64, "+", "-");
    СтрокаBase64 = СтрЗаменить(СтрокаBase64, "/", "_");

    codeChallenge = СтрокаBase64;
    //КонецЕсли;
```
---
(5) возвращают то же что и (1)
"�H
0e5f...."

 при десерелизации масив соответствий значение value остается строкой
---
вот тоже не дает покоя что key что value начинаются с ААААА это какой то объект, но отправляющая сторона говорит все сделано по доке
https://docs.confluent.io/platform/current/tutorials/examples/clients/docs/rest-proxy.html
......
по доке я данные и получил, а как достать ...... как в той присказке "видит глаз да зуб неймет"
---
отправляющая сторона говорит все сделано по доке
отправляющая сторона в каком формате отправляет вам?
Запросите пример отправки
---
уже запросил, жду
---
не дает покоя что key что value начинаются с ААААА Это нулевые байты.
Один символ Base64 кодирует 6 бит данных. "A" это по сути 000000 в двоичной системе.
Символы64: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567­89+/
---
это решение я понимаю, вижу риски тут если
в начале какие то непонятные байты "�H
если в какой то момент разделителем "станет" другой символ, или этот символ попадет в значения вложениях данных СтрРазделить вернет не верные данные
---
в начале какие то непонятные байты "�H Ну, это просто - первый элемент массива отбрасываем, в нем будет только "�"
если в какой то момент разделителем "станет" другой символ Тогда надо будет генерировать сообщение об ошибке вида "Пригласите программиста!". :-)

ИМХО, в программировании не надо пытаться предусмотреть то, чего нет и, возможно, никогда не будет, надо писать программу для тех условий, что есть сейчас.
или этот символ попадет в значения вложениях данных А вот это теоретически возможно. Но не в GUID, их формат определен, а в название населенного пункта - если оно будет начинаться с большой латинской "H". Может ли такое быть в вашей задаче - я не знаю.
---
с большой латинской "H". Может ли такое быть в вашей задаче - я не знаю.
в том то и дело что может это ж только маленький пример для теста, там около 80+ topic по 5 из которых планируется интеграция а дальше если взлетит больше
---
Ну не используйте СтрРазделить.
Элементарная же обработка - берете первую строку, какой в ней символ есть, тот и разделитель.
Дальше просто в цикле построчно читаете данные.
Если строка формата ГУИДа, это ГУИД, иначе это координаты или название пункта.
В чем у вас сложность, не понимаю.
---
в том то и дело что может это ж только маленький пример для теста А, кстати, вы этот пример привели as is, или отредактировали?

То есть, декодированные данные исходно содержат символы перевода строки или это вы их туда добавили для удобства чтения?

Если содержит, то можно разделять строку в массив по Символы.ПС, а дальше в цикле проверять элементы массива:
1. Если СтрДлина(ЭлементМассива)<=2 (на всякий случай) - это разделитель (любой символ!), пропускаем.
2. Если Сред(ЭлементМассива,9)="-" И Сред(ЭлементМассива,14)="-" И Сред(ЭлементМассива,19)="-" И Сред(ЭлементМассива,24)="-" и Найти(ЭлементМассива,"$")>0 - это GUID+координаты, разлагаем элемент по "$"
3. Если Сред(ЭлементМассива,9)="-" И Сред(ЭлементМассива,14)="-" ИСред(ЭлементМассива,19)="-" ИСред(ЭлементМассива,24)="-" - это GUID.
4. Иначе - это населенный пункт.
---
А, кстати, вы этот пример привели as is, или отредактировали?
перевод строки добавил я что бы картинку не прикреплять
---
перевод строки добавил я Жаль. Ну, тогда вам отличную идею подал Sashares: перебираем строку посимвольно, как только нашли символ с кодом в диапазоне от 48 до 255 - это разделитель, по нему разлагаем в массив.
---
в начале какие то непонятные байты "�H
Это (�) вполне может быть байт указания символа разделителя. В данном случае символом указан H.
Т.е. вполне можно узнать символ разделитель и разделить по нему.
---
пока копаю в сторону создания потребителя попробовать вместо binary передать avro
---
Скинули пример? покажите?
---
пока нет, жду
это огромная структура, даже не дают контакты человека с которым можно поговорить, все через менеджеров как с их так и с нашей стороны, ничего нового, как всегда 1с копает
---
Вот такой мой вариант. Ищем все GUID в строке. Все найденные GUID сохраняем в массиве.
Далее уже от них ищем индекс и город.
Широту и долготу по ищем по "$"
СтроковыеФункцииКлиентСервер.ЭтоУникальныйИдентификатор это БСП функция. Показывать здесь её не буду, сможете посмотреть у себя.

```1c
    ДекодированнаяСтрока = ПолучитьСтрокуИзДвоичныхДанных(Base64Значение(Base64Text));
    МассивGUID = Новый Массив;

    Для Индекс = 1 По СтрДлина(ДекодированнаяСтрока) Цикл
    GUID = Сред(ДекодированнаяСтрока, Индекс, 36);

    Если СтроковыеФункцииКлиентСервер.ЭтоУникальныйИдентификатор(GUID) Тогда
    МассивGUID.Добавить(GUID);
    КонецЕсли;
    КонецЦикла;

    Если МассивGUID.Количество() > 0 Тогда
    ПозицияГородаСИндексомНачало = СтрНайти(ДекодированнаяСтрока, МассивGUID[0])+36;
    ПозицияГородаСИндексомКонец = СтрНайти(ДекодированнаяСтрока, МассивGUID[1])-1;
    ИндексИГород = СокрЛП(Сред(ДекодированнаяСтрока, ПозицияГородаСИндексомНачало, ПозицияГородаСИндексомКонец-ПозицияГородаСИндексомНачало));
    КонецЕсли;

    ПозицияШирота = СтрНайти(ДекодированнаяСтрока, "$")+1;
    ПозицияДолгота = СтрНайти(ДекодированнаяСтрока, "$",,ПозицияШирота)+1;

    Широта = Сред(ДекодированнаяСтрока, ПозицияШирота, 18);
    Долгота = Сред(ДекодированнаяСтрока, ПозицияДолгота, 18);
```
---
спасибо за Ваш алгоритм, вчера презентовал что то подобное на дейли, где присутствовал и архитектор.
приняли решение что схема рабочая, но пока будем искать другое решение
отправили запрос в компанию вледелец сервиса, посмотрим что ответят
---
пока будем искать другое решение Даже интересно - чем не устраивает ни одно из предложенных? Тем, что "однажды внезапно все может поменяться"? Ну, тогда для решения задачи нужен ИИ (искусственный интеллект), который будет понимать содержимое строки.

Или волшебное заклинание: "Сим-салабим-ахалай-махалай!" - и строка сама разложилась так, как нужно!

Кроме сложностей с практической реализацией этих двух методов есть еще один маааленький нюанс: оба стоят несколько больше, чем 10 $m. ;-)
---
больше, чем 10 $m
конечно если искать решение то так, я писал вопрос в надежде что у кого то уже был подобный опыт с кафкой, и когда найду решение обязательно его тут опубликую
как написал user5300 тут надо ещё понять что отдающая сторона ложит в бейс64, что бы корректно прочитать
жду ответа от владельца сервиса
---
Платформа тут причем? Это я так понимаю закодированные гео данные. Расшифровываются через запрос к сервису новой почты ua.

```1c
    params = {
    "modelName": "AddressGeneral",
    "calledMethod": "getSettlements",
    "methodProperties": {
    "AreaRef": "dcaadb64-4b33-11e4-ab6d-005056801329",
    "Ref": "0e451e40-4b3a-11e4-ab6d-005056801329",
    "RegionRef": "e4b03a8f-4b33-11e4-ab6d-005056801329",
    "Page": "1",
    "Warehouse": "1"
    },
    "apiKey": "Мой_ключ-3b4674-"
    };
```
---
надо ещё понять что отдающая сторона ложит в бейс64, что бы корректно прочитать А данные в (1) откуда взялись? С межэтажного перекрытия? :-)
жду ответа от владельца сервиса Может, ветку следовало создавать после этого?

А то получается задачка почти как в сказке: "Прочитай то - не знаю что, раскодируй туда - не знаю куда".
---
я не с апи получаю данные, а с кафки через REST Proxy: Example for Apache Kafka, пока так стоит задача.
---
Нужно просто строку разделить по "H"?
---
нет, надо значение value преобразовать в коллекцию 1с, другим способом, без разделения по Н
---
в данном случаи было несколько ошибок постараюсь кратко описать
1. формат при создании подписчика binary работал по первоначально переданной ссылке, а для работы с avro надо было использовать ссылку которая возвращается при при создании подписчика
2. при получении данных надо передать в заголовках
Accept application/vnd.kafka.avro.v2+json
Content-Type application/vnd.kafka.avro.v2+json

после этих исправлений удалось данные корректно получить в json
всем спасибо кто принимал участие