Имя: Пароль:
1C
1С v8
Odata заполнение табличной части
0 rubetek
 
10.02.17
17:50
1С 8.3 редакция 3.0
Делаю интеграцию сайта с 1С через Odata в формате json.
Контрагентов создал успешно.
При создании акта возникла проблема: акт создал, далее пытаюсь заполнить табличную часть. Отправляю запрос на добавление одной строки, а мне в ответ:

{
"odata.error": {
"code": "13",
"message": {
"lang": "ru",
"value": "Cоздание строк табличной части напрямую не поддерживается"
}
}
}

Через odata в json нельзя добавить строки?
1 PR
 
10.02.17
18:12
(0) Какое из написанных слов тебе непонятно?
2 rubetek
 
13.02.17
09:09
Непонятно как тогда добавить строки
3 Cyberhawk
 
13.02.17
09:27
Покажи формирование запроса
4 rubetek
 
13.02.17
09:47
Создаю акт
/odata/standard.odata/Document_ПоступлениеТоваровУслуг()?$format=application/jsonArray
(
    [Организация_Key] => 69f89d71-e7c1-11e6-a39c-50e549a0019a
    [Контрагент_Key] => cc2f1829-e7c3-11e6-a39c-50e549a0019a
)

Создаю строку
/odata/standard.odata/Document_ПоступлениеТоваровУслуг_Услуги()?$format=application/jsonArray
(
    [Количество] => 4000
    [Цена] => 3.4
    [СтавкаНДС] => НДС18
    [Ref_Key] => ea192958-f1b7-11e6-8da2-50e549a0019a
)

Видимо так нельзя потому что 1с-у надо что то пересчитать при добавлении строк... ((
5 Cyberhawk
 
13.02.17
10:08
Используй ПАТЧ-запрос, передавая всю ТЧ целиком
6 rubetek
 
13.02.17
13:10
1. Делаю POST запрос на создание акта.
2. Методом PATCH по guid редактирую его с такими данными

/odata/standard.odata/Document_ПоступлениеТоваровУслуг(guid'01d22eff-f1d2-11e6-8da2-50e549a0019a')?$format=application/json

Array
(
    [Услуги] => Array
        (
            [0] => Array
                (
                    [Количество] => 4000
                    [Цена] => 3.4
                    [СтавкаНДС] => НДС18
                )

            [1] => Array
                (
                    [Количество] => 4000
                    [Цена] => 3.4
                    [СтавкаНДС] => НДС18
                )

        )

    [Ref_Key] => 01d22eff-f1d2-11e6-8da2-50e549a0019a
)

Получаю ошибку: resulted in a `500 Internal server error` response

Я правильно обновляю акт?
7 rubetek
 
13.02.17
14:10
Сервер отвечает

{
"odata.error": {
"code": "-1",
"message": {
"lang": "ru",
"value": "Произошла внутренняя ошибка OData сервиса. Дополнительные сведения можно найти в технологическом журнале."
}
}
}

К сожалению, нет возможности этот журнал посмотреть, мне кажется, что я неправильно json запрос формирую.
8 rubetek
 
13.02.17
14:35
Есть где нибудь документация? какие поля обязательные, какие нет, думаю что дело в полях
9 Cyberhawk
 
13.02.17
14:37
(7) "кажется, что я неправильно json запрос формирую"
(8) "Есть где нибудь документация?"
ИТС тебе в помощь: https://its.1c.ru/db/v839doc#bookmark:dev:TI000001374
10 rubetek
 
13.02.17
16:13
Cyberhawk, спасибо за ссылку, доступа нет у меня туда, распечатали всю 17 главу мне ).

А проблема была вот в чем. В каждой услуге надо было поставить поле LineNumber. Как его поставил, 500 ошибка пропала.

Потом появилась следующая ошибка: данные шапки менялись, а услуги не добавлялись. Проблема решилась так: Добавил поле в шапку ВидОперации = "Услуги".

Спасибо )
11 Cyberhawk
 
13.02.17
16:28
(10) "доступа нет у меня туда" // Там есть демо-доступ
12 rubetek
 
13.02.17
16:31
Кстати, если правильно сформировать json сразу, то POST-ом все прекрасно записывается =)
13 Cyberhawk
 
13.02.17
16:54
(12) Код-то выкладывай потомкам не память
14 Cyberhawk
 
13.02.17
16:54
*на память
15 rubetek
 
13.02.17
17:17
Код на php, написан свой клиент небольшой, ну все элементарно: генерация url, да отправка на него json-а.
В качестве http клиента используется Guzzle.

Основные методы:

/**
* @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 = new Client();

    if (!empty($guid)) {
        $guid = "guid'$guid'";
    }

    $url = $this->getUrl($method1C."($guid)", $params);

    try {
        $res = $client->request($method, $url, [
            'json' => $data,
        ]);
    } catch (ClientException $ex) {
        throw new RequestException($ex->getResponse()->getBody()->getContents());
    } catch (RequestExceptionGuzzle $ex) {
        throw new RequestException($ex->getResponse()->getBody()->getContents());
    }

    $content = $res->getBody()->getContents();

    return json_decode($content, true);
}

/**
* @param string $method
* @param array  $params
* @return string
*/
private function getUrl($method, array $params = [])
{
    $url = $this->server.'/'.$method.'?$format=application/json';

    foreach ($params as $name => $value) {
        $url .= '&'.$name.'='.$value;
    }

    return $url;
}

Минимальные данные для создания акта с услугами в табличной части
/odata/standard.odata/Document_ПоступлениеТоваровУслуг()?$format=application/json

Array
[
    [Услуги] => Array
        [
            [0] => Array
                [
                    [LineNumber] => 1
                ]

            [1] => Array
                [
                    [LineNumber] => 2
                ]

        ]

    [ВидОперации] => Услуги
]
2 + 2 = 3.9999999999999999999999999999999...