Имя: Пароль:
1C
 
Как проще разобрать такую строку? [ решено через PHP unserialize() ]
,
0 Гений 1С
 
гуру
30.06.22
19:48
Строка такая: a:3:{s:3:\"zip\";s:6:\"143982\";s:8:\"selected\";b:1;s:9:\"mail_type\";s:13:\"ONLINE_PARCEL\";}
Нужно было срочно, поэтому написал сам фукнцию, а вообще что это за формат и как его разбирать?
Вроде на JSON не похоже.

Функция РазбитьСтрокуФорматаДвоеточий(Знач Строка)                                                  
    //Пример строки:
    //a:3:{s:3:\"zip\";s:6:\"143982\";s:8:\"selected\";b:1;s:9:\"mail_type\";s:13:\"ONLINE_PARCEL\";}
    Строка = СтрЗаменить(Строка, "\""", "");
    Р = Новый Структура("zip, mail_type");
    М = СтрРазделить(Строка, ":;", ложь);
    Пред1 = Неопределено;
    Пред2 = Неопределено;
    Пред3 = Неопределено;
    Для Каждого Эл Из М Цикл
        Если Пред3 = "zip" Тогда
            Р.Вставить("zip", СтрЗаменить(Эл, """", ""));
        ИначеЕсли Пред3 = "mail_type" Тогда
            Р.Вставить("mail_type", СтрЗаменить(Эл, """", ""));
        КонецЕсли;
        Пред3 = Пред2;
        Пред2 = Пред1;
        Пред1 = Эл;
    КонецЦикла;    
    Возврат Р;
КонецФункции
11 Гений 1С
 
гуру
30.06.22
20:55
(8) там еще вложенность есть {}
12 Гений 1С
 
гуру
30.06.22
20:55
(10) Так себе подсказки
13 Ненавижу 1С
 
гуру
30.06.22
21:02
Начинать надо с того, где ты это взял?
14 Волшебник
 
30.06.22
21:28
(13) От Почты России. Написано в сабже.
15 Ненавижу 1С
 
гуру
30.06.22
21:32
(14) я получал от почты нормальный JSON, а не вот это вот всё, поэтому и спрашиваю предисторию
16 Волшебник
 
30.06.22
21:32
(15) Ну ждём автора-художника-гения...
17 youalex
 
01.07.22
03:56
(0) Выкладывай на Хабр
18 Маленький Вопросик
 
01.07.22
04:15
код не смотрел, но проще разобрать через кодсимвола
19 Anarki
 
01.07.22
06:01
В одной теме сразу две легенды
20 d_monah
 
01.07.22
06:34
Хм,дочка почты России сейчас активно набирает прогов на проект(мне свалилось тоже),если Гения берут в команду,я отказываюсь!!!Вроде тольуо стабилизировались,и вот на тебе..
21 Anarki
 
01.07.22
07:25
(0) решается примерно так:
В аутлуке пишешь авторам: привет, могу с кем нибудь поговорить из технических работников? И по телефону, в режиме реального времени обговариваете форматы. А если контора в усмерть бюрократы. Тогда именно такую стойку через регулярные выражения делать (не 1с). Но лучше тупо договориться с то стороной
22 Конструктор1С
 
01.07.22
07:42
(2) н-да. А пользоваться документацией и гуглить не пробовал?
23 Ненавижу 1С
 
гуру
01.07.22
07:45
(22) Серёжа программирует и вообще "Нужно было срочно", какое место на инфостарте?
24 d_monah
 
01.07.22
07:46
(22) А что,и так можно?Спасибо,буду пробовать.Или это только для гениев?
25 Конструктор1С
 
01.07.22
07:47
(23) никакого учётка давно проё, новая совершенно голая
26 d_monah
 
01.07.22
07:47
(23) Запомните раз и навсегда.ЧЕТВЕРТОЕ!Даже я со старческим своим склерозом помню.
27 Fish
 
01.07.22
08:28
(26) "ЧЕТВЕРТОЕ!" - А с какой стороны?
28 d_monah
 
01.07.22
08:35
(27) Не будьте таким душным,тем более гений про это не говорил.
29 Гений 1С
 
гуру
01.07.22
08:36
(15) этот ответ от почты россии передает веб-программист интернет-магазина в розницу при обмене розницы с сайтом.
30 Гений 1С
 
гуру
01.07.22
08:36
(22) не нюхал ты Уася, реальной жизни
31 Ненавижу 1С
 
гуру
01.07.22
08:37
(29) прямо веб-программист лично передает?
32 Ненавижу 1С
 
гуру
01.07.22
08:37
(29) какой запрос посылали, что пришел такой ответ?
33 d_monah
 
01.07.22
08:41
(31) Не лично,носит в Почту россии и бандеролью с описью.
34 Ненавижу 1С
 
гуру
01.07.22
08:54
(33) не совместимое АПИ https://fixinchik.ru/russkaya-pochta-chto-ty-natvorila/
35 mikecool
 
01.07.22
09:11
(34) он даже в почтовые ящики вбрасывает...
36 Kassern
 
01.07.22
09:12
(30) (0) У Почты России офигенное API и отзывчивая поддержка. Когда я внедрял интеграцию с ней, вообще проблем не было, если были вопросы, то в течение дня (порой часов) их тех поддержка отвечала. Я так же не понимаю, откуда вы эту строку дернули.
37 Kassern
 
01.07.22
09:13
ну офигенное, я конечно загнул, но вполне просто с ним разобраться и работать.
38 Гений 1С
 
гуру
01.07.22
09:14
(36) я уже писал - это не совсем почта россии, это ответ от почты россии сайту. сайт сохраняет его в своей БД и потом передает в 1С по XML
39 Гений 1С
 
гуру
01.07.22
09:14
(37) Ну я разобрался и работаю. ;-)
Кстати, прикольно, но в двух реализациях обмена с почтой россии видел аббревиатуру ШПИ, хотя в API такого нет. Кто-то у кого-то передирает?
40 d_monah
 
01.07.22
09:15
(34) Ну,ну это чересчур!))),был бы он сильным просто сломал бы ящик.
41 Гений 1С
 
гуру
01.07.22
09:15
(32) пользователь на сайте выбирает адрес и тариф, веб-программмист передает в 1С дополнительно индекс и тариф.
42 Kassern
 
01.07.22
09:15
(38) ну так ответ-то должен быть по api и с четкой структурой, которая задокументирована. Получается, что уже сайт таким образом сконвертировал ответ от почты, а не она его таким выплюнула.
43 Гений 1С
 
гуру
01.07.22
09:15
(40) я перешел на ЭДО в знак протеста
44 Гений 1С
 
гуру
01.07.22
09:15
(42) все так.
45 mikecool
 
01.07.22
09:16
(38) а причем тогда почта России?
46 Kassern
 
01.07.22
09:17
(44) зачем тогда писать, что строка от почты россии? Вы тем самым ввели людей в заблуждение. По факту, это строка от левого сайта, а откуда она ее собрал и состряпал в контексте задачи уже не важно
47 Ненавижу 1С
 
гуру
01.07.22
09:21
(38) а нормальное АПИ использовать нельзя? без вот этих вот сайтов?
48 Kassern
 
01.07.22
09:23
(47) как я понял, в контексте хотелки гени, это не нужно. Надо лишь пнуть кодера со стороны сайта, чтобы грузил данные в 1с с сайта в нормальном формате. Смысл с 2х мест стучать на почту, когда сайт уже все получил?
49 PLUT
 
01.07.22
09:26
слоган Почты России: еще не всё потеряно!
50 Ненавижу 1С
 
гуру
01.07.22
09:30
(48) смысл получать данные в 1С через сайты, если есть АПИ Почты России?
51 Гений 1С
 
гуру
01.07.22
09:31
(47) где? Пользователь делает заказ на сайте именно и потом уже сайт сообщает мне, какой тариф и адрес выбрал пользователь. Так что в данном случае не понимаю, почему ты завел канитель про нормальное API
52 Гений 1С
 
гуру
01.07.22
09:32
(50) потому что клиент делает заказ на сайте, а не в 1С, гыгыгы. Это же элементарно, Ватсон
53 Kassern
 
01.07.22
09:33
(50) да все просто. Покупатель на сайте делает заказ и выбирает нужный способ доставки, сайт стучит на почту передает адрес с весом, та ему возвращает стоимость доставки. Эти данные он показывает покупателю. Он делает заказ, который уже грузиться в 1с. Так вот в этом заказе и нужно передать данные в нормально формате полученные с почты. Это будет лучше чем потом 1ска еще раз постучится и снова будет получать стоимость доставки.
54 Kassern
 
01.07.22
09:34
(52) в любом случае потом из 1ски придется не раз еще почту России дергать (выгрузка посылки, этикетки, пререрасчет доставки и т.д.)
55 Kassern
 
01.07.22
09:34
Поэтому API со стороны 1с в любом случае желательно.
56 Kassern
 
01.07.22
09:35
да та же формализация адреса удобная штука у почты
57 Ненавижу 1С
 
гуру
01.07.22
09:36
(52) я не могу читать мысли твоих тараканов
58 Гений 1С
 
гуру
01.07.22
09:39
(57) читай мои комменты, я уже раз пять описал схему.
59 Гений 1С
 
гуру
01.07.22
09:40
(54) это да, там используется API, ага
60 Гений 1С
 
гуру
01.07.22
09:40
(53) тут вопрос не в том лучше или хуже, а в том, чтобы пользователю доставили именно тем тарифом и по той цене, что ему сказал сайт.
Это и для СДЭК актуально.
Пока не ковырялся в этом говнище, и не знал, что это важно.
61 Ненавижу 1С
 
гуру
01.07.22
09:41
(58) в топике ничего не было, а это говорит об умении формулировать задачи
62 Гений 1С
 
гуру
01.07.22
09:42
(61) надо читать не только топик, но и уточнения. Ну или не читать, если моё умение формулировать задачи не устраивает. ага
63 Fragster
 
гуру
01.07.22
09:42
64 Fragster
 
гуру
01.07.22
09:42
итого - сделать прокладку на php, которая вернет json
65 Конструктор1С
 
01.07.22
09:46
(30) в отличии от тебя я читаю доку
66 PLUT
 
01.07.22
09:50
(63) что-то не на одноэсном. эта сложна. вот в (0) всё панятно
67 Конструктор1С
 
01.07.22
09:50
(47) где Г1С и где нормально. "Делать без костылей, писать код нормально, читать документацию?.. Да ну, бред какой-то"
68 Ненавижу 1С
 
гуру
01.07.22
09:52
(67) "в бюджет не впишемся" ))
69 PLUT
 
01.07.22
09:52
(66) магия! нажал Run code и  

array (
  'zip' => '143982',
  'selected' => true,
  'mail_type' => 'ONLINE_PARCEL',
)
70 Kassern
 
01.07.22
09:55
ну хочется ТСу через гланды информацию получать для 1с, ну бог с ним. По мне так, если есть возможность пнуть кодера со стороны сайта, то это лучший вариант. В противном случае, я бы с 1ски API почты дергал. Парсить внутрянку перехваченных ответов сайта - это какой-то изврат
71 PLUT
 
01.07.22
09:56
(70) ну в (0) похоже сериализованная пыхыпыщная строка (63) на сайте хранится? пинать нужно пыхаря на сайте, чтобы жысон гению возвращал?
72 Kassern
 
01.07.22
09:58
(71) конечно пинать пыхаря, чтобы он в json/xml выгружал данные о заказе, в том числе стоимость доставки, траспортную компанию, индекс и т.д.
73 Fragster
 
гуру
01.07.22
10:21
скорее всего там просто заменить serialize на json_encode
74 Гений 1С
 
гуру
01.07.22
10:32
(63) офигеть. ;-) значит на сейте кодит любитель пыхапе.
75 Гений 1С
 
гуру
01.07.22
10:33
(73) раз это умеет разобрать пыхапе, то и 1с сможет, уже нащупали формат, отлично
76 Kassern
 
01.07.22
10:34
(75) походу это не излечимо...
77 Гений 1С
 
гуру
01.07.22
10:44
(70) вот мне чисто инетерсно, что ты собрался с Почты дергать, если выбранный пользователем тариф и адрес хранятся на сайте интернет-магазина? Вот жутко любопытно.
78 Гений 1С
 
гуру
01.07.22
10:46
в общем, благодаря сообчеству мы формат строки определили - это пышпэшная сериализованная структура.
Можно поискать готовую функцию конвертации такой структуры в структуру 1С, но пожалуй не буду, оставлю так.
Да, пыхапыря сайта нагнуть сложно - их там два. Один плагины прикручивает, другой в 1С передает.
Проще выцепить что дают.
79 Кирпич
 
01.07.22
10:48
Чо там разбирать. СтрНайти и в кассу. Начали тут PHP.... API... Как разобрать....
80 Волшебник
 
01.07.22
10:50
(63) Гениально
81 Fragster
 
гуру
01.07.22
10:53
(78) -> (73)
82 Fragster
 
гуру
01.07.22
10:53
поменять вызываемую функцию
83 Fish
 
01.07.22
10:55
Так что? Гениальная функция из (0) оказалась не нужна? Ну вот, так всегда - "на самом интересном месте..." (с)
84 Kassern
 
01.07.22
10:57
(77) я бы дернул разработчика сайта, чтобы он мне выгрузил данные заказа корректно, а не изобретал велосипеды.
85 Kassern
 
01.07.22
10:58
там делов на считанные минуты, добавить в готовую выгрузку доп поля по заказу
86 Гений 1С
 
гуру
01.07.22
11:02
(85) всегда ржу, когда слышу "делов на считанные минуты".
87 Гений 1С
 
гуру
01.07.22
11:03
(83) в смысле не нужна? Готовой то функции Unserialize на 1С нет. Так что очень даже нужна и работает. ;-)
88 Гений 1С
 
гуру
01.07.22
11:03
(84) да там сложно дергать. Удёргаешься
89 Kassern
 
01.07.22
11:04
(86) я по личному опыту сужу, множество обменов с сайтами написал и с подобными задачами часто сталкивался. Обычно адекватные разработчики сайтов попадались, оперативно вопрос решали.
90 Kassern
 
01.07.22
11:07
(88) ну так есть хозя, который денюшку платит этому разрабу, через него и дергается, раз на прямую не можешь. Надо разграничивать задачи, по факту это не задача для 1с, пытаться выхватить у сайта инфу, как там заказали, а работа для разработчика сайта, чтобы он доработал обмен со своей стороны и выгрузил данные корректно. Тем более интеграция с ТК (транспортными компаниями) у него уже есть, данные у него в базе хранятся (как заказ был сделан), все что осталось в текущий обмен добавить пару тегов и все.
91 Гений 1С
 
гуру
01.07.22
11:16
(84) про разработчика понятно, но ты там собирался АПИ Почты дергать, вот я и спросил. АПИ Почты тут дергать нет смысла, ОК
(90) Это прописные истины. Но в данном случае проще разобрать чем дернуть.
92 Гений 1С
 
гуру
01.07.22
11:17
(89) в IT нет "считанных минут", пора уже это понимать. Как минимум, тестировать надо после каждой такой "пятиминутки"
93 Kassern
 
01.07.22
11:20
(92) "считанных минут" - это фактическое время, чтобы добавить тег в выгрузку с данными, которые легко из базы получить. Особенно, когда у тебя код с выгрузкой перед глазами открыт. Чуть больше времени нужно, чтобы этот тег корректно в 1с загрузить.
94 Fragster
 
гуру
01.07.22
11:28
(88) лучше, конечно, потратить минимум несколько часов на создание глючного велосипеда (а тестировать ты его будешь на соответствие спецификации? сколько это займет? один рабочий день? два?), чем поменять/добавить такой же но другой эндпоинт с использованием другой типовой функции
95 Kassern
 
01.07.22
11:29
(94) фиксин -логика, создать проблему и героически ее решить. При этом выкатить клиенту счет за потраченные часы.
96 PLUT
 
01.07.22
11:31
(92) с тебя 2,5 килорубля за час работы одноэсника, ггггыы

УФ: Как в поле ввода (колонка таблицы) активизировать выбор значения?
97 Kassern
 
01.07.22
11:32
хотя Хозя мог по факту заплатить час работы программисту сайта и час работы 1снику и сделать все красиво, если бы ТС это предложил. И час тут не фактическое время, а минимальное для оплаты.
98 Kassern
 
01.07.22
11:32
Можно даже сделать универсально для всех ТК с которыми обмен, это будет еще лучше
99 Kassern
 
01.07.22
11:33
В итоге получится, ТС что-то там без ведома разраба сайта стянул, а разраб через недельку взял, да формат поменял, так как не в курсе, что 1ска там что-то дергает из внутрянки. А потом хозя волосы на груди рвет, почему обмен заказов встал, а ТС в отпуск свалил)
100 Кирпич
 
01.07.22
11:39
а у меня гугл работает
https://reks.biz/?p=2368
101 Кирпич
 
01.07.22
11:50
Но там тоже какой то гений писал. Так что лучше (0)
102 Kassern
 
01.07.22
11:52
(101) (100) не открывается ссылка...
103 Кирпич
 
01.07.22
11:56
(102) позвони админу :)
104 Конструктор1С
 
01.07.22
11:57
(99) ТС постановит: "ггг... кризис вайти"
105 Кирпич
 
01.07.22
11:57
Код отсюда https://reks.biz/?p=2368

&НаКлиенте
Функция СредPHP(Строка, НачальныйНомер, ЧислоСимволов) Экспорт
    
    КурсорСтроки = НачальныйНомер;
    Пока КурсорСтроки < НачальныйНомер + ЧислоСимволов Цикл
        КодСимволаРНР = КодСимвола(Строка, КурсорСтроки);
        Если КодСимволаРНР < 128 Тогда
        ИначеЕсли КодСимволаРНР < 2048 Тогда
            ЧислоСимволов = ЧислоСимволов - 1;
        ИначеЕсли КодСимволаРНР < 65536 Тогда
            ЧислоСимволов = ЧислоСимволов - 2;
        Иначе
            ЧислоСимволов = ЧислоСимволов - 3;
        КонецЕсли;
        КурсорСтроки = КурсорСтроки + 1;
    КонецЦикла;
    
    Возврат Сред(Строка, НачальныйНомер, ЧислоСимволов);
    
КонецФункции

&НаКлиенте
Функция ДесериализоватьРНР(СтрокаСериализации, КурсорСтроки=1)
    
    Если КурсорСтроки < СтрДлина(СтрокаСериализации) Тогда
        
        СимволТипа = Сред(СтрокаСериализации, КурсорСтроки, 1);
        Если СимволТипа = "b" Тогда
            
            // b:<i>;
            Логическое = ?(Сред(СтрокаСериализации, КурсорСтроки + 2, 1) = "1", Истина, Ложь);
            КурсорСтроки = КурсорСтроки + 4;
            Возврат Логическое;
            
        ИначеЕсли СимволТипа = "i" Тогда
            
            // i:<i>;
            КурсорСтроки = КурсорСтроки + 2;
            КонецЗначения = СтрНайти(СтрокаСериализации, ";", НаправлениеПоиска.СНачала, КурсорСтроки, 1);
            Целое = Число(Сред(СтрокаСериализации, КурсорСтроки, КонецЗначения - КурсорСтроки));
            КурсорСтроки = КонецЗначения + 1;
            Возврат Целое;
            
        ИначеЕсли СимволТипа = "d" Тогда
            
            // d:<f>;
            КурсорСтроки = КурсорСтроки + 2;
            КонецЗначения = СтрНайти(СтрокаСериализации, ";", НаправлениеПоиска.СНачала, КурсорСтроки, 1);
            Десятичное = Число(Сред(СтрокаСериализации, КурсорСтроки, КонецЗначения - КурсорСтроки));
            КурсорСтроки = КонецЗначения + 1;
            Возврат Десятичное;
            
        ИначеЕсли СимволТипа = "s" Тогда
            
            // s:<i>:"<s>";
            КурсорСтроки = КурсорСтроки + 2;
            КонецЗначения = СтрНайти(СтрокаСериализации, ":", НаправлениеПоиска.СНачала, КурсорСтроки, 1);
            ДлинаСтрокового = Число(Сред(СтрокаСериализации, КурсорСтроки, КонецЗначения - КурсорСтроки));
            КурсорСтроки = КонецЗначения + 1;
            Строковое = СредPHP(СтрокаСериализации, КурсорСтроки + 1, ДлинаСтрокового);
            КурсорСтроки = КурсорСтроки + ДлинаСтрокового + 3;
            Возврат Строковое;
            
        ИначеЕсли СимволТипа = "N" Тогда
            
            // N;
            КурсорСтроки = КурсорСтроки + 2;
            Возврат NULL;
            
        ИначеЕсли СимволТипа = "a" Тогда
            
            // a:<i>:{<elements>}
            КурсорСтроки = КурсорСтроки + 2;
            КонецЗначения = СтрНайти(СтрокаСериализации, ":", НаправлениеПоиска.СНачала, КурсорСтроки, 1);
            РазмерМассива = Число(Сред(СтрокаСериализации, КурсорСтроки, КонецЗначения - КурсорСтроки));
            КурсорСтроки = КонецЗначения + 2;
            Составной = Новый Соответствие;
            Для ИндексМассива = 1 По РазмерМассива Цикл
                КлючМассива = ДесериализоватьРНР(СтрокаСериализации, КурсорСтроки);
                ЗначениеМассива = ДесериализоватьРНР(СтрокаСериализации, КурсорСтроки);
                Составной.Вставить(КлючМассива, ЗначениеМассива);
            КонецЦикла;
            КурсорСтроки = КурсорСтроки + 1;
            Возврат Составной;
            
        ИначеЕсли СимволТипа = "O" Тогда
            
            // O:<i>:"<s>":<i>:{<properties>}
            КурсорСтроки = КурсорСтроки + 2;
            КонецЗначения = СтрНайти(СтрокаСериализации, ":", НаправлениеПоиска.СНачала, КурсорСтроки, 1);
            ДлинаСтрокового = Число(Сред(СтрокаСериализации, КурсорСтроки, КонецЗначения - КурсорСтроки));
            КурсорСтроки = КонецЗначения + 1;
            ИмяОбъекта = Сред(СтрокаСериализации, КурсорСтроки + 1, ДлинаСтрокового);
            КурсорСтроки = КурсорСтроки + ДлинаСтрокового + 3;
            // ...<i>
            КонецЗначения = СтрНайти(СтрокаСериализации, ":", НаправлениеПоиска.СНачала, КурсорСтроки, 1);
            РазмерМассива = Число(Сред(СтрокаСериализации, КурсорСтроки, КонецЗначения - КурсорСтроки));
            КурсорСтроки = КонецЗначения + 2;
            Составной = Новый Соответствие;
            Составной.Вставить(NULL, ИмяОбъекта);
            Для ИндексМассива = 1 По РазмерМассива Цикл
                КлючМассива = ДесериализоватьРНР(СтрокаСериализации, КурсорСтроки);
                ЗначениеМассива = ДесериализоватьРНР(СтрокаСериализации, КурсорСтроки);
                Составной.Вставить(КлючМассива, ЗначениеМассива);
            КонецЦикла;
            КурсорСтроки = КурсорСтроки + 1;
            Возврат Составной;    
        Иначе
            Возврат Неопределено;
        КонецЕсли;
    Иначе
        Возврат Неопределено;
    КонецЕсли;
КонецФункции
106 Кирпич
 
01.07.22
11:59
только оно не понимает экранирование ковычки. нужно сначала заменить все \"
107 PLUT
 
01.07.22
12:05
(105) надо просто подождать выхода новой платформы. наверн добавят скоро (по просьбам?)

джысона тоже когда-то в платформе не было, был программный парсер
108 Гений 1С
 
гуру
10.07.22
19:37
Кстати, нашел сериализатор/десерилазатор PHP: https://reks.biz/?p=2368
109 Гений 1С
 
гуру
10.07.22
19:37
(100) о, держи пять, параллельно нашли
110 Гений 1С
 
гуру
10.07.22
19:55
Правда, пришлось сперва убирать экранированные кавычки:

Функция ДесериализоватьРНРСЭкранированнойКавычкой(Знач СтрокаСериализации) Экспорт  
    СтрокаСериализации = СтрЗаменить(СтрокаСериализации, "\""", """");
    Возврат ДесериализоватьРНР(СтрокаСериализации);
КонецФункции
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший