Имя: Пароль:
1C
1С v8
Непонятки со строками при преобразовании число-текст
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
Сам бы проверил - может это только на какой-то конкрентной платформе или при прочих конкретных параметрах среды воспроизводится.