При загрузке данных из сторонних файлов Excel в 1С разработчики часто сталкиваются с ситуацией, когда текстовые значения, состоящие только из цифр (например, артикулы, штрихкоды или коды номенклатуры вида "034178"), превращаются в обычные числа. В результате ведущие нули теряются, и в систему попадает значение 34178, что приводит к ошибкам сопоставления справочников.
Рассмотрим подробнее причины возникновения этой проблемы, разберем базовое решение с помощью средств OLE/COM, а также изучим альтернативные способы корректной обработки данных.
Проанализируем, почему стандартный код формата СокрЛП(Строка(Excel.Cells(i, j).Value)) приводит к усечению нулей. При обращении к свойству Value ячейки Excel через COM-соединение передается внутреннее значение ячейки в типе Variant. Если содержимое выглядит как число или к ячейке применен пользовательский формат отображения, Excel передает значение именно в числовом типе.
Таким образом, отбрасывание нулей происходит на стороне Excel еще до момента передачи данных в 1С. Функция 1С Строка() получает на вход уже сформированное число без нулей и лишь преобразует его обратно в строковый тип.
Для решения этой проблемы заменим обращение к свойству Value на свойство Text. Свойство Text возвращает отображаемое текстовое представление ячейки ровно в том виде, в котором оно отображается на экране пользователю.
Посмотрим на пример правильного извлечения текстовых данных из ячейки:
// Вместо: Значение = СокрЛП(Строка(Excel.Cells(i, j).Value));
// Используем свойство Text:
Значение = СокрЛП(Excel.Cells(i, j).Text);
При таком подходе значение с ведущими нулями извлекается как полноценная строка без предварительного преобразования в число.
Несмотря на простоту решения, при работе со свойством Text важно учитывать следующие нюансы:
Text считывает визуальное представление. Если колонка в листе Excel слишком узкая и вместо числа отображаются символы "###", свойство Text вернет именно строку "###"..Cells(i, j).Text в больших файлах работает медленнее, чем прямое чтение значений.Если длина артикула или кода строго фиксирована (например, код всегда содержит ровно 6 знаков), потерянные нули можно восстановить алгоритмически прямо в коде 1С после считывания Value:
ЗначениеЧислом = СокрЛП(Строка(Excel.Cells(i, j).Value));
// Дополняем строку нулями слева до нужной длины
ЗначениеКода = Прав("000000" + ЗначениеЧислом, 6);
Если есть возможность повлиять на исходный файл перед его загрузкой, проанализируем следующие варианты:
@) до ввода данных.'034178). В этом случае Excel явным образом хранит значение как текст, и обращение к Value вернет строку с нулями.При чтении больших файлов без визуального запуска 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 заставляет драйвер интерпретировать смешанные данные в столбце как текст, что предотвращает потерю ведущих нулей.