Некорректная загрузка сумм из касс Фронтол УТ 11.5
У клиента проблема — после переезда на новый сервер начали загружаться огромные суммы в отчетах о розничных продажах.
Я не глядя порекомендовал сменить язык сервера (локализацию) на русский. Помогло, но не всегда. Иногда, когда ОРП автоматом загружались по ночам, проблема больших чисел опять возникала.
Пришлось разбираться и бороться.
Присмотревшись, я заметил, что разница только в сумме:
В текстовом файле Фронтол сумма выводится с запятой:
Похоже, что запятая воспринимается при преобразовании числа из строки не как разделитель десятичной точки, а как разделитель разрядов числа.
Теперь нужно было найти место в коде, где разбирается файл Атолл. Отладчика у меня не было доступно, поэтому пришлось искать цепочку вызовов глобальным поиском названием вызываемых методов, где-то 3-4 итерации.
В итоге я нашел, что заполнение строк происходит в методе ОфлайнОборудованиеАтолККМВызовСервера.ЗаполнитьТранзакцию:
Метод Число использует локальный формат чисел. Зачем его применять при загрузке из Frontol, где точно известен формат чисел — непонятно — то ли лень, то ли неграмотность разработчиков типового кода:
Но теперь стало понятно, что именно чинить. На всякий случай я протестировал свой код преобразования чисел в консоли кода:
Тестировал вот такой код:
С = XMLСтрока(11.2); Сообщить(С); Ч = XMLЗначение(Тип("Число"), "11.2"); Сообщить(Ч);
Расширение метода ОфлайнОборудованиеАтолККМВызовСервера.ЗаполнитьТранзакцию получилось таким:
// Преобразуем значение числовых полей в число. Если (Индекс >= 10 И Индекс <= 13) ИЛИ Индекс = 16 Тогда Попытка ЗначениеЧислом = Число(Значение); #Вставка //Осипов 2023-09-10 заменяем без учета регионального формата //Чтобы не было ошибок на разных серверах ВремЗначение = СтрЗаменить(Значение, ",", "."); ЗначениеЧислом = XMLЗначение(Тип("Число"), ВремЗначение); Если Индекс = 16 Тогда //В протокол тоже пишем через XMLСтрока, чтобы конвертировалось число в формат через точку ТекКомментарий = "Преобразование суммы чека из строки: " + Значение + " в число: " + XMLСтрока(ЗначениеЧислом) + Символы.ПС + Строка; //Запись в журнал временно, потом удалить, нет отладчика... ЗаписьЖурналаРегистрации("Отладка.ЧтениеЧислаФронтол", ,,,ТекКомментарий); КонецЕсли; #КонецВставки
Оставил запись в журнал регистрации временно, чтобы понаблюдать, как конвертируются суммы. Посмотрел — корректно:
В принципе, там все числа не корректно конвертировались, спасало то, что цены и количества были целыми и из Frontol приходили без запятых. Зато теперь конвертация работает корректно, даже если установить 1С в Китае!
Среда: УТ 11.5.7.402 Объем: 2 час
Свежие комментарии