|
Как обойти ограничение на длину JSON | ☑ | ||
---|---|---|---|---|
0
petya_
petrov_63 03.02.23
✎
11:35
|
Есть 1С:Розница. Надо для нее написать несколько HTTP сервисов для обмена с электронным кассиром. Споткнулся при реализации метода по выгрузке справочника номенклатура. В справочнике около 2000 единиц. При выгрузке справочника получаю ошибку при записи JSON. Для эксперимента ограничил выгрузку 10 единицами. Запись проходит нормально без каких-то либо сообщений. Сижу ломаю голову как сделать выгрузку частями.
|
|||
1
Aleksey
03.02.23
✎
11:36
|
а почему решил что ошибка в длине, а не в данных?
|
|||
2
KJlag
03.02.23
✎
11:36
|
(0) перейти с Get на Post ?
|
|||
3
Aleksey
03.02.23
✎
11:38
|
Короче нужен как минимум текст ошибки
|
|||
4
Kassern
03.02.23
✎
11:41
|
(0) Вы скорее уперлись в ограничение get и передаете строку не в теле запроса как написали в (2)
Нет у json ограничения, хоть километровые мантры пишите. |
|||
5
НафНаф
03.02.23
✎
11:42
|
ошибку конечно никто не озвучит?
|
|||
6
Aleksey
03.02.23
✎
11:42
|
(4) есть ограничения со стороны приемника (память у кассы не резиновая)
|
|||
7
novichok79
03.02.23
✎
11:44
|
не ну а чо, качайте телепатию.
|
|||
8
Aleksey
03.02.23
✎
11:46
|
а так браузере тоже по умолчанию понимают строку порядка 8кб (с учетом того что русские буквы занимают 2 байта, получается чуть более 4к символов), далее только (2)
|
|||
9
Мультук
гуру
03.02.23
✎
11:49
|
(0)
Неужели сложно показать небольшой кусок кода и текст ошибки ? >> Сижу ломаю голову как сделать выгрузку частями. Нужно читать api этого самого электронного кассира |
|||
10
petya_
petrov_63 03.02.23
✎
11:50
|
(2) он post-ом и написан
(6) приемник не касса, а сайт на терминале (3) сейчас сделаю ошибку будет и текст |
|||
11
petya_
petrov_63 03.02.23
✎
11:51
|
Ошибка при вызове метода контекста (ЗаписатьJSON)
{СозданиеЧекаККМБаня ОбщийМодуль.ФСТ_ЭлектронныйКассир.Модуль(970)}: ЗаписатьJSON(Запись, Значение); {СозданиеЧекаККМБаня ОбщийМодуль.ФСТ_ЭлектронныйКассир.Модуль(868)}: СтрокаJSON = ПреобразоватьДанныеВJSON(ДанныеДляОтвета); {СозданиеЧекаККМБаня HTTPСервис.ЭК_HTTPМодуль.Модуль(64)}: ТелоОтвета = ФСТ_ЭлектронныйКассир.НоменклатураТоваров(ТелоЗапроса); по причине: Передано значение недопустимого типа |
|||
12
Aleksey
03.02.23
✎
11:52
|
"Передано значение недопустимого типа" - ну и какие тут могут быть вопросы?
|
|||
13
KJlag
03.02.23
✎
11:53
|
(11) и шо тебе говорит отладка? что там в Запись и в Значение?
|
|||
14
Kassern
03.02.23
✎
11:54
|
(11) "Передано значение недопустимого типа"<>"ограничение на длину JSON"
|
|||
15
mikecool
03.02.23
✎
11:55
|
(11) проверяй в первую очередь даты, возможно их криво укладываешь
|
|||
16
Aleksey
03.02.23
✎
11:55
|
как можно ошибку "Передано значение недопустимого типа" прочитать как "данные не могут быть записаны, так как достигнуто ограничения на длину JSON"?
|
|||
17
Aleksey
03.02.23
✎
11:55
|
(15) ну 10 единиц выгружено, значит с логикой укладки там должно быть норма. Проблема в самих данных
|
|||
18
Kassern
03.02.23
✎
11:57
|
(11) Открываете любой онлайн сервис json и пихаете туда текст, который отправляете. Смотрите на строчки, на которые ругается парсер и делаете выводы.
|
|||
19
lodger
03.02.23
✎
12:00
|
(11) в 10 выбранных позициях данные ровные, удобные, а вот в 2000 где-то есть NULL или подобная чепуха.
|
|||
20
lodger
03.02.23
✎
12:02
|
(19) чтобы не чесать голову с поиском где именно не считан реквизит, то можно просто в ИмяФункцииПреобразования передать функцию, где сравнишь значение с NULL и отдашь "".
ЗаписатьJSON(<ЗаписьJSON>, <Значение>, <НастройкиСериализации>, <ИмяФункцииПреобразования>, <МодульФункцииПреобразования>, <ДополнительныеПараметрыФункцииПреобразования>) |
|||
21
Галахад
гуру
03.02.23
✎
12:02
|
"СозданиеЧекаККМБаня", что за баня? Как корабль назовешь, так и будешь парится... ))
|
|||
22
petya_
petrov_63 03.02.23
✎
12:02
|
рикуда ошибка длины а не типов: ограничив цикл 10 проходами получаю нормальную запись JSON-а.
|
|||
23
KJlag
03.02.23
✎
12:03
|
(11) как вариант, запросом вытянуть данные на 2000 объектов.
а потом по 10 в попытке пихать в джейсунь, в исключении сделать вывод этих объектов в удобном формате (в файл, в тч, просто сообщить и тд) |
|||
24
lodger
03.02.23
✎
12:03
|
(22) перечитай (19)
|
|||
25
Aleksey
03.02.23
✎
12:05
|
(22) По всем позициям? Или по первым 10? Откуда уверенность что 101 позиции в наименовании нет спецсимвола (ковычки или таб), которые ломают json?
|
|||
26
KJlag
03.02.23
✎
12:06
|
(25) он разве спецсимвол не экранирует по умолчанию?
|
|||
27
Kassern
03.02.23
✎
12:06
|
(22) Почитайте уже https://www.json.org/json-en.html и сделайте выводы.
|
|||
28
Kassern
03.02.23
✎
12:06
|
По-русски https://www.json.org/json-ru.html
|
|||
29
Kassern
03.02.23
✎
12:08
|
В общем у вас не экранируемые данные передаются. Наименование какой нибудь позиции имеет спец символы, которые нужно экранировать. В первых 10позициях таких символов нет, поэтому у вас все проходит.
|
|||
30
Kassern
03.02.23
✎
12:10
|
Делаю ставку на слеш( обратный слеш) в имени номенклатуры)
|
|||
31
Aleksey
03.02.23
✎
12:10
|
||||
32
vde69
03.02.23
✎
12:11
|
у жсонов есть ограничение на уровень вложености, может дело в рекурсии иерархии? или еще в чем?
глубже 200 уровней вложености вроде есть проблемы |
|||
33
petya_
petrov_63 03.02.23
✎
12:12
|
(32) вложенность маленькая - 4 уровня вроде.
(30) идея, возможно верна, так как NULL все в запросе через ISNULL заменил на строки ... |
|||
34
Смотрящий
03.02.23
✎
12:14
|
(11) У тебя где то в жисоне объект 1С затесался.
Вместо строки наименования справочника пишешь ссылку на справочник, например. |
|||
35
lodger
03.02.23
✎
12:16
|
(34) или перечисление в какой-нибудь ставкеНДС
|
|||
36
OldCondom
03.02.23
✎
12:16
|
Откуда такая нелюбовь к отладчику? Галочка "Остановливать при ошибке" и вопрос исчерпан.
|
|||
37
KJlag
03.02.23
✎
12:17
|
гадать будем вечно, пока тс не чекнет что там пытается записаться в джейсунь.
или не запустит по элементную запись в джейсунь с остановкой при ошибке |
|||
38
Kassern
03.02.23
✎
12:20
|
(34) "вместо строки наименования справочника пишешь ссылку на справочник" - это норм отрабатывает, просто будет гуид передаваться.
|
|||
39
Kassern
03.02.23
✎
12:21
|
Это xml загибается на ссылке, если не использовать XMLСтрока
|
|||
40
Смотрящий
03.02.23
✎
12:21
|
(38) Не отрабатывает норм
|
|||
41
petya_
petrov_63 03.02.23
✎
12:21
|
(36) кто сказал, что нелюбовь: Именно остановка на ошибке и срабатывает.
|
|||
42
Kassern
03.02.23
✎
12:26
|
(40) Точно, как раз ошибка "Передано значение недопустимого типа" если пытаться ссылку пихнуть
|
|||
43
Kassern
03.02.23
✎
12:27
|
(41) Ну так посмотрите что передаете в запись json на момент ошибки. (останавливаться по ошибке = истина)
|
|||
44
НафНаф
03.02.23
✎
13:14
|
СозданиеЧекаККМБаня - романтичненько
|
|||
45
petya_
petrov_63 03.02.23
✎
14:08
|
Косяк оказался в названии номенклатуры ""Аренда по договору РБС-АР-1356/12 от 01.04.2012""
|
|||
46
Kassern
03.02.23
✎
14:10
|
(45) сыграла моя ставочка)
|
|||
47
Kassern
03.02.23
✎
14:11
|
На будущее, в УстановитьСтроку указывайте параметры с экранированием и будет вам счастье
|
|||
48
petya_
petrov_63 03.02.23
✎
14:14
|
(47) параметр с экранированием, это функция по преобразованию значения не соответствующего формату JSON или что-то иное?
|
|||
49
Kassern
03.02.23
✎
14:15
|
(48) ПараметрыЗаписиJSON=Новый ПараметрыЗаписиJSON(...);
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON); |
|||
50
Kassern
03.02.23
✎
14:15
|
Новый ПараметрыЗаписиJSON - там как раз все экранирования есть, посмотрите в СП
|
|||
51
petya_
petrov_63 03.02.23
✎
14:22
|
ЭкранироватьСлеш - оно?
|
|||
52
Kassern
03.02.23
✎
14:23
|
(51) пробуйте)
|
|||
53
Kassern
03.02.23
✎
14:23
|
(51) вам даже пример скинули в (31)
|
|||
54
petya_
petrov_63 03.02.23
✎
15:02
|
Поправил
Функция ПреобразоватьДанныеВJSON(Значение) Экспорт ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(,,,ЭкранированиеСимволовJSON.СимволыВнеASCII,Истина,Истина,Истина,Истина,Истина); Запись = Новый ЗаписьJSON; Запись.УстановитьСтроку(ПараметрыЗаписиJSON); ЗаписатьJSON(Запись, Значение); Возврат Запись.Закрыть(); КонецФункции Но все равно выходит ошибка. ЧЯДНТ? |
|||
55
petya_
petrov_63 03.02.23
✎
15:06
|
Валится также на том же самом значении
Аренда по договору РБС-АР-1356/12 от 01.04.2012 |
|||
56
lodger
03.02.23
✎
15:10
|
<ЭкранироватьСлеш> (необязательный)
Тип: Булево. Определяет, будет ли экранироваться слеш (косая черта) при записи значения. Значение по умолчанию: Ложь. интересно, они про \ или про / ? |
|||
57
Kassern
03.02.23
✎
15:10
|
(55) Что-то вы делаете не так. Вот ваш пример: https://disk.yandex.ru/i/WGhJApHDHN8rDA
|
|||
58
Kassern
03.02.23
✎
15:11
|
(56) про /
|
|||
59
Kassern
03.02.23
✎
15:11
|
\ - обратный слеш
|
|||
60
petya_
petrov_63 03.02.23
✎
17:13
|
(57) но что? Набрал пример нормально работает, а моя процедура не срабатывает.
|
|||
61
Kassern
03.02.23
✎
17:16
|
(60) посмотрите в отладке чем отличается ваш пример от моего.
А вообще вы как-то странно json формируете. Зачем вы каждый раз новую запись json создаете? |
|||
62
magicSan
03.02.23
✎
17:55
|
тупо по 10 прогани весь товар увидишь где проблема
|
|||
63
petya_
petrov_63 03.02.23
✎
18:17
|
(62) где проблема я знаю. Как вариант я могу сделать доп функцию проверки наименования номенклатуры, но тут разговор о том, что есть решение стандартное, но оно не срабатывает. Вопрос почему.
|
|||
64
lodger
03.02.23
✎
18:32
|
вот тут (54)
потенциально 2 дырки 1) <ЭкранированиеСимволов> (необязательный) может попробовать дефолтное значение 2) пара ключей ЭкранироватьОдинарныеКавычки и ИспользоватьДвойныеКавычки (они должны быть ложь\истина истина\ложь) у тебя первое по дефолту Истина, второе ты задал Истина, но: <ЭкранироватьОдинарныеКавычки> (необязательный) Тип: Булево. Определяет, будут ли экранироваться одинарные кавычки. Устанавливается в значение Истина, если ИспользоватьДвойныеКавычки установлено в Ложь. Значение по умолчанию: Ложь. |
|||
65
Aleksey
03.02.23
✎
18:50
|
(60) так может ты не на ту кнопочку нажал? Ты нажми на ту.
|
|||
66
petya_
petrov_63 03.02.23
✎
18:54
|
(64) в таком виде ПараметрыЗаписиJson = Новый ПараметрыЗаписиJSON(,,,,,,,,Истина);
тоже не срабатывает. Придется обойтись заплаткой - функцией замены символов. |
|||
67
magicSan
03.02.23
✎
19:09
|
(66) выгрузи по одному - совсем тупой чтоли?
|
|||
68
magicSan
03.02.23
✎
19:09
|
увидишь на каком элименте ошибка
|
|||
69
magicSan
03.02.23
✎
19:10
|
или то что в итоге записывается перехвати вставь в валидатор
|
|||
70
petya_
petrov_63 03.02.23
✎
20:11
|
Нашелся еще один не обработанный NULL, в той же строке где и слэш.
Всем спасибо. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |