Имя: Пароль:
1C
1С v8
OData и коды маркировки
,
0 BaZZiL
 
20.07.21
12:52
Как найти код маркировки пользуясь интерфейсом OData?

Допустим, что (в БП 3.0) Справочник УпаковкиШтрихкодовТоваров доступен для OData.
Формирую запрос типа:

http://localhost/REST/odata/standard.odata/Catalog_ШтрихкодыУпаковокТоваров?$format=json&
$select=Ref_Key,Номенклатура,ЗначениеШтрихкода
&$filter=ЗначениеШтрихкода eq '(01)04660054763397(21)5kl+d.MajJbpx'

получаю ответ вида:

{
"odata.metadata": "http://localhost/REST/odata/standard.odata/$metadata#Catalog_ШтрихкодыУпаковокТоваров",
"value": [{
"Ref_Key": "31c35f38-b52b-11ea-811d-00155d91fb02",
"ЗначениеШтрихкода": "(01)04660054763397(21)5kl+d.MajJbpx",
"Номенклатура@navigationLinkUrl": "Catalog_ШтрихкодыУпаковокТоваров(guid'31c35f38-b52b-11ea-811d-00155d91fb02')/Номенклатура"
}]
}

Но если попытаться указать значение штрихкода с "нехорошими символами", например, "(01)04660054763410(21)1;M&hMOQN_!eN" то все ломается:


{
"odata.error": {
"code": "0",
"message": {
"lang": "ru",
"value": "Параметр hMOQN_!eN' не поддерживается"
}
}
}

Забыть ОДату и ваять свой http сервис?
1 ДенисЧ
 
20.07.21
12:55
2 BaZZiL
 
20.07.21
13:12
%26 вместо & прокатывает)
3 BaZZiL
 
20.07.21
13:36
Ссылка на инструкцию Честного знака об экранировании символов в кодах маркировки:

https://xn--80ajghhoc2aj1c8b.xn--p1ai/upload/iblock/d53/Рекомендуемыи%CC%86_алгоритм_экранирования_специальных_символов_в_коде_идентификации_ки.pdf
4 BaZZiL
 
20.07.21
13:39
Может и в БСП есть функция ЭкранироватьСимволыВСтроке()?
5 BaZZiL
 
21.07.21
12:17
Код маркировки может содержать апострофы

$filter=ЗначениеШтрихкода eq '(01)04610063990116(21)Un+trgcG'GtRq'

такой фильтр примет код '(01)04610063990116(21)Un+trgcG' отбросит последние 4 символа

И что делать?
6 acht
 
21.07.21
12:22
(5) > И что делать?
Ты сам-то по своей ссылке из (3) ходил, или так - похвастаться принес?
7 timurhv
 
21.07.21
12:37
(4) Может подойдет:
КодироватьСтроку(<Строка>, <СпособКодированияСтроки>, <КодировкаСтроки>)
РаскодироватьСтроку(<Строка>, <СпособКодированияСтроки>, <КодировкаСтроки>)

Онлайн можно проверить, например http://www.michurin.net/online-tools/url-escape-online.html
Регистры букв проверяются? А то марка может быть марка условно "аааА" и "ааАА".
8 timurhv
 
21.07.21
12:46
(7) КодироватьСтроку("(01)04610063990116(21)Un+trgcG'GtRq", СпособКодированияСтроки.КодировкаURL)
Результат: %2801%2904610063990116%2821%29Un%2BtrgcG%27GtRq
9 BaZZiL
 
21.07.21
12:47
Цитатко с ИТС:

17.2.1.5.2. $filter
При получении данных можно фильтровать данные. Для этого предназначен специальный язык, который позволяет описывать условия, каким должны соответствовать данные, которые возвращает стандартный интерфейс OData. Описание отбора начинается с ключевого слова $filter, после которого следует собственно условие.

eq

/Catalog_Города?$filter=Description eq 'Главный' Это сработает
/Catalog_Писатели?$filter=Фамилия eq 'О'Генри' а здесь сломается

Каким экранированием отделить апостроф в коде маркировки (тексте условия) от апострофов в синтаксической конструкции фильтра?
10 ДенисЧ
 
21.07.21
12:49
/Catalog_Писатели?$filter=Фамилия eq 'О\'Генри'
Пробовал?
11 acht
 
21.07.21
12:54
12 acht
 
21.07.21
12:54
Example 3: valid OData URLs:
13 BaZZiL
 
21.07.21
13:10
(7) (11)  Похоже, то что нужно

For example, one of these rules is that single quotes within string literals are represented as two consecutive single quotes.
Мог бы и догадаться)
14 BaZZiL
 
21.07.21
13:44
Всё равно что-то идёт не так

с кодом маркировки (01)04610063990116(21)Un%2BtrgcG%27GtRq получаю ответ:

{
"odata.error": {
"code": "14",
"message": {
"lang": "ru",
"value": "Ошибка при разборе опции запроса $filter"
}
}
}

а когда добавляю второй апостроф (01)04610063990116(21)Un%2BtrgcG%27%27GtRq, то в ответ пустота:

{
"odata.metadata": "http://localhost/REST/odata/standard.odata/$metadata#Catalog_ШтрихкодыУпаковокТоваров",
"value": []
}
15 timurhv
 
21.07.21
13:47
(14) так скобки тоже должны быть закодированы, разве нет?
16 BaZZiL
 
21.07.21
13:50
Да, с кодированными скобками тоже самое.
17 timurhv
 
21.07.21
13:52
(16) из (0) &$filter=ЗначениеШтрихкода eq '(01)04660054763397(21)5kl+d.MajJbpx'

'(01)04660054763397(21)5kl+d.MajJbpx' - вот это все должно быть закодировано, а не что внутри
18 timurhv
 
21.07.21
13:53
(17) из (11)

Example 3: valid OData URLs:
http://host/service/People(%27O%27%27Neil%27)

Example 4: invalid OData URLs:
http://host/service/People('O%27Neil')
19 BaZZiL
 
21.07.21
14:03
20 BaZZiL
 
21.07.21
14:04
Движок форума тоже веселится от экранирования))
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан