Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
21 мая 2025, 04:18

PHP + OData + 1С

Автор Gestalta, 02 окт 2024, 12:56

0 Пользователей и 1 гость просматривают эту тему.

Gestalta

Добрый день!

Решил с OData опробовать работу.

Написал php-скрипт для получения данных из 1С - работает.
Пробую данные в 1С изменить через php-скрипт, PATCH - не работает!

Скрипт:
<?php
$post_data
=array("Описание"=>"123");
$data_json=json_encode($post_data,JSON_UNESCAPED_UNICODE);

$Opts=array(
'header'=>"Content-type: application/json\r\n".
"Connection: keep-alive\r\n".
"Authorization: Basic ".base64_encode("User:Pass")."\r\n".
"Content-Length: ".strlen($data_json)."\r\n"
);
$URL="http://localhost:8080/base/odata/standard.odata/Catalog_Отметки(guid'16abc8f8-99dd-11ea-2a83-00155d000d00')";
$Filter['$format']="json";
$URL=$URL."?".http_build_query($Filter,"","&",PHP_QUERY_RFC3986);

$curl=curl_init($URL);
curl_setopt($curl,CURLOPT_HTTPHEADER,$Opts);
curl_setopt($curl,CURLOPT_CUSTOMREQUEST,'PATCH');
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl,CURLOPT_POSTFIELDS,$data_json);
curl_setopt($curl,CURLOPT_HEADER,true);
$out=curl_exec($curl);
curl_close($curl);

print_r($out);
?>


Возвращает:

HTTP/1.1 500 Internal server error
Date: Wed, 02 Oct 2024 09:31:11 GMT
Server: Apache/2.4.52 (Win64)
DataServiceVersion: 3.0
Content-Length: 151
Connection: close
Content-Type: application/json;charset=utf-8

{
"odata.error": {
"code": "-1",
"message": {
"lang": "ru",
"value": "Непредвиденный символ при чтении JSON"
}
}
}

И что это за непредвиденный символ? Что хочет 1С? Это из-за кодировки? Как-то можно из него выжать больше информации?

В Postman-e всё работает с этими данными!

Заранее спасибо!

Gestalta

Проблема решилась в момент отчаяния.
Оказывается не хватало в заголовке "user-agent: rnd_name"
 <_<

oooeeee

"Написал php-скрипт для получения данных из 1С - работает."

Не поделитесь скриптом?

Gestalta

oooeeee, примерно так:

<?php
    $Errors
=array();

    function 
GetCatalog($CatalogName,$Ref_Key,$ReturnFieldName="Description"){
        
//$CatalogName - Имя каталога
        //$Ref_Key - GUID элемента каталога
        //$ReturnFieldName - Какое поле вернуть

        
global $Errors;

        
$ret="";

        
$URL="адрес_сервера";

        if(
$Ref_Key!="00000000-0000-0000-0000-000000000000"){
            
$Document=$CatalogName."(Ref_Key=guid'".$Ref_Key."')";
            
$URL=$URL.$Document;
            
$JSON=CURL_GET($URL,array());

            if(
count($Errors)==0){
                if(isset(
$JSON[$ReturnFieldName])) $ret=$JSON[$ReturnFieldName];
            }
        }

        return 
$ret;
    }
    function 
CURL_GET($URL,$Filter=array(),$UseJSON=true){
        
//$Filter - дополнительный фильтр, например:
        //    $Filter['$filter']="year(НачальныйГод) ge ".$YearStart;
        //    $Filter['$orderby']="Description";
        //$UseJSON - использовать JSON или XML

        
global $Errors;

        
$ret=array();

        
$Opts=array(
            
"Content-type: application/json; charset=UTF-8;",
            
"Connection: keep-alive",
            
"Authorization: Basic ".base64_encode("Логин:Пароль"),
            
"User-Agent: mydick"
        
);
        if(
$UseJSON$Filter['$format']="json";
        
$URL.="?".http_build_query($Filter,"","&",PHP_QUERY_RFC3986);
        
$curl=curl_init($URL);
        
curl_setopt($curl,CURLOPT_HTTPHEADER,$Opts);
        
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
        
$out=curl_exec($curl);

        if(!
curl_errno($curl)){
            
$http_code=curl_getinfo($curl,CURLINFO_HTTP_CODE);
            if(
$http_code==200){
                
//Нет ошибки
                
$ret=json_decode($out,true);
            }else{
                
//Ошибка
                
$Errors[]=array("code"=>$http_code,"out"=>$out);
            }
        }
        
curl_close($curl);

        return 
$ret;
    }
?>


По-быстрому собрал код из рабочего класса, так что могут быть небольшие косячки)

Теги: PHP odata  

Похожие темы (1)

Рейтинг@Mail.ru

Поиск