При выгрузке отчетов или печатных форм, например, когда выполняется экспорт справочников в Excel, программисты часто сталкиваются с проблемой: все данные в итоговом файле имеют формат «Общий» (или текстовый). Если этот файл предназначен для человеческих глаз, проблема невелика. Однако, если Excel-файл должен загружаться в другую информационную систему (вам может пригодиться шаблон загрузки из excel), она может выдать ошибку, не обнаружив в колонке с датой именно тип данных Дата. Рассмотрим, как заставить 1С передавать типы данных корректно, чтобы обеспечить легкий обмен с MS Power BI (удобно через прямой коннектор из 1С в Power BI) или Excel.
Этот способ отлично подходит для задачи сохранения данных табличных частей форм в Excel.
Самый правильный и современный способ заключается в том, чтобы подготовить ТабличныйДокумент еще до момента его сохранения на диск. Начиная с версии платформы 8.3, механизм экспорта в формат XLSX стал достаточно «умным», чтобы понимать типизированные значения, если они заданы в ячейках явно.
Проанализируем ситуацию: обычно мы выводим данные в ячейку как текст. Чтобы Excel распознал дату, нам нужно заполнить не только текст, но и специальное свойство Значение. Разберем по шагам, какие свойства ячейки (объекта ОбластьЯчеекТабличногоДокумента) за это отвечают:
Истина. Это сигнализирует платформе, что в ячейке хранится не просто строковое представление, а типизированный объект.ОписаниеТипов. Например, для даты это будет Новый ОписаниеТипов("Дата").Дата или Число. Важно: не используйте здесь функцию Формат(), так как она превращает данные в строку.Посмотрим на пример кода, который правильно подготавливает ячейку с датой:
// Выбираем область (одну ячейку или диапазон)
Область = ТабДок.Область(НомерСтроки, НомерКолонки);
// Указываем, что ячейка будет содержать типизированное значение
Область.СодержитЗначение = Истина;
// Назначаем тип данных (Дата)
Область.ТипЗначения = Новый ОписаниеТипов("Дата");
// Записываем саму дату (объект типа Дата)
Область.Значение = Выборка.ДатаДокумента;
// Устанавливаем формат отображения
Область.Формат = "ДФ=dd.MM.yyyy";
// Для того чтобы в Excel не было лишних пробелов или апострофов,
// убедитесь, что параметр "Текст" не заполнен вручную
Область.Текст = "";
При сохранении такого документа через ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX), 1С запишет в XML-структуру файла Excel информацию о том, что это числовое представление даты с соответствующим маскированием. Сторонняя система увидит в ячейке полноценную дату.
Если вы не можете изменить логику формирования табличного документа (например, это сложная типовая печатная форма), можно пойти по пути «постобработки» — для удобной настройки макетов есть редактор печатных форм и табличных документов. Мы сохраняем файл в Excel, затем программно открываем его и меняем формат нужных колонок.
Этот метод работает медленнее, так как требует наличия установленного Microsoft Excel на компьютере (сервере) и инициализации тяжелого COM-объекта — для выгрузки напрямую без сторонних программ есть утилита экспорта из 1С в Excel без Excel. Рассмотрим подробнее программный код:
// Сохраняем табличный документ во временный файл
ПутьКФайлу = "C:\Temp\Report.xlsx";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
// Инициализируем Excel
Попытка
Excel = Новый COMОбъект("Excel.Application");
Книга = Excel.Workbooks.Open(ПутьКФайлу);
Лист = Книга.Sheets(1);
Исключение
Сообщить("Ошибка при открытии Excel: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Указываем формат для конкретной колонки (например, колонки B)
// Формат "@" означает текстовый формат
// Формат "m/d/yyyy" или "dd.mm.yyyy" — формат даты
Лист.Columns("B:B").NumberFormat = "dd.mm.yyyy";
// Если нужно установить формат для конкретной ячейки
Лист.Cells(5, 2).NumberFormat = "# ##0,00"; // Числовой формат с разделителями
// Сохраняем изменения и закрываем
Excel.DisplayAlerts = Ложь; // Отключаем вопросы о перезаписи
Книга.Save();
Книга.Close();
Excel.Quit();
Проанализируем свойство NumberFormat. Оно принимает строку формата, идентичную той, которую вы видите в Excel в окне «Формат ячеек» -> «(все форматы)». Важный нюанс: коды форматов в COM-объекте часто зависят от локализации Windows, поэтому использование универсальных кодов (типа m/d/yyyy) более предпочтительно.
Выясним причину, по которой даже при использовании свойств Значение в Excel иногда появляется текстовое поле. Это происходит из-за того, что 1С принудительно ставит перед значением скрытый апостроф (символ '), чтобы Excel не пытался интерпретировать строку по-своему. Чтобы этого избежать при программном выводе:
ТипФайлаТабличногоДокумента.XLSX (не старый XLS).Рассмотрим, какой метод выбрать в зависимости от условий задачи:
Резюме: Для решения задачи интеграции с другими системами (когда важен именно тип данных «Дата») мы рекомендуем использовать Метод №1. Установка свойств СодержитЗначение, ТипЗначения и Значение гарантирует, что при сохранении в современный формат XLSX данные будут переданы как типизированные объекты, что и требуется для корректной загрузки во внешние системы — для автоматизации этого процесса есть автоматический экспорт из 1С в Excel и BI.