Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

forbidden 403 при POST-запросе к REST API 1c 8.3

forbidden 403 при POST-запросе к REST API 1c 8.3
Я
   mistermadness
 
02.02.20 - 09:13
Добрый день! Имею 1с 8.3 БП в облаке сервис 1cfresh. Обращаюсь к REST API через PHP Guzzle-клиент след образом

class OneCData {
    private $client;
    private $server;
    private $login;
    private $pass;
    public function __construct() {
        $this->client = new \GuzzleHttp\Client(['auth' => ['хххххх', 'ххххх']]);
        $this->server = 'https://1cfresh.com/a/ea/1020368/odata/standard.odata';
    }
    /**
    @param string $method1C Метод в 1С, например "Document_ПоступлениеТоваровУслуг"
    @param array  $data     Массив данных который надо отправить в 1C
    @param string $method   HTTP метод
    @param null   $guid     ID сущности в 1C
    @param array  $params   Фильтры
    @throws RequestException
    @return array
    */
    public function sendData($method1C, $data, $method = 'GET', $guid = null, array $params = []){
        $client = $this->client;
        
        if (!empty($guid)) {
            $guid = "guid'$guid'";
        }

        $url = $this->getUrl($method1C."($guid)", $params);
        echo $url.'<br />';
        try {
            $res = $client->request($method, $url, [
                'json' => $data
            ]);
            $content = $res->getBody()->getContents();
            return json_decode($content, true);
        } catch (\GuzzleHttp\Exception\ClientException $e) {
            //throw new \GuzzleHttp\Exception\ClientException($e->getResponse()->getBody()->getContents());
            echo $e->getResponse()->getBody()->getContents();
        } catch (\GuzzleHttp\Exception\RequestExceptionGuzzle $e) {
            //throw new \GuzzleHttp\Exception\RequestException($e->getResponse()->getBody()->getContents());
            echo $e->getResponse()->getBody()->getContents();
        }
    }

    /**
    @param string $method
    @param array  $params
    @return string
    */
    public function getUrl($method, array $params = []){
        $url = $this->server.'/'.$method.'?$format=json;odata=nometadata';
        foreach ($params as $name => $value) {
            $url .= '&'.$name.'='.$value;
        }
        return $url;
    }
}

$req = array(
    'DataVersion' => 'AAAAAAAAAAA=',
    'Posted' => false,
    'Number' => 'РН-100',
    'Date' => date('Y-m-d', time()).'T'.date('H:i:s', time()),
    'СпособЗачетаАвансов' => 'Автоматически',
    'ВидОперации' => 'Товары',
    'Организация_Key' => '3742dc60-41b2-11ea-d689-fa163e51b5f9',
    'Контрагент_Key' => '478e193c-4332-11ea-c09e-fa163e51b5f9',
    'Склад_Key' => '37d7fcf8-f79f-11e9-829c-0242c0a8c005',
    'ВалютаДокумента_Key' => 'ee8de508-f79e-11e9-a889-0242c0a8c005',
    'Товары' => array(
        'LineNumber' => 1,
        'Ref_Key' => '48ddeef2-4297-11ea-c09e-fa163e51b5f9',
        'Количество' => 2,
        'Цена' => 600,
        'Сумма' => 1200,
        'ПроцентСкидки' => 0,
        'СуммаСкидки' => 0,
        'СтавкаНДС' => 'БезНДС',
        'СуммаНДС' => 0,
    ),
    'СуммаДокумента' => 1200
);

$method1C = 'Document_РеализацияТоваровУслуг';
$method = 'POST';
$res = $oneCData->sendData($method1C, $req, $method);

Данный код был найден на данном форуме. Вот только проблема в том, что когда я отправляю GET-запрос, я вижу информацию, но когда я делаю POST-запрос (в данном случае я пытаюсь создать документ реализацию), то получаю ответ 403 Forbidden. Подскажите, пожалуйста, что я могу делать не так? Заранее, спасибо.
 
 
   ДенисЧ
 
1 - 02.02.20 - 09:16
Правов нет?
   mistermadness
 
2 - 02.02.20 - 09:37
О каких именно правах идет речь? Я прошел Администрирование -> Синхронизация данных -> Настройки стандартного интерфейса oData. Вкладку авторизация я не трогал, а вот во вкладке Состав нажал Загрузить метаданные и отметил галочки везде. Еще какие-то права надо предоставить?
   mistermadness
 
3 - 02.02.20 - 09:57
Так же в настройках пользователей и поставил галочку Синхронизация данных с другими программами.
   craxx
 
4 - 02.02.20 - 11:01
(0) авторизацию на той стороне не проходишь. Видимо надо как-то передавать логин-пароль в 1С
   mistermadness
 
5 - 02.02.20 - 11:31
А как передавать? Нигде ничего не написано...
   acht
 
6 - 02.02.20 - 11:56
(5) > Нигде ничего не написано...

А откуда вообще идея о том, что на 1совский фреш можно вот так информацию заливать? Насколько помню там вообще отдельный АПИ для интеграции. Ну и традиционный вопрос - а что по этому поводу говорит поддержка фреша?

Если у вас собственный инстанс технологии сервиса, то все вопросы к вашим апачам. Хотя
  $this->server = 'https://1cfresh.com/a/ea/1020368/odata/standard.odata';
говорит об обратном.
   mistermadness
 
7 - 02.02.20 - 12:19
Написано у них прямо в разделе администрирование, что есть и поддерживается.
   acht
 
8 - 02.02.20 - 20:52
(7) Тогда проверяй права. Права пользователя 1С, под которым одата дергается, на создание в базе документа реализации.
   mistermadness
 
9 - 03.02.20 - 11:10
Заметил интересную вещь. Если в URL вместо https сделать http, то уже не получаю 403 forbidden, но и документ не создается.
   Cyberhawk
 
10 - 03.02.20 - 11:13
Вся одата где-то с 8.3.5+ по умолчанию закрыта
   Cyberhawk
 
11 - 03.02.20 - 11:13
(7) Покажи на картинке, где и что написано
   mistermadness
 
12 - 03.02.20 - 11:59
Итак, захожу в облаке в 1с БП. Далее прохожу в Администрирование, далее Синхронизация данных, Далее Настройка стандартного интерфейса OData. Далее во вкладке состав нажимаю загрузить метаданные и отмечаю галочками необходимые документы. Вот картинка, где уже расписано, что все это есть и ниже там еще ссылочка Информация для разработчиков. Где это все заявлено. Ссылка на картинку https://dev.doktormobil.ru/screen.png. Далее я нажимаю сохранить. GET-запрос могу прочитать данные, а вот POST-зпрос, если с https, то 403 forbidden, если с http, то просто мне все документы возвращает, но ничего не создается.
   Cyberhawk
 
13 - 03.02.20 - 12:05
А, ну все, нормик, значит есть одата во Фреше.
Какие проблемы? Разделитель пади не указываешь.
   mistermadness
 
14 - 03.02.20 - 12:08
Это что за разделитель?
   Cyberhawk
 
15 - 03.02.20 - 20:34
(14) Ну ты же во Фреше. Там у каждого своя "область данных", ее в одате всяко надо указывать.
   mistermadness
 
16 - 06.02.20 - 09:54
Короче, ответила мне тех поддержка. Оказывается эти олухи не могут это сделать или не хотят. Так что это просто тупо не работает. Причем так интересно сделали, ответили и закрыли обращение, типа они мне помогли. Чем больше изучаю это детище (1С:Предприятие), тем больше удивляюсь, откуда успех у всего этого. Программа реально тормозит. Бедные люди работают с 1С и просто тратят свое и время организаций. Плюс косяки, недоработки, которые годами висят. Понимаю теперь откуда как грибы стали расти всякие альтернативные облачные решения.
   Cyberhawk
 
17 - 06.02.20 - 11:46
Что ответили-то, покажи на картинке
   ДенисЧ
 
18 - 06.02.20 - 11:48
(16) 1с вообще какашка. Не подходи к ней близко
   mistermadness
 
19 - 06.02.20 - 14:31
Ответили вот что https://demo.crmsklad.ru/screen2.png. (18) Людям нужно время, чтобы жить, а не пялиться на желтого кота.
   ДенисЧ
 
20 - 06.02.20 - 14:44
(19) Так живите, а не пяльтесь. Что вас, заставляют? Пишите на пыхе и не трогайте какашку...
   Cyberhawk
 
21 - 06.02.20 - 14:46
Ясно. Значит одаты во Фреше все-таки нет.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.