Версия для печати темы (https://pro1c.org.ua/index.php?s=2dba5a29195ac2fd10ff71145d5fd414&showtopic=16942)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Выгрузка из 1С на сайт под OWOX

Автор: onsamuy 07.03.14, 12:54

Пишу обмен с сайтом на движке OWOX. Столкнулся с переносом/обновлением остатков - очень сложных механизм. Есть кто нибудь кто делал подобное? Может хоть посоветуюсь...

Автор: onsamuy 12.03.14, 12:10

Собственно, мне предоставили пример http запроса, каким он должен быть (это не 1С код, а просто текст);

POST /Goods/ HTTP/1.1\r\n
Connection: Keep-Alive\r\n
Content-Type: multipart/form-data; boundary=onesboundarydelimiter\r\n
Accept: */*\r\n
Authorization: Basic {password_hash}\r\n
User-Agent: 1C+Enterprise/8.2\r\n
Content-Length: {content_length}\r\n
Host: api.somedomain.com\r\n
\r\n
--onesboundarydelimiter\r\n
Content-Disposition: form-data; name="file"; filename="{filename_with_xml}"\r\n
Content-Type: application/octet-stream\r\n
Content-Transfer-Encoding: binary\r\n
\r\n
<?xml version="1.0" encoding="UTF-8"?>\r\n
<Goods>
<records>
  <record>
   <fields>
    <title>New goods</title>
    <details>
     <record>
      <record>
       <id>1853</id>
       <fields>
        <value>3600</value>
       </fields>
      </record>
     </record>
    </details>
    <attachments>
     <images>
   <record>
    <fields>
<href>{image url}</href>
</fields>
      </record>
     </images>
    </attachments>
                  <order>12</order>
   </fields>
  </record>
</records>
</Goods>

--onesboundarydelimiter--


после двухдневного рысканья по интернету решил делать так: все, что заключено в boundary (то есть текст шаблона между строками "--onesboundarydelimiter" и "--onesboundarydelimiter--") записываю в файл "C:\1c8\otpravka.xml". Далее делаю в 1С HTTPЗапрос, отправляю его через HTTPСоединение.ОтправитьНаОбработку (метод POST), вуаля. Вот мой текст модуля:
        //ЗАДАЕМ НЕОБХОДИМЫЕ ПЕРЕМЕННЫЕ...
    
    //а) Разделитель (Boundary) - может  быть любая уникальная строка, будем считать что это GUID константы, она неизменная
    Boundary = СтрЗаменить(Константы.ВалютаУправленческогоУчета.Получить().УникальныйИдентификатор(), "-", "");
    
    //б) Размер файла отправки
    ФайлОтправки = Новый Файл("C:\1c8\otpravka.xml");
    РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер());
    
    //1. УСТАНАВЛИВАЕМ СОЕДИНЕНИЕ С СЕРВЕРОМ...
    Сервер = "api.testm.mysite.ua";
    ИмяПользователя = "demo";
    Пароль = "mypassword";
    
    Соединение = Новый HTTPСоединение(Сервер,,ИмяПользователя,Пароль);
    
    //2. ФОРМИРУЕМ http-запрос СРЕДСТВАМИ 1С...
    
    //а) заголовки
    Заголовки = Новый Соответствие();
    Заголовки.Вставить("Content-Type", "multipart/form-data; boundary="+boundary);
    Заголовки.Вставить("Content-Lenght", РазмерФайлаОтправки);
    
    //б) сам запрос
    Запрос = Новый HTTPЗапрос("/Goods",Заголовки);
    Запрос.УстановитьИмяФайлаТела("C:\1c8\otpravka.xml");
    
    //3. ОТПРАВЛЯЕМ ЗАПРОС НА СЕРВЕР МЕТОДОМ POST СРЕДСТВАМИ 1С...
    Ответ = Соединение.ОтправитьДляОбработки(Запрос);
    
    ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();
    
    ЭлементыФормы.ПолеHTMLДокумента1.УстановитьТекст(ТекстОтвета);//выведем ответ от сервера в поле формы


Получаю текст ответа : Internal Server Error
Сервер временно недоступен по техническим причинам. Пожалуйста, зайдите позже.
Хотя через advanced REST Client - дополнение Google chrome запрос отправляется норм. Что Я Делаю Не Так?
Понимаю, что многабукав, но все таки, если разберемся, будет неплохой опыт читателям форума...

вот содержимое файла otpravka.xml:
--82a55a64fe9111de806e001d7da552f5
Content-Disposition: form-data; name="file"; filename="C:\otpravka.xml"
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary

<?xml version="1.0" encoding="UTF-8"?>
<Goods>
    <records>
        <record>
            <fields>
                <title>ACCESS, ACCESS TI2 Desktop hardware synthesizer, </title>
                <parent>
                    <id>165360</id>
                </parent>
                <price>31104</price>
                <producer>
                    <id/>
                </producer>
                <status>locked</status>
                <sell_status>unavailable</sell_status>
                <docket>ACCESS TI2 DESKTOP Синтезатор аналогового моделирования, настольно/рековый</docket>
                <tags/>
                <ext_id>204765</ext_id>
            </fields>
        </record>
    </records>
</Goods>
--82a55a64fe9111de806e001d7da552f5--


добавлю, через Advanced REST Client отправляю только файл с таким содержимым

<?xml version="1.0" encoding="UTF-8"?>
<Goods>
    <records>
        <record>
            <fields>
                <title>ACCESS, ACCESS TI2 Desktop hardware synthesizer, </title>
                <parent>
                    <id>165360</id>
                </parent>
                <price>31104</price>
                <producer>
                    <id/>
                </producer>
                <status>locked</status>
                <sell_status>unavailable</sell_status>
                <docket>ACCESS TI2 DESKTOP Синтезатор аналогового моделирования, настольно/рековый</docket>
                <tags/>
                <ext_id>204765</ext_id>
            </fields>
        </record>
    </records>
</Goods>

Автор: Vofka 12.03.14, 13:29

Узнайте у администратора сайта/сервера, почему Internal Server Error ?

Автор: onsamuy 20.03.14, 13:22

Вобщем, проблема была в кириллице.
Не так просто в моем случае оказалось скормить мой xml-файл который вмещает строки на кириллице (сформированный с помощью ЗаписьXML) объекту HTTPЗапрос.
Обошел проблему таким образом:
Сначала читаю файл в текстовыйДокумент, обязательно с виндовс кодировкой!

ФайлДляПередачи = Новый ТекстовыйДокумент;
ФайлДляПередачи.Прочитать(имяФайлаОтправки, КодировкаТекста.ANSI);

Затем устанавливаю полученный текст как тело HTTPЗапроса:
HTTPЗапрос.УстановитьТелоИзСтроки(ФайлДляПередачи.ПолучитьТекст());

И не забываем передать корректные заголовки, уточняем у разработчика сайта.

Автор: Maclaud 22.04.14, 11:36


 ! 

Правила, пункт 1
 

Автор: flint 18.06.14, 15:13

Доброго времени суток!

Так же, пишу обмен 1С с сайтом на базе OWOX

И столкнулся с проблемой корректной отправки HTTPзапросов.

Программисты сайта как-то не охотно идут на контакт.

Хочу спросить, на Ваш взгляд, где у меня ошибка:

Ответ сервера:

Цитата
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>500 Internal Server Error</title>
</head><body>
<h1>Internal Server Error</h1>
<p>Сервер временно недоступен по техническим причинам. Пожалуйста, зайдите позже.</p>
<hr>
{prod SERVER}
</body></html>



Boundary = СтрЗаменить(Константы.ВалютаРегламентированногоУчета.Получить().УникальныйИдентификатор(), "-", "");

    
    //б) Размер файла отправки
    РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер());
    
    
    //2. ФОРМИРУЕМ http-запрос СРЕДСТВАМИ 1С...
    
    //а) заголовки
    Заголовки = Новый Соответствие();
    Заголовки.Вставить("POST /GOODS/ HTTP/1.1");
    Заголовки.Вставить("Connection","Keep-Alive");
    Заголовки.Вставить("Content-Type","multipart/form-data; boundary="+Boundary);
    Заголовки.Вставить("Accept", "*/*");
    Заголовки.Вставить("Authorization",СокрЛП(НастройкаСсылка.ЗаголовкиAuthorization));
    Заголовки.Вставить("User-Agent", СокрЛП(НастройкаСсылка.ЗаголовкиUser));
              Заголовки.Вставить("Content-Length", РазмерФайлаОтправки);
    Заголовки.Вставить("Host",Соединение.Сервер);
          
    ИмяФайлаЗапросHTTP = ПолучитьИмяВременногоФайла();
    
    ЗапросHTTP = Новый ЗаписьТекста;
    ЗапросHTTP.Открыть(ИмяФайлаЗапросHTTP, КодировкаТекста.ANSI);
    ЗапросHTTP.ЗаписатьСтроку("--"+Boundary + Символы.ВК);
    ЗапросHTTP.ЗаписатьСтроку("Content-Disposition: form-data; name=""file""; filename=" + Символ(34) + ФайлОтправки.Имя + Символ(34) + Символы.ВК);
    ЗапросHTTP.ЗаписатьСтроку("Content-Type: application/octet-stream" + Символы.ВК);
    ЗапросHTTP.ЗаписатьСтроку("Content-Transfer-Encoding: binary" + Символы.ВК);
    ЗапросHTTP.ЗаписатьСтроку(Символы.ВК);
    
    ФайлДляПередачи = Новый ТекстовыйДокумент;
    ФайлДляПередачи.Прочитать(ФайлОтправки.ПолноеИмя, КодировкаТекста.ANSI);
    
    ТекстСтрока = ФайлДляПередачи.ПолучитьТекст();
    СимволыНачало = Найти(ТекстСтрока, "<?xml version=""1.0"" encoding=""UTF-8""?>");
    СимволыНачало = Прав(ТекстСтрока, СтрДлина(ТекстСтрока) - СимволыНачало + 1);
    
    ЗапросHTTP.ЗаписатьСтроку(СимволыНачало);     
    
    ЗапросHTTP.ЗаписатьСтроку(Символы.ВК);
    ЗапросHTTP.ЗаписатьСтроку("--"+Boundary+"--");
    ЗапросHTTP.Закрыть();
    
    ОтветСервера = Неопределено;
    ИмяФайлаОтвета = ПолучитьИмяВременногоФайла();
    
    //б) сам запрос
    Запрос = Новый HTTPЗапрос("/Goods",Заголовки);
    Запрос.УстановитьИмяФайлаТела(ИмяФайлаЗапросHTTP);    

    Попытка
        Соединение.ОтправитьДляОбработки(Запрос, ИмяФайлаОтвета);
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;


//***************************

Цитата
Тело запроса - файл ИмяФайлаЗапросHTTP:
--8b44649d892311dbaf51c8c4e85d49d2
Content-Disposition: form-data; name="file"; filename="PostGoods.xml"
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary

<?xml version="1.0" encoding="UTF-8"?>
<Goods>
<records>
<record>
<fields>
<title>Stanley</title>
<code>STT1-714</code>
<docket>Stanley test</docket>
<prices>
<record>
<id>3</id>
<title>Opt</title>
<value>2420</value>
</record>
<record>
<id>2</id>
<title>Roznica</title>
<value>2860</value>
</record>
</prices>
<tags>test</tags>
<status>new</status>
</fields>
</record>
</records>
</Goods>

--8b44649d892311dbaf51c8c4e85d49d2



 ! 

Выделяйте код
 

Автор: Acid 19.06.14, 10:33

Цитата(flint @ 18.06.14, 16:13) *

не пойму зачем вам такой велосипед?

Если вы пишете обмен, то это работа с БД. В этом случае вам вообще не нужно смотреть в сторону HTTPзапросов

Автор: Vofka 19.06.14, 10:53

Цитата(Acid @ 19.06.14, 11:33) *
Если вы пишете обмен, то это работа с БД. В этом случае вам вообще не нужно смотреть в сторону HTTPзапросов

Та ну smile.gif

Автор: flint 19.06.14, 11:01

Цитата(Acid @ 19.06.14, 11:33) *
не пойму зачем вам такой велосипед?

Если вы пишете обмен, то это работа с БД. В этом случае вам вообще не нужно смотреть в сторону HTTPзапросов



Обмен интернет-ресурс с 1С

как бы заказчик предоставил инструкцию по работе с OWOX, обработав инструкцию и выводы onsamuy

реализовал "это дело" в 1С, но

в 1С - 500 Internal Server Error
а на RestClient - все классно - на базе моего тела запроса создал товар

(

Автор: Acid 19.06.14, 12:22

Я бы использовал ADO хотяб
http://pro1c.org.ua/index.php?showtopic=2111

Автор: flint 23.06.14, 9:31

Всем спасибо, разобрался анализируя тело HTTP запроса с помощью Wireshark

Автор: Vofka 23.06.14, 11:16

flint, так и что там было?

Автор: Acid 23.06.14, 11:51

Это была реклама Wireshark smile.gif

Автор: flint 26.06.14, 8:58

Цитата(Vofka @ 23.06.14, 12:16) *
flint, так и что там было?


Для метода post при 500 ошибки: заголовки в xml. корректные разделитили(возврат корретки), кодировка файла

при ошибках в xml - в файле ответа уже более подробное описание

Для метода put: заголовки в xml - не нужны. корректные разделитили(возврат корретки), кодировка файла

Автор: n00bie 04.07.14, 9:42

500 ошибка это любая внутренняя ошибка сервера.

Судя по выложенному коду оно просто не должно работать.

Соединение = Новый HTTPСоединение("http://adres servera");
Соединение.ОтправитьДляОбработки("Путь к XML файлу", "/Goods/", "Путь к файлу ответа");

Автор: flint 11.07.14, 9:11

Цитата(n00bie @ 04.07.14, 10:42) *
500 ошибка это любая внутренняя ошибка сервера.

Судя по выложенному коду оно просто не должно работать.

Соединение = Новый HTTPСоединение("http://adres servera");
Соединение.ОтправитьДляОбработки("Путь к XML файлу", "/Goods/", "Путь к файлу ответа");


Альтернативный вариант синтаксиса появился в последних версиях платформы

Автор: n00bie 11.07.14, 9:35

Цитата(flint @ 11.07.14, 10:11) *
Альтернативный вариант синтаксиса появился в последних версиях платформы

Взял из конфигурации которую разрабатывал больше двух лет назад.

Автор: 1сНеЛюбитМеня 15.09.15, 11:41

Доброго времени суток!

Где можно посмотреть документацию по owox. Есть доступы к документации, там текст
"Взаимодействие с внешними системами (API)

API - то функционал работы с данными модуля через обращение по URL. Нужно для того, чтобы клиент мог интегрировать интернет—магазин в его бизнес. Самый просто пример — актуализировать статус заказа после его обработки в 1С.

OwoxEngine дает возможность взаимодействовать с сиcтемой по двум стандартам XML-RPC и REST.
"
и т.п.
Вот а какие реквизиты брать, к чему обращаться непонятно. По каким мануалам пишите господа, по какому принципу.

Спасибо)

Автор: Acid 15.09.15, 13:47

чей то я не вижу у них открытого API.
в связи с этим, нужно OWOX нанять на обслуживание вам. Либо использовать что-то из открытых исходников.

Автор: Sillanium 20.01.18, 1:39

flint, Добрый
Как вы решили задачу?
Мне необходимо обновить цену
Какую структуру должен содержать XML-файл?

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua