Почему в 1С 7.7 округляются числа при умножении и выводе на печать? Разбор проблемы и способов ее решения

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

В рамках данной статьи мы подробно разберем, почему возникает эта проблема, проанализируем внутренние механизмы платформы 1С 7.7 и рассмотрим по шагам методы борьбы с некорректным отображением и расчетом дробных чисел.

Причина №1: Настройка форматной строки в ячейке табличного документа

Как показывает практика и реальный опыт разработчиков, наиболее частой причиной «исчезновения» копеек является банальная настройка отображения данных в печатной форме (макете). Сама переменная в оперативной памяти компьютера может содержать абсолютно точное значение с любым количеством знаков после запятой, но при выводе в таблицу платформа принудительно скрывает дробную часть.

Выясним, как работает форматирование в табличных документах 1С 7.7. Для вывода числовых данных используется форматная строка. Она может быть задана двумя способами:

  1. Интерактивно в свойствах ячейки: Если открыть свойства ячейки в редакторе таблиц, на вкладке «Формат» можно задать шаблон отображения.
  2. Непосредственно в выражении ячейки: В поле выражения после имени выводимой переменной ставится символ решетки #, а за ним следует специальный код формата.

Синтаксис форматной строки для числовых показателей имеет вид Ч<Длина>.<Точность>, где Длина — общее количество символов, отводимых под число, а Точность — количество знаков в дробной части.

Рассмотрим примеры настройки отображения переменной СуммаТО:

Решение: Проверьте свойства проблемной ячейки в макете табличного документа. Убедитесь, что в поле «Формат» или непосредственно в выражении ячейки после символа # указана необходимая точность (как минимум два знака для денежных сумм, например, Ч15.2).

Причина №2: Влияние региональных настроек Windows на преобразование типов

Вторая распространенная проблема кроется в неявном преобразовании строковых данных в числовой тип. Зачастую исходные данные (например, цены из внешних файлов, текстовых выгрузок или API) приходят в систему в виде текстовых строк.

Рассмотрим классический некорректный пример кода:


ЦенаТО = "723.37"; // Строковое значение цены с точкой в качестве разделителя
СуммаТО = К1 * ЦенаТО; // Попытка умножения числа на строку

В 1С 7.7 при попытке выполнить арифметическую операцию со строкой платформа пытается выполнить неявное преобразование типов. Однако этот процесс критически зависит от региональных стандартов операционной системы Windows, установленной на сервере или компьютере пользователя.

Разберем этот механизм по шагам:

  1. Платформа анализирует строку символ за символом слева направо.
  2. В русских региональных настройках Windows по умолчанию разделителем дробной части является запятая (,). Точка (.) при этом считается недопустимым символом для числа.
  3. Как только парсер 1С доходит до недопустимого символа (в нашем случае — до точки в строке "723.37"), процесс преобразования мгновенно останавливается.
  4. Вся оставшаяся часть строки после точки (включая саму точку) просто отбрасывается. В результате строка "723.37" превращается в целое число 723. Соответственно, при умножении на любое количество мы получаем результат без копеек, округленный в меньшую сторону.

Для решения этой проблемы необходимо полностью отказаться от хранения чисел в строковом формате в кодовой части программы. Все математические операции должны производиться только над переменными числового типа. Если же получения строки не избежать, необходимо выполнить принудительное и безопасное преобразование.

Проанализируем пример безопасного преобразования строки в число:


// Исходная строка, полученная из внешнего источника
ЦенаСтрока = "723.37"; 

// Принудительно заменяем точку на запятую, чтобы соответствовать русской локали Windows
ПодготовленнаяСтрока = СтрЗаменить(ЦенаСтрока, ".", ",");

// Выполняем явное преобразование типов с помощью встроенной функции Число()
ЦенаЧисло = Число(ПодготовленнаяСтрока);

// Теперь умножение пройдет корректно с сохранением дробной части
СуммаТО = К1 * ЦенаЧисло;

Этот простой прием гарантирует, что дробная часть не будет утеряна вне зависимости от того, какой символ (точка или запятая) используется в качестве разделителя в региональных настройках операционной системы конкретного пользователя.

Причина №3: Жесткие ограничения точности в метаданных конфигурации

Если расчет производится корректно, на печать данные выводятся с копейками, но после сохранения документа в базу данных копейки бесследно исчезают, проблему следует искать в структуре метаданных конфигурации.

В конфигураторе 1С 7.7 для каждого числового реквизита (будь то реквизит документа, справочника, табличной части или ресурс регистра) разработчик жестко задает два базовых параметра:

Если для реквизита Сумма установлена точность, равная 0, то при записи объекта в базу данных (в файлы таблиц DBF или таблицы СУБД MS SQL) СУБД автоматически выполнит округление до целого числа. Платформа произведет эту операцию молча, без вывода каких-либо предупреждений или ошибок в журнал регистрации.

Решение: Откройте конфигуратор, найдите соответствующий документ или справочник, перейдите в свойства числового реквизита и убедитесь, что параметр «Точность» установлен в значение 2 (или более, если требуется особая точность, например, для цен или коэффициентов).

Причина №4: Особенности работы встроенной функции округления Окр()

Когда программисту требуется округлить число непосредственно в коде для выполнения дальнейших расчетов, используется стандартная функция платформы Окр(). Синтаксис функции выглядит следующим образом:

Окр(<Число>, <Точность>, <Способ>)

Важно понимать нюансы работы третьего параметра — Способ. Он управляет тем, как система округляет пограничные значения (когда первая отбрасываемая цифра равна 5):

Посмотрим на пример правильного математического округления суммы до копеек в кодовой базе:


Цена = 723.37;
Количество = 1.15;
СуммаБезОкругления = Количество * Цена; // Получаем 831.8755

// Округляем до 2 знаков по математическим правилам
СуммаИтоговая = Окр(СуммаБезОкругления, 2, 1); // Результат: 831.88

Резюме и рекомендации

Подводя итоги нашего анализа проблемы ложного округления в 1С 7.7, сформулируем краткий чек-лист для предотвращения подобных ошибок в будущем:

  1. Никогда не выполняйте арифметические операции над переменными строкового типа. Явно преобразуйте их к числу с помощью функции Число().
  2. При импорте данных всегда предварительно очищайте строковые числа от пробелов (разделителей триад) и приводите разделитель дробной части к стандарту текущей ОС (обычно к запятой) при помощи функции СтрЗаменить().
  3. Всегда проверяйте свойства макетов таблиц. Если число в отчете выводится без копеек, в 99% случаев проблема заключается в некорректном формате ячейки (например, отсутствует указание точности #Ч15.2).
  4. Следите за точностью реквизитов в конфигураторе. Числовые поля, предназначенные для хранения сумм и цен, должны иметь точность не менее 2 знаков после запятой.
  5. При использовании функции Окр() всегда явно указывайте третий параметр в значении 1, если вам требуется классическое математическое округление.
← На главную