Имя: Пароль:
IT
Веб-мастеринг
Odata GET запрос . Не получается получить товар с несколькими штриxкодами
0 VismuT
 
03.07.24
15:33
Здравствуйте !
Не получается получить товар с несколькими штрихкодам . Строка по которой я ищу(barcode) , имеет вид : barcode1|barcode2|barcode3|......
Если в товаре 1 штрихкод , то все выходит .
Использовал такой GET запрос ..../Products?$filter=%20packings%2F%20any%20(s%3As%2Fbarcode%20eq%20'4680022430939')
Получаю ответ
{
  "@odata.context": "http://http://localhost/:9400/MobileSMARTS/api/v1/$metadata#Products",
  "value": [
    {
      "id": "9081734e-e222-11e7-82b6-cda4d3be6e7f",
      "name": "Ср-во для стекол\"Выгодная уборка\"500 мл, без распылителя",
      "barcode": "00000025011",
      "basePackingId": "шт",
      "marking": "",
      "packings": [
        {
          "name": "шт",
          "selfWeight": 0,
          "selfVolume": 0,
          "unitsQuantity": 1,
          "barcode": "4680022430939",
          "barcodes": [
            "4680022430939"
          ],
          "id": "шт",
          "marking": "",
          "price": 330,
          "qty": 8
        }
      ]
    }
  ]
}


Вот правильный ответ :
$filter=packings/any(s:contains(s/barcode, '4680022430939'))
Может быть кому пригодится !
1 Инстанс
 
27.06.24
11:02
Это json? И?
2 Инстанс
 
27.06.24
11:04
А, это Odata
3 Инстанс
 
27.06.24
11:05
Пинай тим вью.
4 VismuT
 
27.06.24
12:09
(2) Да.Odata
Проблема если у товара 2 штрихкодами . То ответ пустой возвращается . А должен быть такой ответ.
Ответ
"value": [
    {
      "id": "e1887925-7621-11ea-b79f-b06ebf35169e",
      "name": "Шоколад \"Babyfox\" 45 гр.С мол,начинкой (30)",
      "barcode": "00000049605",
      "basePackingId": "шт",
      "marking": "рр366",
      "packings": [
        {
          "name": "шт",
          "selfWeight": 0,
          "selfVolume": 0,
          "unitsQuantity": 1,
          "barcode": "4690329009714|4690329014077",
          "barcodes": [
            "4690329009714",
            "4690329014077"
          ],
          "id": "шт",
          "marking": "",
          "price": 145,
          "qty": 63
        }
      ]
    }
  ]
}
5 Valdis2007
 
27.06.24
12:11
(0) в твоем запросе один отбор на баркод

'4680022430939'

он тебе его и возвращает
6 VismuT
 
27.06.24
12:23
(5) Да, все верно . Если в карточке 1 штрих код , то он и возвращает . А если 2 и более , то нет . Пусто , а должно быть как тут (4) . То есть ему нужно 4690329009714|4690329014077 , а не один из них .
7 Valdis2007
 
27.06.24
12:33
(6) как формируешь строку запроса? программно?
8 VismuT
 
27.06.24
13:46
(7) Формирую сейчас через swagger . Тестирую какой фильтр в запросе который нужно применить .
Написал этот - $filter=packings/ any (s:s/barcode eq '4690329009714'). По началу  все шло хорошо ,пока не дошел до  товара , где в карточке > 2 штрихкодов .
9 arsik
 
гуру
27.06.24
14:59
(8) Тебе условие не eq нужно, а substringof(Str1, Str2)
https://infostart.ru/1c/articles/1570140/#:~:text=substringof(Str1%2C%20Str2)
Ну или условие натравливать на ТЧ barcodes
10 VismuT
 
27.06.24
15:21
(9) Вот ТЧ barcodes пробую . Либо пусто . Любо синтаксис неверный.
11 arsik
 
гуру
27.06.24
15:50
(10) Фильтр ты ставишь на barcode, а ждешь результата от barcodes
Вот пример описан
https://infostart.ru/1c/articles/1570140/#:~:text=%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B8%D1%85%20%D0%BB%D1%8F%D0%BC%D0%B1%D0%B4%D0%B0%2D%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9%3A-,any
12 VismuT
 
27.06.24
16:29
(11)
Model
ODataResponse[List[Product]] {
@odata.context (string, optional),
value (Array[Product], optional)
}
Product {
id (string, optional): Unique item identifier ,
name (string, optional): Item name ,
packings (Array[Packing], optional, read only): Collection of packing types for the item. For more information, see Packing ,
barcode (string, optional): Base product barcode ,
basePackingId (string, optional): Identifier of the base packing type. For more information, see Packing ,
marking (string, optional): Item marking ,
quantityPolicy (QuantityPolicy, optional): Quantity management policy
}
Packing {
name (string, optional): Packing name ,
selfWeight (number, optional): Own weight of the packing ,
selfVolume (number, optional): Own volume of the packing ,
unitsQuantity (number, optional): The number of units of the product in the packing. The unit of measurement of the product is set in Product.UnitId ,
barcode (string, optional): Product packing barcode. It can be set as a template from a combination of characters and {Template} blocks. Such blocks are used to insert quantities, expiration dates, and so on into the barcode. For more information about using barcode templates, see the Developer's Guide. Simplified access to Barcodes, allowing you to set one barcode or many via '|' ,
barcodes (Array[string], optional, read only): Collection of product packing barcodes. Each barcode can be set as a template from a combination of characters and {Template} blocks. Such blocks are used to insert quantities, expiration dates, and so on into the barcode. For more information about using barcode templates, see the development documentation ,
id (string, optional): Unique packing identifier ,
marking (string, optional): Item marking
}
QuantityPolicy {
multiline (boolean, optional): Indicates that the addition of entries to the document (CurrentItems) will be made for each type of packing separately ,
id (string, optional): The unique identifier of the accounting policy ,
packingIds (Array[string], optional, read only): Packing Ids collection that define the accounting policy
}

Фильтр ставить на barcode бессмысленно . Нужно как то фильтровать коллекцию ,в коллекции множеств . -_-
13 VismuT
 
28.06.24
16:21
packings/ any (s:contains(barcode, ''))
По идее должно работать , но он ищет совпадение по коду . Потому что код товара из 1с , записывается в строку    "barcode": "00000025011" . Блин . Или пробовать скипаться .
14 Атомный частичка
 
28.06.24
18:11
Если у товара два баркода, то ищи сразу по двум, в том виде, как они записаны у товара, в правильном порядке:

$filter=packings/ any (s:s/barcode eq '4690329009714|4690329014077')
15 Атомный частичка
 
28.06.24
18:13
Или лучше скажи руководителю что не можешь решить задачу, пусть ее передадут кому-нибудь другому, пусть он с ней трахается. Лучший вариант для тебя, ИМХО.
16 VismuT
 
29.06.24
08:04
(14) так я знаю только 1 штрих  при создании гет , а второй нет .В этом проблема . (15) I am alone )
17 Инстанс
 
29.06.24
08:08
в чём проблема через json получить по-человечески
Гет? Ну сделайте на стороне 1с нормальный выхлоп
18 Инстанс
 
29.06.24
08:09
Нормальный http
19 Инстанс
 
29.06.24
08:13
Хотя ладно я гоню. odata это ж типа прям без всякого такого
20 VismuT
 
29.06.24
08:30
(19) Да ,просто зачем нужно было делать объекты с одинаковыми именами . Менять это не возможно(возможно много Эботни) , потому что к этому серверу данных у меня привязаны ТСД .
21 Инстанс
 
29.06.24
08:35
у тебя json есть на входе или как? я с odata не работал
22 VismuT
 
29.06.24
08:47
(21) Да.
23 Инстанс
 
29.06.24
08:48
И дальше что? В структуру и обработать по 1совски?
24 VismuT
 
29.06.24
12:13
(23) Принципе .Я сейчас свой сервер разверну. Ну в жэпу эту хуТУТУ . С 1ски все туда буду выгружать . И запрос туда отсылать.  
Тему можно закрыть .
25 Salimbek
 
29.06.24
21:00
(24) А так:
$filter=packings/ any (s:s/barcodes any (d: d eq '4680022430939'))
26 VismuT
 
03.07.24
14:19
Вот правильный ответ :
$filter=packings/any(s:contains(s/barcode, '4680022430939'))
Может быть кому пригодится !
27 VismuT
 
03.07.24
14:19
(25) это я давно пробовал . Не работает
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.