|
Непонятки со строками при преобразовании число-текст | ☑ | ||
---|---|---|---|---|
0
paramedic
29.11.17
✎
21:30
|
ВКП!
Натолкнулся на абсолютно непонятное (для меня) поведение платформы. Оно выражается в следующем: Имеется справочник с текстовым реквизитом. В него грузятся числовые значения, преобразованные в строку. Преобразования делал через Строка(Значение) и неявно. При массовой загрузке число преобразовывается как с раделителем тысяч, так и без него - хаотично. Никто не знает, ВТФ? Платформа 1С:Предприятие 8.3 (8.3.10.2561), СУБД Postgresql 9.2.4. Сервер и СУБД на Генту. |
|||
1
Йохохо
29.11.17
✎
21:39
|
те, что без разделителя, уже были строками
|
|||
2
paramedic
29.11.17
✎
21:43
|
(1) Ничего подобного. Числа.
|
|||
3
Йохохо
29.11.17
✎
21:45
|
(2) Строки. Возьми да загрузи проблемное "число" 100500 раз
|
|||
4
paramedic
29.11.17
✎
21:50
|
(3) Я же сказал - хаотично меняются. Каждую загрузку - разные.
Даже делал так: Строка(Число(Значение)) для верности. И проверял до этого тип значение на соответствие типу "число". Отловить вручную на 30-60 тыс. записей нереально. |
|||
5
Cyberhawk
29.11.17
✎
21:52
|
Открой для себя точку останова с условием
|
|||
6
paramedic
29.11.17
✎
21:58
|
(5) Не ловится. Я не совсем уж ламер.
И я заметил, что остановка с условием на текстовые значения работает как-то не очень... |
|||
7
Йохохо
29.11.17
✎
22:05
|
(4) одно и то же значение случайным образом то с разделителем, то нет? Я ж говорю, грузи одну и ту же строку, пока не подтвердишь ошибку. И если хотел исправить поведение, стоило таки использовать Формат
|
|||
8
АнализДанных
29.11.17
✎
22:06
|
(6) что ты писал в условии для "точка останова с условием"?
|
|||
9
Cyberhawk
29.11.17
✎
22:19
|
(6) "Пригласи специалиста" (с)
|
|||
10
paramedic
29.11.17
✎
22:22
|
(7) Формат использовал с принудительным заданием разделителя Символы.НПП - пофигу
(8) СтрНайти(СтроковоеЗначение,Символы.НПП)=0 Он останавливался и там, где эти чертовы непереносимые пробелы были. |
|||
11
paramedic
29.11.17
✎
22:26
|
(9) известный мне специалист ответил:
"Если вы преобразуете число в строку, программа пытается сама догадаться - какой формат представления числа использовать. И до чего она догадается по виду числа - загадка." ЗЫ этот специалист имеет право преподавать программирование на платформе... |
|||
12
Cyberhawk
29.11.17
✎
22:26
|
"останавливался и там, где эти чертовы непереносимые пробелы были" // Гонишь, или давай пруф (в табло при сработавшей точке останова результат условия)
|
|||
13
Cyberhawk
29.11.17
✎
22:27
|
(11) Нужен не теоретик
|
|||
14
Йохохо
29.11.17
✎
22:34
|
(12) в табло) "угости сигареткой - сигаретки в магазине - а если в табло и еще раз спросить?"
(11) приведи типы и источники чисел |
|||
15
jsmith82
29.11.17
✎
22:38
|
(0) Предлагаешь поверить на слово?!
|
|||
16
paramedic
29.11.17
✎
23:01
|
(15) Ох уж Фомы неверующие...
https://yadi.sk/i/OwuQkOLV3QAr9z (14) Загрузка из Интернета через JSON. Разбор с помощью ЧтениеJSON. Уже писал, что: - тип значения проверял - число. - делал преобразование Строка(Число(Значение)) |
|||
17
Йохохо
29.11.17
✎
23:23
|
(16) осталось в временный файл записать джейсон до разбора
|
|||
18
Йохохо
29.11.17
✎
23:24
|
+ по артикулу вполне можно было отладку
|
|||
19
h-sp
29.11.17
✎
23:28
|
xmlСтрока() же все пользуются. Функция Строка() - это только для теоретиков.
|
|||
20
selta10
29.11.17
✎
23:50
|
Всегда просто получается:
Формат(ЗначениеЧисло,"ЧДЦ=; ЧГ=0") |
|||
21
VladZ
30.11.17
✎
04:53
|
(0) "Имеется справочник с текстовым реквизитом. В него грузятся числовые значения, преобразованные в строку". Зачем число грузить в строку? Какой в этом смысл?
|
|||
22
perester
30.11.17
✎
04:59
|
(0) откуда грузятся? скорее всего в этом "откуда" там тип строка или текст, а не число
|
|||
23
perester
30.11.17
✎
05:00
|
(22) если ексель, то там даже тип число не всегда число, он же просто пытается перевести в число
|
|||
24
perester
30.11.17
✎
05:04
|
то есть хочу сказать что в таблице откуда загружаются значения вот этот идентификатор записан как текст 58965, то есть при переводе в строку он будет как есть 58965, а также там имеются значения с типом число 58965, то есть при строка(значение) он ставит разделитель и переводит в 58 965
|
|||
25
FIXXXL
30.11.17
✎
08:51
|
(10) XMLСтрока(<Значение>) или Формат и ЧГ=
|
|||
26
Адинэснег
30.11.17
✎
08:55
|
0Формат()
|
|||
27
Адинэснег
30.11.17
✎
08:56
|
Формат(ТвоеЧисло, "ЧГ=")
|
|||
30
paramedic
30.11.17
✎
09:18
|
(21) Да потому что в этом реквизите и строки используются.
Народ, читайте внимательнее - то, что исходное значение "Число" проверял как на соответствие типов, так и явным приведением к типу "число". (27) Пробовал - не прокатило. (17) Это уже изврат, когда стандартный механизм разбора не ошибается... (24) При чем здесь эксель? (27) Пробовал. Не помогало. Пока дописался до такого изврата: Стр = Формат(Число(Стр.Id),"ЧЦ=15; ЧРГ= "); СтрЗаменить(Стр, " ", Символы.НПП); Сработало без сбоев. И да, сбоило примерно в 0,5% случаев. |
|||
31
dezss
30.11.17
✎
10:23
|
(30) тебе в (19) и (25) показали как надо, но ты продолжаешь жрать кактус.
Или тебе все таки нужен этот неразрывный пробел (правда я совершенно не могу понять зачем это может быть нужно)? |
|||
34
paramedic
30.11.17
✎
10:56
|
(31) К сожалению нужен...
Из-за внутренних механизмов самой 1С по преобразованиям типов. У нас есть еще дополнения к конфигурации и там тоже используются неявные (или явные хз) преобразования типов. Править хрен знает в скольки местах да еще при наличии закрытых от изменения частях кода - проще поправить в одном. Еще раз повторюсь: проблема проявляется ТОЛЬКО при обработке 50+тыс. записей в JSONе. И из них 100-200 рандомно сбоят. По одной или небольшими порциями проблемы нет. Сразу скажу, что разбивать загрузку невозможно - поставщик данных отдает только одним здоровым куском в 300+тыс. записей, из которых и так выдираю часть. Если грузить частями, то загрузка займет часов 8, а надо грузить как минимум 3 раза в день. |
|||
35
dezss
30.11.17
✎
11:05
|
(34) тогда делай остановку когда ТипЗнч(<Твой_параметр>) = Тип("Строка").
ИМХО, дело в преобразовании из json-а. Как, кстати, его делаешь? |
|||
36
Ненавижу 1С
гуру
30.11.17
✎
11:11
|
Может с клиентов Win грузится с разделителями, а с сервера Линукс без. Кто их там линуксов знает...
|
|||
37
paramedic
30.11.17
✎
11:15
|
(35) См. (16)
Ч_JSON = Новый ЧтениеJSON; Ч_JSON.ОткрытьФайл(ФайлРезультата); СтруктураОтвета = ПрочитатьJSON(Ч_JSON, Ложь); Нормально все обрабатывает, с правильными типами. (36) Я бы не поднимал тему, если бы все записи обрабатывались одинаково... |
|||
38
dezss
30.11.17
✎
11:20
|
(37) а какой тип у колонки "Идентификатор"?
|
|||
39
mehfk
30.11.17
✎
11:21
|
(37) Подготовь минимальный тестовый набор, который каждый сможет проверить у себя.
|
|||
40
Йохохо
30.11.17
✎
11:23
|
(39) +, можно и полный, есть же скрин в (16)
|
|||
41
kiruha
30.11.17
✎
11:25
|
Строка(Значение) - не надо так больше делать
чего обсуждать то XMLСтрока(Значение) Число - XML представление соответствует представлению типа decimal схемы XML (см. http://www.w3.org/TR/xmlschema-2/#decimal); |
|||
42
dezss
30.11.17
✎
11:33
|
(41) ему нужны разделители НПП
|
|||
43
paramedic
30.11.17
✎
11:53
|
(40) (39) Подготовить минимальный - не знаю как, т.к. не знаю, какое количество записей нужно для воспроизводства ошибки. Полный ответ JSON занимает до 30 метров в двух строках. А скрин - это просто список справочника с уже полученной ошибкой...
(41) Пока 1С и партнеры вовсю используют неявные преобразования в конфигурациях подобные вещи возможны только в личных надстройках. Я бы вообще использовал типизированные поля для идентификаторов, но вынужден пользоваться тем, что уже есть. Вопрос закрыт костылем и терять время на поиски плавающей первопричины в текущий момент не могу. Тем более, что все предложенные варианты, которые могут дать требуемый результат, испробованы. |
|||
44
Йохохо
30.11.17
✎
11:54
|
(43) выкладывай, у нас норм инет и много дискет) а на скрине просто видно проблемную строку
|
|||
45
paramedic
30.11.17
✎
14:19
|
Попробуйте поразвлекаться разными способами преобразования.
https://yadi.sk/d/0xLOVNxN3QBuHE Это строка в JSON. Лишние поля удалил. |
|||
46
Масянька
30.11.17
✎
14:26
|
(45) И? Проблемная строка которая?
|
|||
47
paramedic
30.11.17
✎
15:41
|
(46) Да сколько раз повторять - рандомно не добавляются НПП. За 1,5 недели работы (загрузка 2 раза в день) количество неправильных идентификаторов растет и достигло 1462 штуки на сегодняшнее утро.
Дальше развлекаться неохота - база рабочая и последующее удаление неправильных записей будет все тяжелее. Так что так как решение найдено, то все ошибочные записи уже удалены. Если нужна конкретная запись из бывших ошибочных, то вот, например: {"Id": 117935, "Stock": 0, "Additional": 0, "Price": "3769.23"} или эта, из скрина: {"Id": 58965, "Stock": 0, "Additional": 0, "Price": "431.58"} |
|||
48
hhhh
30.11.17
✎
16:48
|
(47) а зачем добавлять нпп? Они там вообще ни к чему.
|
|||
49
paramedic
30.11.17
✎
16:51
|
(48) 1. разборка JSON возвращает тип данных для ID "число"
2. Есть сторонние доработки, которые так же используют это поле с преобразованиями число-текст и я не знаю, как они это делают - часть кода закрыта. Но точно преобразуется число в текст по правилам 1С, т.е с НПП. |
|||
50
mehfk
30.11.17
✎
16:59
|
(45) Ты б сделал конфу с одним справочником и обработкой загрузки из json, может кто и потестил бы у себя.
|
|||
51
mehfk
30.11.17
✎
17:00
|
Сам бы проверил - может это только на какой-то конкрентной платформе или при прочих конкретных параметрах среды воспроизводится.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |