Почему при чтении файла XLS в 1С число 2,3 превращается в 2,29999999999999?

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

При работе с файлами формата xls в среде 1С программисты часто сталкиваются с неприятным эффектом: точные десятичные числа, записанные в ячейках Excel, при считывании программным путем «обрастают» «хвостами» из девяток или других цифр. Давайте разберемся, почему это происходит и как с этим бороться.

Разбираем причины возникновения погрешности

Основная причина кроется в фундаментальном различии систем счисления и форматов хранения данных. В Excel для чисел используется тип данных float (число с плавающей запятой, стандарт IEEE 754), в то время как 1С для финансовых и количественных расчетов использует тип Decimal (число с фиксированной точкой).

Когда Excel сохраняет число, он не всегда записывает его точно так, как мы его видим. Число «2,3» внутри ячейки может храниться как «2,2999999999999998». Когда 1С обращается к этому значению через COM-объект или драйвер чтения, она получает именно это «сырое» двоичное приближение. Поскольку 1С ожидает точное значение, она транслирует эту погрешность в свою среду.

Как решить проблему чтения данных

Рассмотрим несколько стратегий, которые помогут избежать появления «грязных» чисел в вашей базе данных 1С.

Решение 1: Преобразование данных через строку

Один из самых надежных способов — считывать значение из ячейки Excel не как число, а как текст. Это позволяет отсечь внутренние механизмы хранения float и получить именно то визуальное представление, которое видит пользователь.

После того как мы получили строку, мы приводим её к нужному формату. Важно учитывать, что разделителем дробной части в Excel может выступать как запятая, так и точка, в зависимости от локальных настроек файла и системы.

Разберем пример кода для безопасного преобразования:


// Предположим, ЗначениеИзЯчейки мы получили как строку
// Сначала заменим возможные разделители на стандартную точку
СтрокаДляЧисла = СтрЗаменить(ЗначениеИзЯчейки, ",", ".");

// Преобразуем полученную строку в число
ЧисловоеЗначение = Число(СтрокаДляЧисла);

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

Решение 2: Использование свойства Text объекта ячейки

Если вы используете OLE/COM для работы с Excel, попробуйте при чтении обращаться не к свойству Value, а к свойству Text.

Свойство Text возвращает именно то значение, которое отображается в ячейке на экране. Если в Excel настроено отображение до двух знаков после запятой, Text вернет именно эту строку, очищенную от скрытых «хвостов» формата IEEE 754.

Решение 3: Округление при необходимости

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

Однако мы предостерегаем вас от огульного округления всех подряд значений. Внимательно проанализируйте бизнес-логику: если погрешность возникла на уровне хранения данных, то «лечение» результата — это лишь маскировка проблемы. Всегда старайтесь получать «чистые» данные на этапе импорта.

Советы по предотвращению ошибок при импорте

  1. Анализируйте тип источника: Если это возможно, старайтесь использовать современные библиотеки для работы с xlsx (формат OpenXML), которые позволяют считывать типы данных более строго, не полагаясь на COM-объекты.
  2. Учитывайте локализацию: Всегда уточняйте формат файла. Если вы получаете файлы от разных контрагентов, настройка разделителей «на лету» — это необходимый этап вашей обработки.
  3. Проверка данных: Всегда добавляйте логирование (запись в текстовый файл) тех значений, которые не удалось успешно преобразовать в число. Это позволит оперативно найти «битые» файлы в процессе загрузки.

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

← На главную