Почему 1С загружает из Excel округленные числа и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом
← На главную

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

Выясняем причину: разница между визуальным представлением и данными

Основная причина проблемы кроется в том, как именно программный код 1С обращается к ячейке Excel. В объектной модели Excel существует несколько способов получить содержимое ячейки. Проанализируем ситуацию, когда используется свойство Text. Это свойство возвращает строковое представление того, что пользователь видит на экране. Если колонка в Excel слишком узкая, программа автоматически скрывает знаки после запятой или округляет число для корректного отображения в заданных границах.

Рассмотрим пример кода, который приводит к ошибке:


// Ошибочный вариант загрузки
ТекСотрудник = Excel.Cells(Строка1, 3).Text; 
// Здесь в переменную попадет "5" вместо "4.68", если колонка узкая

Именно использование Text заставляет 1С имитировать поведение пользователя, «считывая» глазами округленное значение. Чтобы получить реальное число, хранящееся в памяти Excel, необходимо использовать другие свойства.

Решение №1: Использование свойства Value и Value2

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

Разберем правильный подход к написанию кода:


// Правильный вариант с использованием Value
ЗначениеИзЯчейки = ЛистЭксель.Cells(НомерСтроки, НомерКолонки).Value;

Однако опытные разработчики рекомендуют пойти еще дальше и использовать Value2. Давайте проанализируем, в чем разница:

Пример использования Value2 для работы с диапазоном:


// Получение значения через Value2
Значение = ЛистЭксель.Range("C" + Формат(Строка1, "ЧГ=0")).Value2;

Решение №2: Настройка точности в самом Excel

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

Перейдите в меню «Файл» -> «Параметры» -> «Дополнительно». Найдите раздел «При пересчете этой книги» и проверьте состояние флажка «Установить точность как на экране». Если этот флажок установлен, Excel при сохранении или изменении формата ячейки отсекает «лишние» знаки после запятой физически. В этом случае свойство Value не поможет, так как исходное число уже округлено самим файлом. Для корректной работы этот чекбокс должен быть снят.

Решение №3: Особенности метода ТабличныйДокумент.Прочитать

Если вы не используете COM-объект Excel.Application, а загружаете файл стандартным методом 1С ТабличныйДокумент.Прочитать(), вы сталкиваетесь с «врожденной» особенностью платформы. Метод Прочитать часто ведет себя аналогично свойству Text: он считывает визуальный слой.

Чтобы избежать округления при таком способе, проанализируем следующие рекомендации:

  1. Перед загрузкой убедитесь, что в файле Excel для всех числовых колонок установлен формат «Общий» или «Числовой» с достаточным количеством знаков после запятой.
  2. Если файл имеет старый формат .xls (Excel 97-2003), убедитесь, что ширина всех колонок достаточна для отображения чисел целиком. Платформа 8.3 при чтении старых форматов крайне чувствительна к ширине столбцов.
  3. По возможности используйте формат .xlsx. Начиная с версии 8.3.10, 1С обрабатывает этот формат через парсинг внутреннего XML-кода файла, что снижает риск зависимости от визуальных настроек.

Альтернативный метод: Загрузка через ADO (ActiveX Data Objects)

Для профессиональной разработки, особенно при загрузке больших прайс-листов или табелей на тысячи сотрудников, рассмотрим метод ADO. Он позволяет работать с Excel-файлом как с базой данных через SQL-запросы. Этот способ исключает влияние графического интерфейса Excel.

Пример строки подключения:


// Строка подключения через OLEDB
СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ПутьКФайлу + ";Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";";

Обратите внимание на параметр IMEX=1. Он заставляет драйвер считывать данные в текстовом формате. Это гарантирует, что числа не будут округлены или превращены в экспоненциальную запись (типа 1.2E+7). После получения данных в 1С их можно легко преобразовать в число с помощью функции Число().

Работа в серверном окружении на Linux

Важно помнить, что COM-объекты (Excel.Application) работают только в операционной системе Windows. Если ваш сервер 1С работает под управлением Linux, вы не сможете использовать Excel.Application. В этом случае единственным надежным способом получить неокругленные данные является прямое чтение файла .xlsx как ZIP-архива.

Файл .xlsx внутри состоит из XML-документов. Значения ячеек хранятся в тегах <v> (value). Платформа 1С может программно распаковать этот архив и прочитать XML-данные. Это самый «чистый» способ, так как в XML всегда записывается полное число, которое ввел пользователь, независимо от масок отображения и ширины колонок.

Подведем итоги

Для надежной загрузки данных из Excel в 1С без потери точности:

← На главную