Как сохранить ведущие нули при загрузке строк из Excel в 1С?

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

При загрузке данных из сторонних файлов Excel в 1С разработчики часто сталкиваются с ситуацией, когда текстовые значения, состоящие только из цифр (например, артикулы, штрихкоды или коды номенклатуры вида "034178"), превращаются в обычные числа. В результате ведущие нули теряются, и в систему попадает значение 34178, что приводит к ошибкам сопоставления справочников.

Рассмотрим подробнее причины возникновения этой проблемы, разберем базовое решение с помощью средств OLE/COM, а также изучим альтернативные способы корректной обработки данных.

Выясним причину потери нулей

Проанализируем, почему стандартный код формата СокрЛП(Строка(Excel.Cells(i, j).Value)) приводит к усечению нулей. При обращении к свойству Value ячейки Excel через COM-соединение передается внутреннее значение ячейки в типе Variant. Если содержимое выглядит как число или к ячейке применен пользовательский формат отображения, Excel передает значение именно в числовом типе.

Таким образом, отбрасывание нулей происходит на стороне Excel еще до момента передачи данных в 1С. Функция 1С Строка() получает на вход уже сформированное число без нулей и лишь преобразует его обратно в строковый тип.

Использование свойства Text вместо Value

Для решения этой проблемы заменим обращение к свойству Value на свойство Text. Свойство Text возвращает отображаемое текстовое представление ячейки ровно в том виде, в котором оно отображается на экране пользователю.

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


// Вместо: Значение = СокрЛП(Строка(Excel.Cells(i, j).Value));
// Используем свойство Text:
Значение = СокрЛП(Excel.Cells(i, j).Text);

При таком подходе значение с ведущими нулями извлекается как полноценная строка без предварительного преобразования в число.

Особенности и ограничения применения свойства Text

Несмотря на простоту решения, при работе со свойством Text важно учитывать следующие нюансы:

  1. Зависимость от ширины колонки: Свойство Text считывает визуальное представление. Если колонка в листе Excel слишком узкая и вместо числа отображаются символы "###", свойство Text вернет именно строку "###".
  2. Форматирование и локализация: Свойство возвращает данные с учетом текущего форматирования Excel (разделители тысяч, знаки валют, национальные форматы дат). В некоторых случаях это требует дополнительной очистки строки в 1С.
  3. Скорость выполнения: Поячеечный обход таблицы с обращением к .Cells(i, j).Text в больших файлах работает медленнее, чем прямое чтение значений.

Способ 1. Восстановление нулей средствами 1С

Если длина артикула или кода строго фиксирована (например, код всегда содержит ровно 6 знаков), потерянные нули можно восстановить алгоритмически прямо в коде 1С после считывания Value:


ЗначениеЧислом = СокрЛП(Строка(Excel.Cells(i, j).Value));
// Дополняем строку нулями слева до нужной длины
ЗначениеКода = Прав("000000" + ЗначениеЧислом, 6);

Способ 2. Предварительная подготовка файла Excel

Если есть возможность повлиять на исходный файл перед его загрузкой, проанализируем следующие варианты:

  1. Задать для всего столбца текстовый формат (символ @) до ввода данных.
  2. Установить перед значением одиночный апостроф (например, '034178). В этом случае Excel явным образом хранит значение как текст, и обращение к Value вернет строку с нулями.

Способ 3. Загрузка через ADO / OLEDB

При чтении больших файлов без визуального запуска Excel часто применяется подключение через ADODB. Чтобы драйвер OLEDB считывал столбцы с числовыми кодами как текст, в строке подключения указывается параметр IMEX=1:


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

Режим IMEX=1 заставляет драйвер интерпретировать смешанные данные в столбце как текст, что предотвращает потерю ведущих нулей.

← На главную