Часто при разработке интеграций и загрузок мы сталкиваемся с необходимостью прочитать данные из файлов Excel в 1С. Однако использование стандартного механизма платформы может преподнести неприятные сюрпризы. Рассмотрим ситуацию: вы загружаете выгруженную бухгалтерскую отчетность (например, баланс) и читаете табличный документ в режиме текста. Вместо ожидаемых положительных чисел или нулей в ячейках появляются странные артефакты: -(75)74682, -0 или даже -7 (хотя в исходном файле была просто цифра 7). Давайте подробно проанализируем причину такого поведения и разберем по шагам надежные способы решения этой задачи.
Проблема кроется во внутреннем парсере платформы 1С. Когда мы используем параметр СпособЧтенияЗначенийТабличногоДокумента.Текст, система пытается самостоятельно интерпретировать и применить сложные маски форматов ячеек Excel к получаемым данным.
В бухгалтерских файлах часто применяются специфические форматы. Посмотрим на пример маски: [=0]"-";Основной. Этот формат указывает Excel выводить прочерк, если значение равно нулю. Однако внутренний алгоритм 1С обрабатывает такие сложные бухгалтерские маски некорректно. Из-за этого платформа может выводить в результирующую ячейку настоящую «кашу», склеивая служебные символы маски (например, дефисы), форматированное представление значения (в скобках) и само исходное сырое значение ячейки. В результате мы получаем искаженные данные, непригодные для дальнейшей обработки.
Чтобы обойти проблему искажения форматов, откажемся от текстового режима и прочитаем файл как значения. Разберем отличный и лаконичный метод загрузки данных, который перекладывает сырые значения ячеек напрямую в таблицу значений 1С с помощью объекта ПостроительОтчета (или ПостроительЗапроса).
Проанализируем следующий пример кода:
ТабличныйДокумент = Новый ТабличныйДокумент;
// Читаем файл в режиме Значение, чтобы избежать багов с текстом
ТабличныйДокумент.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
УдалитьФайлы(ИмяВременногоФайла);
Построитель = Новый ПостроительОтчета;
НомерСтроки = 1;
// Передаем область табличного документа как источник данных
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область(НомерСтроки, 1, ТабличныйДокумент.ВысотаТаблицы, ТабличныйДокумент.ШиринаТаблицы));
Построитель.Выполнить();
// Выгружаем готовый результат в Таблицу Значений
РезультатЧтения = Построитель.Результат.Выгрузить();
Почему этот код работает лучше? Использование объекта ОписаниеИсточникаДанных позволяет платформе 1С быстро извлечь сырые, неформатированные значения ячеек из области табличного документа. Мы минуем этап текстовой интерпретации масок Excel, получая точные числовые значения. Для получения готового решения по чтению листов книги в таблицу значений можно воспользоваться универсальной обработкой для загрузки файлов Excel и CSV.
Если мы переходим на режим СпособЧтенияЗначенийТабличногоДокумента.Значение, важно учитывать одну особенность Excel. В этой программе даты физически хранятся не как привычные нам строки (например, 31.12.2023), а как числа с плавающей точкой. Это число означает количество дней, прошедших с 1 января 1900 года.
При чтении файла 1С часто получает именно это сырое число (например, 45200). Если вы столкнулись с таким «глюком», вам потребуется написать функцию постобработки: необходимо проверять тип полученного значения, и если колонка должна содержать дату, программно прибавлять полученное количество дней к дате 01.01.1900 (с поправкой на високосный 1900 год, который Excel считает високосным из-за обратной совместимости с Lotus 1-2-3).
Если стандартный ТабличныйДокумент продолжает доставлять проблемы, рассмотрим альтернативные методы интеграции, которые зарекомендовали себя в сообществе разработчиков:
Новый COMОбъект("Excel.Application"). Позволяет обращаться напрямую к объектной модели Excel, считывая свойства Value (сырое значение) или Text (текстовое представление). Требует установленного Excel на машине, где выполняется код..xlsx по своей сути является zip-архивом, содержащим набор XML-файлов. Мы можем средствами 1С распаковать этот архив и прочитать структуру XML (например, файл sharedStrings.xml и листы sheet1.xml). Этот метод работает молниеносно на серверах Linux и полностью исключает платформенные баги 1С.В случаях, когда мы не можем изменить логику загрузки в 1С (например, используется типовая или закрытая обработка стороннего вендора), мы можем решить проблему на стороне самого файла. Проанализируем возможные варианты:
Можно использовать скрипты (например, VBScript или макросы VBA), которые перед загрузкой автоматически открывают файл, выделяют все ячейки и принудительно устанавливают им формат «Общий» или числовой формат без сложных масок. Также, если файлы обрабатываются вручную, достаточно выделить нужные колонки в самом Excel, сменить формат ячеек на базовый и пересохранить документ перед отправкой в 1С. Для устранения недостатков форматирования непосредственно в таблицах пригодится надстройка для коррекции данных в Excel.
Вместе мы разобрали природу искажения чисел при загрузке табличных документов и рассмотрели несколько рабочих подходов. Рекомендуем в первую очередь использовать чтение в режиме значений в связке с Построителем отчета — это наиболее "чистый" подход, не требующий внешних библиотек и компонентов.