При автоматизации импорта данных из внешних файлов разработчики часто сталкиваются с неприятной особенностью: числа, которые в Excel выглядят как дробные (например, 4.68), при попадании в 1С внезапно превращаются в целые (например, 5). Это критично для таких документов, как «Табель учета рабочего времени» или «Индивидуальный график», где важна каждая минута отработанного времени. Рассмотрим подробно, почему это происходит и как обеспечить загрузку точных значений.
Основная причина проблемы кроется в том, как именно программный код 1С обращается к ячейке Excel. В объектной модели Excel существует несколько способов получить содержимое ячейки. Проанализируем ситуацию, когда используется свойство Text. Это свойство возвращает строковое представление того, что пользователь видит на экране. Если колонка в Excel слишком узкая, программа автоматически скрывает знаки после запятой или округляет число для корректного отображения в заданных границах.
Рассмотрим пример кода, который приводит к ошибке:
// Ошибочный вариант загрузки
ТекСотрудник = Excel.Cells(Строка1, 3).Text;
// Здесь в переменную попадет "5" вместо "4.68", если колонка узкая
Именно использование Text заставляет 1С имитировать поведение пользователя, «считывая» глазами округленное значение. Чтобы получить реальное число, хранящееся в памяти Excel, необходимо использовать другие свойства.
Для получения точного числового значения из ячейки через COM-соединение следует обращаться к свойству Value. Оно возвращает содержимое ячейки в исходном виде, независимо от ширины колонки или установленного формата отображения (денежный, процентный и т.д.).
Разберем правильный подход к написанию кода:
// Правильный вариант с использованием Value
ЗначениеИзЯчейки = ЛистЭксель.Cells(НомерСтроки, НомерКолонки).Value;
Однако опытные разработчики рекомендуют пойти еще дальше и использовать Value2. Давайте проанализируем, в чем разница:
Value: Пытается распознать формат ячейки. Если в Excel установлен формат «Дата» или «Денежный», 1С может попытаться преобразовать значение во внутренний тип данных, что иногда приводит к неожиданным искажениям или замедлению работы.Value2: Работает с «чистыми» данными. Это свойство не учитывает форматы даты и валюты, передавая число как есть (даты передаются в виде количества дней с начала эпохи Excel). Это самый быстрый и надежный способ получения числовых данных.Пример использования Value2 для работы с диапазоном:
// Получение значения через Value2
Значение = ЛистЭксель.Range("C" + Формат(Строка1, "ЧГ=0")).Value2;
Иногда проблема кроется не в коде 1С, а в настройках самой книги Excel. В параметрах программы существует опция, которая может безвозвратно уничтожить точность ваших данных еще до начала загрузки. Посмотрим, как это проверить.
Перейдите в меню «Файл» -> «Параметры» -> «Дополнительно». Найдите раздел «При пересчете этой книги» и проверьте состояние флажка «Установить точность как на экране». Если этот флажок установлен, Excel при сохранении или изменении формата ячейки отсекает «лишние» знаки после запятой физически. В этом случае свойство Value не поможет, так как исходное число уже округлено самим файлом. Для корректной работы этот чекбокс должен быть снят.
Если вы не используете COM-объект Excel.Application, а загружаете файл стандартным методом 1С ТабличныйДокумент.Прочитать(), вы сталкиваетесь с «врожденной» особенностью платформы. Метод Прочитать часто ведет себя аналогично свойству Text: он считывает визуальный слой.
Чтобы избежать округления при таком способе, проанализируем следующие рекомендации:
.xls (Excel 97-2003), убедитесь, что ширина всех колонок достаточна для отображения чисел целиком. Платформа 8.3 при чтении старых форматов крайне чувствительна к ширине столбцов..xlsx. Начиная с версии 8.3.10, 1С обрабатывает этот формат через парсинг внутреннего XML-кода файла, что снижает риск зависимости от визуальных настроек.Для профессиональной разработки, особенно при загрузке больших прайс-листов или табелей на тысячи сотрудников, рассмотрим метод 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С их можно легко преобразовать в число с помощью функции Число().
Важно помнить, что COM-объекты (Excel.Application) работают только в операционной системе Windows. Если ваш сервер 1С работает под управлением Linux, вы не сможете использовать Excel.Application. В этом случае единственным надежным способом получить неокругленные данные является прямое чтение файла .xlsx как ZIP-архива.
Файл .xlsx внутри состоит из XML-документов. Значения ячеек хранятся в тегах <v> (value). Платформа 1С может программно распаковать этот архив и прочитать XML-данные. Это самый «чистый» способ, так как в XML всегда записывается полное число, которое ввел пользователь, независимо от масок отображения и ширины колонок.
Для надежной загрузки данных из Excel в 1С без потери точности:
.Value или .Value2 вместо .Text при работе через COM.ТабличныйДокумент.Прочитать() отдавайте предпочтение формату .xlsx и проверяйте форматирование ячеек.