Некорректная загрузка сумм из касс Фронтол УТ 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 час

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *