При выгрузке отчетов, прайс-листов или накладных из 1С в формат Excel разработчики часто сталкиваются с неприятной особенностью: числовые строки, содержащие лидирующие нули (например, артикулы типа 001236 или штрихкоды 000000123456), автоматически преобразуются процессором таблиц Microsoft Excel в обычные числа. В результате этого преобразования начальные нули бесследно исчезают, превращая артикул в число 1236. Это приводит к путанице у клиентов и ошибкам при поиске номенклатуры.
В этой статье мы подробно разберем, почему возникает эта проблема, и проанализируем самые эффективные методы ее решения — от простых настроек в запросе до работы на уровне структуры ZIP-архива XLSX-файла.
Когда мы сохраняем стандартный табличный документ 1С (макет формата MXL) в формате XLS (Excel 97–2003), платформа использует устаревший бинарный формат данных. Microsoft Excel при открытии такого файла пытается самостоятельно угадать тип данных в каждой ячейке. Если ячейка содержит только цифры, Excel агрессивно преобразует ее в числовой формат, отсекая все нули слева.
Давайте вместе разберем несколько способов, которые помогут гарантированно сохранить текстовое представление числовых данных при программной выгрузке.
Самый правильный и надежный способ управления типами данных при выгрузке без использования COM-соединений и внешних библиотек — это явное указание типа значения для конкретных ячеек в самом табличном документе перед сохранением.
Если мы сообщим платформе 1С, что конкретная ячейка должна содержать строку, при записи в современный XML-формат (XLSX) платформа жестко пропишет строковый тип данных в структуре файла. Excel при открытии такого документа не будет пытаться автоформатировать ячейку в число.
Рассмотрим пример кода, реализующий этот подход:
// Создаем или получаем табличный документ
ТабДок = Новый ТабличныйДокумент;
// Заполняем область данными
ОбластьЯчейки = ТабДок.Область("R1C1");
ОбластьЯчейки.Текст = "001236";
// Включаем признак того, что ячейка хранит типизированное значение
ОбластьЯчейки.СодержитЗначение = Истина;
// Явно задаем тип значения как Строка
ОбластьЯчейки.ТипЗначения = Новый ОписаниеТипов("Строка");
// Заполняем свойство Значение строковыми данными
ОбластьЯчейки.Значение = "001236";
// Сохраняем строго в формат XLSX
ТабДок.Записать("C:\Temp\Выгрузка.xlsx", ТипФайлаТабличногоДокумента.XLSX);
Важный нюанс: Обратите внимание, что мы заполняем не только свойство Текст, но и свойство Значение ячейки. Только при такой комбинации свойств платформа корректно перенесет текстовый тип в файл XLSX.
Если вам не хочется переписывать логику вывода ячеек в табличном документе или выгрузка формируется автоматически через СКД (Систему компоновки данных), можно воспользоваться классическим "лайфхаком" самого Excel. Если перед числовой строкой поставить символ одиночной кавычки (апострофа) ', Excel автоматически воспримет содержимое ячейки как текст и не будет удалять нули.
Для реализации этого метода непосредственно в тексте запроса можно использовать конструкцию ВЫБОР. Разберем этот пример подробнее:
ВЫБРАТЬ
спрНоменклатура.Ссылка КАК Номенклатура,
ВЫБОР
КОГДА ПОДСТРОКА(спрНоменклатура.Артикул, 1, 1) = "0"
ТОГДА "'" + спрНоменклатура.Артикул
ИНАЧЕ спрНоменклатура.Артикул
КОНЕЦ КАК АртикулТекст
ИЗ
Справочник.Номенклатура КАК спрНоменклатура
В данном случае мы анализируем первый символ артикула. Если это ноль, мы принудительно добавляем апостроф в начало строки. В самом Excel этот апостроф будет скрыт в режиме просмотра, но при редактировании ячейки или программном чтении файла он будет присутствовать, что является компромиссным решением.
В случаях, когда необходимо выгружать огромные файлы со сложным форматированием и при этом избежать использования тяжелого и медленного механизма COM-соединения (Excel.Application), лучшим решением будет использование открытых библиотек для прямой генерации структуры XLSX-файла.
Среди разработчиков популярна библиотека NativeXLSX. Ее суть заключается в том, что она программно формирует файлы XLSX "на лету" на основе XML-спецификаций Microsoft Open XML. Это дает следующие преимущества:
Для решения сложных задач, когда файл XLSX уже сохранен стандартным механизмом 1С, но форматы сбились, можно выполнить его постобработку. Поскольку файл .xlsx представляет собой обычный ZIP-архив, содержащий XML-структуру таблиц, мы можем изменить свойства ячеек напрямую.
Проанализируем шаги алгоритма для реализации такого решения:
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX).ЧтениеZipФайла.ЧтениеXML находим нужные листы (например, XML-файл xl/worksheets/sheet1.xml).<c>, соответствующие нашим колонкам с артикулами, и принудительно прописываем им атрибут текстового формата t="s" (Shared String) или связываем их со строковыми стилями в файле xl/styles.xml.ЗаписьZipФайла упаковываем файлы обратно в архив и переименовываем его в .xlsx.Этот способ требует от разработчика понимания структуры XML Open Office, но гарантирует стопроцентное решение проблемы со сбросом форматов в любых сложных файлах и работает со сверхвысокой скоростью.