Имя: Пароль:
1C
1С v8
Массив в строку (http_build_query)
,
0 Zyka
 
02.06.14
13:07
Доброго времени суток, прошу вашей помощи. Есть необходимость отправки запроса на сайт, запрос представляет собой многоуровневый массив, который судя по php библиотеке (прилагаемой) перед отправкой преобразовывается в строку методом "http_build_query", пример:
if (isset($data)) {
     $post_body = http_build_query($data*);
     curl_setopt($curl, CURLOPT_POST, true);
     curl_setopt($curl, CURLOPT_POSTFIELDS, $post_body);
}
*где $data многоуровневый массив.

Никак не выходит преобразоваться массив 1С в строку, имеется прекрасный метод "КодироватьСтроку", однако само его название говорит за себя.

Если же имеется выход в данный ситуации, буду очень признателен.

Спасибо.
1 Zyka
 
02.06.14
13:26
Пытался имитировать массив создавая изначально его php строкой, после пользовался функцией "КодироватьСтроку" и вроде как похоже, но это ужас, т.к. обрабатываться будет большое количество данных и использование данного метода не ок, хотя если раздуплиться касательно создания многуровневого массива строкой, может будет проще. помогите!)
2 Ислам
 
02.06.14
13:41
(0) Очень хорошо оформлена просьба помочь. Мне нравится. Если бы я знал как, я бы помог.
Всем советую подсказать человеку если знаете ответ на вопрос.
3 Segate
 
02.06.14
13:50
(0)а что мешает написаль такую процедуру? Судя по документации там нет ничего особо сложного, за исключением представлений элементов.

string http_build_query ( mixed $query_data [, string $numeric_prefix [, string $arg_separator [, int $enc_type = PHP_QUERY_RFC1738 ]]] )

Если навскидку, то берем массив, обходим его рекурсивно, и пихаем в строку через разделитель. Для того чтоб наши параметры были правильными, надо наваять правильный массив. но это уже совсем другая история
4 Zyka
 
02.06.14
16:29
(2) (3) Спасибо за то что не обошли вниманием.
(3) Концепция ясна, буду пробовать формировать массив по указанной структуре. Спасибо.

Однако, думаю тема ещё не закрыта.
5 Zyka
 
05.06.14
10:37
Можно закрывать.
6 CPU0
 
05.06.14
17:47
(0)(3)(5) JSON?
7 CPU0
 
05.06.14
17:48
8 Zyka
 
09.06.14
17:15
У меня имеются обработки для преобразования структуры (сложной, с вложенными массивами) в JSON, но в данном случае требовалось отправка в формате PHP, возможно кому то будет полезно.

("Content-Type", "multipart/form-data; boundary=My1cV8bNdr")

******************************

Индекс = 0;

ФайлОтправки = Новый ЗаписьТекста(ИмяФайлаОтправки);
        
ФайлОтправки.ЗаписатьСтроку("--My1cV8bNdr");
    ФайлОтправки.ЗаписатьСтроку("content-disposition: form-data; name=""login""" + Символы.ВК + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку("--My1cV8bNdr");

ФайлОтправки.ЗаписатьСтроку("--My1cV8bNdr");
    ФайлОтправки.ЗаписатьСтроку("content-disposition: form-data; name=""login""" + Символы.ВК + Символы.ПС);
    ФайлОтправки.ЗаписатьСтроку(СтруктураОтвета.login);
ФайлОтправки.ЗаписатьСтроку("--My1cV8bNdr");

ФайлОтправки.ЗаписатьСтроку("--My1cV8bNdr");
    ФайлОтправки.ЗаписатьСтроку("content-disposition: form-data; name=""token""" + Символы.ВК + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку("--My1cV8bNdr");

ФайлОтправки.ЗаписатьСтроку("--My1cV8bNdr");
    ФайлОтправки.ЗаписатьСтроку("content-disposition: form-data; name=""token""" + Символы.ВК + Символы.ПС);
    ФайлОтправки.ЗаписатьСтроку(СтруктураОтвета.token);
ФайлОтправки.ЗаписатьСтроку("--My1cV8bNdr");

//обработка массива
Для Каждого Стр Из Массив Цикл
    
    ФайлОтправки.ЗаписатьСтроку("--My1cV8bNdr");
        ФайлОтправки.ЗаписатьСтроку("content-disposition: form-data; name=""orders[" + Строка(Индекс) + "][sku]""" + Символы.ВК + Символы.ПС);
        ФайлОтправки.ЗаписатьСтроку(Формат(Доставка.Номер, "ЧЦ=11"));
    ФайлОтправки.ЗаписатьСтроку("--My1cV8bNdr");

    ФайлОтправки.ЗаписатьСтроку("--My1cV8bNdr");
        ФайлОтправки.ЗаписатьСтроку("content-disposition: form-data; name=""orders[" + Строка(Индекс) + "][price]""" + Символы.ВК + Символы.ПС);
        ФайлОтправки.ЗаписатьСтроку(Доставка.ОценочнаяСтоимость);
    ФайлОтправки.ЗаписатьСтроку("--My1cV8bNdr");

    ФайлОтправки.ЗаписатьСтроку("--My1cV8bNdr");
        ФайлОтправки.ЗаписатьСтроку("content-disposition: form-data; name=""orders[" + Строка(Индекс) + "][payed]""" + Символы.ВК + Символы.ПС);
        ФайлОтправки.ЗаписатьСтроку(1);
    ФайлОтправки.ЗаписатьСтроку("--My1cV8bNdr");

    ФайлОтправки.ЗаписатьСтроку("--My1cV8bNdr");
        ФайлОтправки.ЗаписатьСтроку("content-disposition: form-data; name=""orders[" + Строка(Индекс) + "][buyer_phone]""" + Символы.ВК + Символы.ПС);
        ФайлОтправки.ЗаписатьСтроку(Доставка.Телефон);
    ФайлОтправки.ЗаписатьСтроку("--My1cV8bNdr");

    ФайлОтправки.ЗаписатьСтроку("--My1cV8bNdr");
        ФайлОтправки.ЗаписатьСтроку("content-disposition: form-data; name=""orders[" + Строка(Индекс) + "][buyer_fio]""" + Символы.ВК + Символы.ПС);
        ФайлОтправки.ЗаписатьСтроку(Доставка.КонтактноеЛицо);
    ФайлОтправки.ЗаписатьСтроку("--My1cV8bNdr");

    ФайлОтправки.ЗаписатьСтроку("--My1cV8bNdr");
        ФайлОтправки.ЗаписатьСтроку("content-disposition: form-data; name=""orders[" + Строка(Индекс) + "][comment]""" + Символы.ВК + Символы.ПС);
        ФайлОтправки.ЗаписатьСтроку(Доставка.ДополнительнаяИнформация);
    ФайлОтправки.ЗаписатьСтроку("--My1cV8bNdr");

    Индекс = Индекс + 1;

КонецЦикла;

ФайлОтправки.Закрыть();

Как понятно из этого кода, составление даже многоуровневых массивов теперь не составляет труда.
9 Segate
 
09.06.14
17:28
(8) а нельзя скажем параметры хранить в структурах(лучше на стороне клиента, чтоб список параметров можно было бы "на лету" изменять) и обходить эту хрень в цикле... кораздо же изящнее будет
10 Zyka
 
09.06.14
17:36
Да, разумеется это всё после было вынесено в константы, я тоже не терплю всяких НайтиПоКоду(), однако надо было решить вопрос в контексте "чтобы работало", в таком виде код простоял менее 2х часов. Спасибо за замечание.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший