При работе с обменом данными или формировании отчетов в формате XML для их последующего анализа в Microsoft Excel программисты 1С часто сталкиваются с досадной проблемой: часть дат в таблице отображается корректно, а часть — как обычный текст. Это делает невозможным использование фильтров по датам, сортировку и применение формул без предварительной ручной обработки данных. В этой статье мы подробно разберем, почему так происходит и как программно обеспечить корректное распознавание типов данных в Excel.
Разберем ситуацию, когда мы открываем «сырой» XML-файл напрямую через Excel (правой кнопкой мыши — «Открыть с помощью»). В этом случае Excel не имеет четких инструкций о том, какой тип данных содержится в том или ином атрибуте. Чтобы построить таблицу, программа использует внутренний алгоритм Type Guessing (угадывание типа).
Проанализируем, как работает этот алгоритм. Excel сканирует первые строки файла (обычно от 8 до 16 записей), чтобы определить формат каждой колонки. Рассмотрим пример структуры атрибута:
Fact_Date="2013-01-03T00:00:00"
Если в первой же строке Excel видит такое значение, он понимает, что перед ним стандарт ISO 8601, и помечает колонку как «Дата». Однако, как только в одной из первых строк встречается пустое значение атрибута вида Fact_Date="", логика Excel ломается. Пустые кавычки интерпретируются как пустая текстовая строка. Согласно правилам типизации, если в колонке есть хотя бы одно текстовое значение среди дат, вся колонка целиком приводится к текстовому формату для сохранения целостности данных. Именно поэтому последующие корректные даты перестают распознаваться как числа.
Самый простой и эффективный способ, предложенный в ходе обсуждения проблемы, — это изменение алгоритма формирования XML. Вместо того чтобы выводить атрибут с пустым значением, его нужно просто не записывать в файл, если дата не заполнена.
Посмотрим на пример кода, который вызывает проблему:
// Опасный вариант: всегда записываем атрибут
ЗаписьXML.ЗаписатьАтрибут("Fact_Date", Формат(Выборка.ДатаФакта, "ДФ=yyyy-MM-ddTHH:mm:ss"));
Если Выборка.ДатаФакта будет пустой, в XML попадет Fact_Date="". Теперь проанализируем правильный подход. Мы должны добавить проверку на заполненность значения перед вызовом метода ЗаписатьАтрибут:
// Безопасный вариант: записываем атрибут только при наличии данных
Если ЗначениеЗаполнено(Выборка.ДатаФакта) Тогда
// Используем формат ISO 8601, который Excel понимает лучше всего
ТекстДаты = Формат(Выборка.ДатаФакта, "ДФ=yyyy-MM-ddTHH:mm:ss");
ЗаписьXML.ЗаписатьАтрибут("Fact_Date", ТекстДаты);
КонецЕсли;
В этом случае, если дата отсутствует, Excel просто перейдет к анализу следующей строки. Как только он встретит заполненный атрибут в одной из следующих записей, он успешно определит тип данных как «Дата» для всего столбца.
Если нам необходимо гарантировать 100% результат вне зависимости от наличия данных в первых строках, следует использовать схему XSD. Схема — это «паспорт» XML-файла, в котором жестко прописаны типы для каждого поля.
Выясним, как это работает. В файле схемы для поля Fact_Date указывается тип xsd:dateTime. При открытии файла Excel сначала читает схему, видит указание типа и принудительно преобразует значения, даже если они встречаются редко или разделены пропусками. Это наиболее профессиональный метод интеграции, хотя он и требует создания дополнительного файла описания.
Если ваша задача — сформировать файл специально для Excel из 1С, рассмотрим альтернативу в виде формата XML Spreadsheet 2003. Этот формат позволяет внедрять метаданные о типах прямо в структуру ячеек.
Проанализируем структуру такой записи:
<Cell>
<Data ss:Type="DateTime">2013-01-03T00:00:00.000</Data>
</Cell>
Использование атрибута ss:Type="DateTime" снимает все вопросы с «угадыванием». Программа 1С может формировать такие файлы с помощью объекта ТекстовыйДокумент или через построитель отчета, что обеспечит идеальное открытие в Excel без потери типизации.
Стоит обратить внимание на символ T в строке даты: 2013-01-03T00:00:00. Это не ошибка и не «мусор», а стандартный разделитель между датой и временем в XML. Рассмотрим несколько моментов:
Z или смещениями вида +03:00. Старые версии Excel часто воспринимают даты с указанием часового пояса исключительно как текст.Если вы являетесь пользователем, который получает такие файлы, и не можете изменить код выгрузки в 1С, рекомендуем использовать механизм Power Query (вкладка «Данные» — «Получить данные из файла» — «Из XML»).
В редакторе Power Query мы можем самостоятельно назначить тип данных для любого столбца одним кликом. Это гораздо надежнее, чем простое открытие файла, так как Power Query корректно обрабатывает пустые значения (заменяя их на null), не превращая при этом всю колонку в текст.
Подведем итог: Чтобы Excel не капризничал при чтении дат из XML, программисту 1С следует либо полностью исключать пустые атрибуты из выгрузки, либо использовать строгое типизирование через XSD-схемы или специализированные форматы Microsoft XML.