Имя: Пароль:
1C
1С v8
Как обойти ограничение на длину 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
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, в той же строке где и слэш.
Всем спасибо.