Имя: Пароль:
1C
1С v8
oData, REST и создание документа, заполнение табличной части в 1С.
,
0 ximik33rus
 
15.11.18
08:59
Доброго времени суток.
Видал на форуме статью на похожую тему (Odata заполнение табличной части), однако нужного ответа в ней не нашел.

Потому создаю новую.

Рассказываю по порядку.
Изучаю технологию Open Data Protocol на примере 1С Предприятия.
В общем то ничего сложного, через HTTP-REST клиент, авторизацию и запросы с JSON в теле удалось получать и создавать справочники, парсить документы..

Однако неожиданно сложным оказалось понять, как заполнять табличную часть документов при создании из в 1С через POST - запрос.
Все мои попытки приводили к созданию документа с пустой табличной частью.

Имею в распоряжении платформу 1С:Предприятие 8.3 (8.3.10.2667).

В POST запросе передаю JSON со значениями реквизитов документа и массивом ТЧ Товары. (Структуру JSON беру из результата запроса GET для того же типа документа).

Ниже сокращенный пример тела запроса:

{"value": [{
  "Организация_Key": "59d36f49-3ee9-11e8-a725-000c290bd191",
  "Контрагент_Key": "befd037b-3eec-11e8-a725-000c290bd191",
  "Товары": [
    {
      "Ref_Key": "83a6f31f-e809-11e8-8cd3-50465d037106",
      "Количество": 1,
      "Цена": 100,
      "Сумма": 100,
      "ПроцентСкидки": 0,
      "СуммаСкидки": 0,
      "СтавкаНДС": "БезНДС",
      "СуммаНДС": 0
    },
    {
      "Ref_Key": "83a6f320-e809-11e8-8cd3-50465d037106",
      "Количество": 1,
      "Цена": 200,
      "Сумма": 200,
      "ПроцентСкидки": 0,
      "СуммаСкидки": 0,
      "СтавкаНДС": "БезНДС",
      "СуммаНДС": 0
    }
  ],
  "Posted": false,
  "СуммаДокумента": 300
}]
}

JSON валидный.

запрос производится по:
http://192.168.0.15/test1_baseAll/odata/standard.odata/Document_СчетНаОплатуПокупателю?$format=json

Номенклатура ТЧ на тот момент уже создана в базе и имеет указанные в теле Ref_Key.

В результате я получаю нужный документ с пустой ТЧ.


Пробовал также после создания документа осуществить к нему повторный запрос PATCH, с фильтром по GUID и также в теле передавать JSON с массивом табличной части. В ответ получаю запрет сервера на подобную операцию.

Вероятно я что то делаю не так.
Также, предполагаю что в данной версии платформы этот функционал может не работать, но это не точно)
Что бы сделать правильные выводы, необходимо выяснить, правильно ли осуществляется запрос?
1 Garykom
 
гуру
15.11.18
09:51
LineNumber забыл
2 ximik33rus
 
15.11.18
09:52
(1) В сокращенном варианте номера строки нет, да. С LineNumber  также попытки создания делал.
3 Garykom
 
гуру
15.11.18
09:55
Никакие обработчики в конфе не мешают в коде?
4 Garykom
 
гуру
15.11.18
09:56
В смысле в своей конфе (не типовой) попробуй тоже самое где создай документ с 0
5 ximik33rus
 
15.11.18
10:01
(4) Источники запроса - клиент на С# или Poster(в качестве тест-клиента). Тут никаких обработчиков нет))

Приемник - типовая 1С Бухгалтерия предприятия, редакция 3.0 (3.0.60.34).
6 НЕА123
 
15.11.18
10:28
7 ximik33rus
 
15.11.18
10:31
(6) Был там. Не мой случай.
При попытки запроса типа PATCH (как указано в сабже) ответ системы следующий:

{
    "odata.error": {
        "code": "19",
        "message": {
            "lang": "ru",
            "value": "Использованный HTTP метод запрещен в данном контексте"
        }
    }
}
8 ximik33rus
 
15.11.18
10:36
Логично было бы создавать документ сразу с номенклатурой, методом POST - запроса. Ведь связей, судя по метаданным у таблицы Document_СчетНаОплатуПокупателю_Товары с самим документом нет, а это значит предварительное создание ссылки на объект не требуется.

Хотя не исключаю вариант повторного запроса типа PATCH.
Но и такой вариант как видно в (7) результата не дает.
9 exwill
 
15.11.18
10:37
(0) Попробуй проделать такое не на типовой базе.
10 ximik33rus
 
15.11.18
10:46
(9) На не типовой, в смысле перепиленной БП, ЗУП и т.п?
Или что то вроде 1С CRM, управление IT-отделом?

В чем принципиальная разница? В Снятии с поддержки или другой набор метаданных и обработчиков.
11 Garykom
 
гуру
15.11.18
10:49
(5) Нет в типовой БП обработчики "при записи документа".
Попробуй создать свою пустую конфу и добавив документ через конфигуратор с парой полей, опубликовать и записать так же.
12 ximik33rus
 
15.11.18
10:51
(11) Понял. Сделаю.
13 exwill
 
15.11.18
10:55
(10) Проведи чистый эксперимент. Создай свою базу с одним документом и попробуй его заполнить.
14 ximik33rus
 
15.11.18
11:03
(13) Создал, а вот метаданные не открыть. Обработка выгруженная из БП (НастройкаСтандартногоИнтерфейсаOData) не запускается на новой конфе, оно в принципе и понятно, конфа пустая (за исключением документа и пары справочников). Обработка сыпет ошибками на отсутствиеискомых элементов.
15 ximik33rus
 
15.11.18
11:06
ДлительныеОперации отсутствуют. Это нужно тогда На основе БСП концу делать.
16 Filin
 
15.11.18
11:08
(14) Попробуй чем попроще - https://yadi.sk/d/2uY9_4m89qnQLQ
17 ximik33rus
 
15.11.18
11:15
(16) Действительно, ничего лишнего)
Только увидела обработка справочники. Документ не открыла.

Вот, подправил немного, может кому пригодится. Документы тоже добавляет теперь))
https://yadi.sk/d/pTwpbhcjKWVGaw
18 ximik33rus
 
15.11.18
11:49
В общем попробовал на кастомной конфигурации.

Тело:
{"value": [{
  "СтроковыйРеквизит": "Имя2",
  "Date": "2018-11-15T10:58:09",
  "Ref_Key": "866be0bb-011a-4627-af20-b068b2810c86",
  "Товары": [
    {
  "Ref_Key": "866be0bb-011a-4627-af20-b068b2810c86",
        "Товар_Key": "2bbbc659-e8ac-11e8-8cd3-50465d037106",
        "LineNumber": "1",
        "Количество": "1",
        "Цена": 100
    },
    {
  "Ref_Key": "866be0bb-011a-4627-af20-b068b2810c86",
        "Товар_Key": "214a9d06-e8ac-11e8-8cd3-50465d037106",
        "LineNumber": "2",
        "Количество": "1",
        "Цена": 1000  
    }
  ],
  "Posted": false,
  "СуммаДокумента": 100
}]
}

POST - запрос:
http://192.168.0.15/test2_baseAll/odata/standard.odata/Document_ТестовыйДокумент?$format=json

Ответ:

{
    "odata.metadata": "http://192.168.0.15/test2_baseAll/odata/standard.odata/$metadata#Document_ТестовыйДокумент/@Element";,
    "Posted": false,
    "СсылочныйРеквизит_Key": "00000000-0000-0000-0000-000000000000",
    "Date": "2018-11-15T11:40:54",
    "Товыры": [],
    "СтроковыйРеквизит": "",
    "Ref_Key": "295d59e2-e8b2-11e8-8cd3-50465d037106",
    "DeletionMark": false,
    "Number": "000000007",
    "DataVersion": "AAAAAAABjno="
}

Товыры также пусты.


В ПБ еще обратил внимание на СчетНаОплатуПокупателю_Товары
в теле ответа имеется Ref_Key и Номенклатура_Key (думал что Ref_Key - это гуид номенклатуры - смутило что там разные были.

В кастмной конфигурации посмотрел тот же ответ и по гуиду стало видно что Ref_Key (в _Товары) = Ref_Key документа. А Номенклатура_Key - собственно гуид номенклатуры. (Странно что в БП Ref_Key (в _Товары) <> Ref_Key документа, ну да ладно).

К чему я, попробовал PUT и PATCH - методы применить к Document_ТестовыйДокумент_Товары с привязкой Ref_Rey. Получил в ответ ошибку
"Cоздание строк табличной части напрямую не поддерживается".

Ну прям вилы)) Интересно как ЭТО не на прямую? (на кривую). Как поддерживается :)
19 ximik33rus
 
15.11.18
16:07
Мб, в тело лучше давать XML - atom, как формат данных, а не JSON?
20 ximik33rus
 
03.12.18
10:00
В общем, опытным путем выяснил, что Ref_Key самого счета и Ref_Key сроки таблицы товаров с счете нужно исключить из POST - запроса. 1С-ка сама в таком случае назначит эти идентификаторы и свяжет их между собой.

Пример:

{
            "DataVersion": "AAAAAAACiz0=",
            "Posted": false,
            "Организация_Key": "59d36f49-3ee9-11e8-a725-000c290bd191",
            "Склад_Key": "00000000-0000-0000-0000-000000000000",
            "ПодразделениеОрганизации_Key": "00000000-0000-0000-0000-000000000000",
            "Контрагент_Key": "befd037b-3eec-11e8-a725-000c290bd191",
            "ДоговорКонтрагента_Key": "00000000-0000-0000-0000-000000000000",
            "АдресДоставки": "",
            "ОрганизацияПолучатель_Key": "59d36f49-3ee9-11e8-a725-000c290bd191",
            "СтруктурнаяЕдиница_Key": "4e3b4440-3ef3-11e8-a725-000c290bd191",
            "Ответственный_Key": "eac1da20-3ee8-11e8-a725-000c290bd191",
            "Комментарий": "",
            "ВалютаДокумента_Key": "4cf66526-3ee7-11e8-a725-000c290bd191",
            "КратностьВзаиморасчетов": "1",
            "СуммаСкидки": 0,
            "КурсВзаиморасчетов": 1,
            "СуммаВключаетНДС": true,
            "СуммаДокумента": 0,
            "ТипЦен_Key": "00000000-0000-0000-0000-000000000000",
            "УдалитьУчитыватьНДС": true,
            "УдалитьСтатусОплаты": "",
            "Руководитель_Key": "59d36f56-3ee9-11e8-a725-000c290bd191",
            "ГлавныйБухгалтер_Key": "59d36f56-3ee9-11e8-a725-000c290bd191",
            "УдалитьЗаРуководителяПоПриказу": "",
            "УдалитьЗаГлавногоБухгалтераПоПриказу": "",
            "ДокументБезНДС": true,
            "ДополнительныеУсловия_Key": "5fc846c3-3ee7-11e8-a725-000c290bd191",
            "ЗаГлавногоБухгалтераНаОсновании_Key": "00000000-0000-0000-0000-000000000000",
            "ЗаРуководителяНаОсновании_Key": "00000000-0000-0000-0000-000000000000",
            "Товары": [              
                {
                    "LineNumber": "1",
                    "Номенклатура_Key": "6a8c095a-6005-11e8-a2ed-000c290bd191",
                    "Содержание": "Лицензионное вознаграждение за право использования ИС, передаваемое по лицензионному договору от 18.04.2018 г. за 1 декаду июля 2018 г.",
                    "Количество": 1,
                    "Цена": 6724761.32,
                    "Сумма": 6724761.32,
                    "ПроцентСкидки": 0,
                    "СуммаСкидки": 0,
                    "СтавкаНДС": "БезНДС",
                    "СуммаНДС": 0
                }],
        },
Независимо от того, куда вы едете — это в гору и против ветра!