Как сохранить табличный документ из 1С в Excel с указанием типа ячейки (дата, число)

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При выгрузке отчетов или печатных форм, например, когда выполняется экспорт справочников в Excel, программисты часто сталкиваются с проблемой: все данные в итоговом файле имеют формат «Общий» (или текстовый). Если этот файл предназначен для человеческих глаз, проблема невелика. Однако, если Excel-файл должен загружаться в другую информационную систему (вам может пригодиться шаблон загрузки из excel), она может выдать ошибку, не обнаружив в колонке с датой именно тип данных Дата. Рассмотрим, как заставить 1С передавать типы данных корректно, чтобы обеспечить легкий обмен с MS Power BI (удобно через прямой коннектор из 1С в Power BI) или Excel.

Метод 1. Настройка свойств ячейки в Табличном документе (Рекомендуемый)

Этот способ отлично подходит для задачи сохранения данных табличных частей форм в Excel.

Самый правильный и современный способ заключается в том, чтобы подготовить ТабличныйДокумент еще до момента его сохранения на диск. Начиная с версии платформы 8.3, механизм экспорта в формат XLSX стал достаточно «умным», чтобы понимать типизированные значения, если они заданы в ячейках явно.

Проанализируем ситуацию: обычно мы выводим данные в ячейку как текст. Чтобы Excel распознал дату, нам нужно заполнить не только текст, но и специальное свойство Значение. Разберем по шагам, какие свойства ячейки (объекта ОбластьЯчеекТабличногоДокумента) за это отвечают:

  1. СодержитЗначение — необходимо установить в Истина. Это сигнализирует платформе, что в ячейке хранится не просто строковое представление, а типизированный объект.
  2. ТипЗначения — здесь нужно указать ОписаниеТипов. Например, для даты это будет Новый ОписаниеТипов("Дата").
  3. Значение — сюда мы передаем саму переменную типа Дата или Число. Важно: не используйте здесь функцию Формат(), так как она превращает данные в строку.
  4. Формат — это свойство определяет, как данные будут выглядеть в самой 1С и какой формат будет предложен Excel при экспорте.

Посмотрим на пример кода, который правильно подготавливает ячейку с датой:


// Выбираем область (одну ячейку или диапазон)
Область = ТабДок.Область(НомерСтроки, НомерКолонки);

// Указываем, что ячейка будет содержать типизированное значение
Область.СодержитЗначение = Истина;

// Назначаем тип данных (Дата)
Область.ТипЗначения = Новый ОписаниеТипов("Дата");

// Записываем саму дату (объект типа Дата)
Область.Значение = Выборка.ДатаДокумента;

// Устанавливаем формат отображения
Область.Формат = "ДФ=dd.MM.yyyy";

// Для того чтобы в Excel не было лишних пробелов или апострофов, 
// убедитесь, что параметр "Текст" не заполнен вручную
Область.Текст = ""; 

При сохранении такого документа через ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX), 1С запишет в XML-структуру файла Excel информацию о том, что это числовое представление даты с соответствующим маскированием. Сторонняя система увидит в ячейке полноценную дату.

Метод 2. Использование OLE/COM-объекта для изменения форматов после выгрузки

Если вы не можете изменить логику формирования табличного документа (например, это сложная типовая печатная форма), можно пойти по пути «постобработки» — для удобной настройки макетов есть редактор печатных форм и табличных документов. Мы сохраняем файл в 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) более предпочтительно.

Метод 3. Проблема «невидимого апострофа» и её решение

Выясним причину, по которой даже при использовании свойств Значение в Excel иногда появляется текстовое поле. Это происходит из-за того, что 1С принудительно ставит перед значением скрытый апостроф (символ '), чтобы Excel не пытался интерпретировать строку по-своему. Чтобы этого избежать при программном выводе:

Сравнение подходов

Рассмотрим, какой метод выбрать в зависимости от условий задачи:

  1. Скорость работы: Метод №1 (свойства ТабДока) работает в десятки раз быстрее, так как сохранение происходит штатными средствами платформы 1С без вызова внешних приложений.
  2. Кроссплатформенность: Метод №1 работает на сервере под управлением Linux, тогда как Метод №2 (COM-объект) требует исключительно ОС Windows и установленный MS Office.
  3. Гибкость: Метод №2 позволяет задавать очень специфические настройки Excel (группировки, закрепление областей, сложные условные форматирования), которые 1С не поддерживает напрямую.

Резюме: Для решения задачи интеграции с другими системами (когда важен именно тип данных «Дата») мы рекомендуем использовать Метод №1. Установка свойств СодержитЗначение, ТипЗначения и Значение гарантирует, что при сохранении в современный формат XLSX данные будут переданы как типизированные объекты, что и требуется для корректной загрузки во внешние системы — для автоматизации этого процесса есть автоматический экспорт из 1С в Excel и BI.

← На главную