При переносе или доработке функционала прослеживаемости товаров в учетных системах на базе 1С разработчики нередко сталкиваются с ситуацией, когда система «не видит» равенства между суммами дробных значений. В этой статье мы подробно разберем, почему количество 0,814 при определенных условиях превращается в 1 и как правильно настроить реквизиты, чтобы избежать ошибок несоответствия.
Давайте рассмотрим типичный алгоритм проверки количества РНПТ, который часто встречается в типовых конфигурациях. В коде происходит суммирование значений из табличной части, после чего полученный результат сравнивается с итоговым количеством товара:
Функция ПроверитьКоличествоРНПТ()
Отбор = Новый Структура("ИдентификаторСтроки", КлючСвязи);
МассивСтрок = СведенияОПрослеживаемости.НайтиСтроки(Отбор);
КоличествоРНПТ = 0;
Для Каждого СтрокаПрослеживаемости Из МассивСтрок Цикл
КоличествоРНПТ = КоличествоРНПТ + СтрокаПрослеживаемости.Количество;
КонецЦикла;
Возврат (КоличествоРНПТ = Количество);
КонецФункции
Когда мы выполняем сложение 0,814, переменная КоличествоРНПТ должна сохранить дробное значение. Однако на практике мы часто видим, что результат становится равен 1. Почему это происходит? Основная причина кроется в настройках метаданных.
Первое, что мы должны сделать — проверить свойства реквизитов, участвующих в вычислении. В платформе 1С тип «Число» имеет два важных параметра: Длина и Точность. Если реквизит настроен как целое число (точность равна 0), то любое дробное значение, записанное в него, будет автоматически округлено платформой еще до начала любых вычислений.
Как проверить и исправить:
Количество.Число.УПП или другую сложную конфигурацию, проверьте также тип данных переменной, в которую вы собираете промежуточные итоги.Даже если вы правильно настроили точность реквизита, при программировании важно помнить об особенностях работы процессора с числами с плавающей точкой. Прямое сравнение через оператор = может давать «ложноотрицательный» результат из-за микроскопических погрешностей вычислений.
Рассмотрим, как правильно сравнивать значения в 1С. Вместо прямого сравнения мы рекомендуем приводить числа к сопоставимому виду с использованием функции Окр().
Пример правильного сравнения:
// Вместо прямого сравнения:
// Возврат (КоличествоРНПТ = Количество);
// Используем безопасный подход с округлением до необходимой точности:
ТочностьПрослеживаемости = 3;
Возврат (Окр(КоличествоРНПТ, ТочностьПрослеживаемости) = Окр(Количество, ТочностьПрослеживаемости));
Если после настройки точности ошибка сохраняется, нам необходимо проанализировать, что именно происходит в памяти системы. Мы рекомендуем использовать отладчик:
ТипЗнч(КоличествоРНПТ). Если тип данных принудительно приводится к целому, система покажет это в ходе выполнения кода.СведенияОПрослеживаемости не содержат «обрезанных» значений еще на этапе заполнения коллекции.Заключение:
В большинстве случаев проблема кроется именно в «забытых» настройках реквизитов в конфигураторе. Прослеживаемость требует высокой точности, поэтому для соответствующих полей всегда устанавливайте максимально возможную точность. В сочетании с использованием метода Окр() при проверке равенства это позволит избежать любых несоответствий в учете товаров.