Почему при проверке количества прослеживаемых товаров (РНПТ) возникает ошибка несоответствия?

Программист 1С v8.3 (Обычные формы) 1С:ERP Управление предприятием Налоговый учет Торговля и дистрибуция
← На главную

При переносе или доработке функционала прослеживаемости товаров в учетных системах на базе 1С разработчики нередко сталкиваются с ситуацией, когда система «не видит» равенства между суммами дробных значений. В этой статье мы подробно разберем, почему количество 0,814 при определенных условиях превращается в 1 и как правильно настроить реквизиты, чтобы избежать ошибок несоответствия.

Анализ проблемы: где кроется ошибка?

Давайте рассмотрим типичный алгоритм проверки количества РНПТ, который часто встречается в типовых конфигурациях. В коде происходит суммирование значений из табличной части, после чего полученный результат сравнивается с итоговым количеством товара:


Функция ПроверитьКоличествоРНПТ()
    Отбор = Новый Структура("ИдентификаторСтроки", КлючСвязи);
    МассивСтрок = СведенияОПрослеживаемости.НайтиСтроки(Отбор);
    КоличествоРНПТ = 0;
    
    Для Каждого СтрокаПрослеживаемости Из МассивСтрок Цикл
        КоличествоРНПТ = КоличествоРНПТ + СтрокаПрослеживаемости.Количество;
    КонецЦикла;
    
    Возврат (КоличествоРНПТ = Количество);
КонецФункции

Когда мы выполняем сложение 0,814, переменная КоличествоРНПТ должна сохранить дробное значение. Однако на практике мы часто видим, что результат становится равен 1. Почему это происходит? Основная причина кроется в настройках метаданных.

Шаг 1: Проверка настроек точности в Конфигураторе

Первое, что мы должны сделать — проверить свойства реквизитов, участвующих в вычислении. В платформе 1С тип «Число» имеет два важных параметра: Длина и Точность. Если реквизит настроен как целое число (точность равна 0), то любое дробное значение, записанное в него, будет автоматически округлено платформой еще до начала любых вычислений.

Как проверить и исправить:

  1. Откройте конфигуратор и найдите реквизит, в котором хранится Количество.
  2. Перейдите на вкладку Тип и откройте настройки типа Число.
  3. Убедитесь, что для прослеживаемых товаров установлена достаточная точность. Согласно требованиям законодательства и специфике учета прослеживаемости, для весовых или мерных товаров точность должна быть не менее 3 знаков после запятой, а в идеале — 11 знаков (например, формат 26, 11).
  4. Если вы используете УПП или другую сложную конфигурацию, проверьте также тип данных переменной, в которую вы собираете промежуточные итоги.

Шаг 2: Устранение ошибок сравнения чисел с плавающей точкой

Даже если вы правильно настроили точность реквизита, при программировании важно помнить об особенностях работы процессора с числами с плавающей точкой. Прямое сравнение через оператор = может давать «ложноотрицательный» результат из-за микроскопических погрешностей вычислений.

Рассмотрим, как правильно сравнивать значения в 1С. Вместо прямого сравнения мы рекомендуем приводить числа к сопоставимому виду с использованием функции Окр().

Пример правильного сравнения:


// Вместо прямого сравнения:
// Возврат (КоличествоРНПТ = Количество);

// Используем безопасный подход с округлением до необходимой точности:
ТочностьПрослеживаемости = 3;
Возврат (Окр(КоличествоРНПТ, ТочностьПрослеживаемости) = Окр(Количество, ТочностьПрослеживаемости));

Шаг 3: Отладка и проверка типов

Если после настройки точности ошибка сохраняется, нам необходимо проанализировать, что именно происходит в памяти системы. Мы рекомендуем использовать отладчик:

Заключение:

В большинстве случаев проблема кроется именно в «забытых» настройках реквизитов в конфигураторе. Прослеживаемость требует высокой точности, поэтому для соответствующих полей всегда устанавливайте максимально возможную точность. В сочетании с использованием метода Окр() при проверке равенства это позволит избежать любых несоответствий в учете товаров.

← На главную