Как выгрузить данные из 1С в Excel с сохранением числового формата ячеек?

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

При стандартной выгрузке табличных документов из платформы 1С:Предприятие в формат Microsoft Excel разработчики часто сталкиваются с неприятной особенностью: все ячейки в созданном файле получают формат «Общий». Это приводит к тому, что числа теряют свою точность, пропадают разделители триад, а даты превращаются в нечитаемый текст. Открывать файл программно через COM-объект и форматировать его «на лету» — медленный и устаревший подход, который к тому же не работает под операционными системами Linux.

В этой статье мы подробно разберем, как заставить платформу 1С передавать правильные типы данных в Excel штатными средствами, а также рассмотрим неочевидные нюансы платформы и современные альтернативные методы.

Способ 1. Интерактивная настройка макета табличного документа

Выясним причину, почему Excel игнорирует форматирование 1С при обычном сохранении. По умолчанию ячейки табличного документа содержат просто текст. Чтобы платформа поняла, что в ячейке находится именно число, нам нужно явно указать его тип в свойствах ячейки макета.

Разберем по шагам, как это сделать в конфигураторе:

  1. Откроем макет нашего отчета или обработки, в котором формируется печатная форма.
  2. Выделим ячейку (или область ячеек), в которую выводятся числовые данные.
  3. Откроем палитру свойств ячейки (клавиша F4).
  4. Найдем свойство «Содержит значение» (в коде это соответствует свойству СодержитЗначение) и установим для него флаг в положение Истина.
  5. В появившемся поле «Тип значения» нажмем на кнопку выбора и укажем тип данных Число. При необходимости здесь же можно настроить длину и точность (например, 15 знаков всего и 2 знака после запятой).
  6. В свойстве «Формат» зададим желаемое отображение числа (например, использование разделителя групп).

После выполнения этих простых настроек при обычном интерактивном сохранении («Файл» — «Сохранить как...») или при программной записи табличного документа платформа автоматически сопоставит типы, и Excel отобразит полноценный числовой формат ячеек.

Способ 2. Программное управление типами ячеек в коде 1С

Что делать, если табличный документ формируется полностью программно, без использования готового интерактивного макета? Проанализируем ситуацию. В этом случае мы можем управлять свойствами типизации ячеек напрямую из программного кода 1С.

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


// Создаем новый табличный документ
ТабДок = Новый ТабличныйДокумент;

// Получаем область ячеек (например, одну ячейку R1C1)
Область = ТабДок.Область("R1C1:R1C1");

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

// Указываем тип данных "Число" с точностью до 2 знаков после запятой
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("Число"));
КвалификаторыЧисла = Новый КвалификаторыЧисла(15, 2);
ОписаниеТипаЧисла = Новый ОписаниеТипов(МассивТипов, , КвалификаторыЧисла);

Область.ТипЗначения = ОписаниеТипаЧисла;

// Передаем данные ОБЯЗАТЕЛЬНО в свойство Значение, а не Текст
Область.Значение = 125.50;

// Задаем формат отображения в 1С (этот формат также перенесется в Excel)
Область.Формат = "ЧЦ=15; ЧДЦ=2; ЧГ=3";

// Сохраняем табличный документ в формате XLSX
ТабДок.Записать("C:\temp\ВыгрузкаДанных.xlsx", ТипФайлаТабличногоДокумента.XLSX);

Важное правило: При заполнении ячеек данными в коде всегда присваивайте числовые данные свойству Значение. Если записать число в свойство Текст, то платформа выгрузит его в Excel как обычную текстовую строку, проигнорировав настройки типа.

Влияние горизонтального выравнивания на распознавание типов

Рассмотрим неочевидный нюанс работы платформы 1С, который часто ставит в тупик даже опытных разработчиков. У платформы есть задокументированная особенность автоматического распознавания типов при конвертации в форматы Excel:

Данные в ячейке распознаются как число в Microsoft Excel только в том случае, если для ячейки установлено горизонтальное выравнивание «Вправо».

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

Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Право;

Как решить проблему выгрузки Дат?

Если с числами свойство СодержитЗначение работает стабильно, то при попытке выгрузить дату стандартными средствами 1С (даже с указанием типа Дата), Excel очень часто все равно распознает её как текст или формат «Общий».

Посмотрим на примеры решения этой проблемы:

Вариант А. Трюк с автозаменой точек через COM-соединение. Если вы все же используете COM-объект на Windows-клиенте, можно применить красивый трюк. После сохранения файла стандартным методом 1С программно открывается объект Excel, и в нем выполняется замена точки на точку. Это заставляет Excel принудительно пересчитать формат ячейки и преобразовать текст в реальную дату:


// Пример кода для COM-соединения
Excel = Новый COMОбъект("Excel.Application");
Книга = Excel.Workbooks.Open("C:\temp\ВыгрузкаДанных.xlsx");
Лист = Книга.Sheets(1);

// Заменяет точку на точку, после чего Excel автоматически парсит Дату
Лист.Cells.Replace(".", "."); 

Книга.Save();
Excel.Quit();

Вариант Б. Перевод даты в числовой стандарт Excel. Внутренний формат хранения дат в Excel — это число дней, прошедших с 1 января 1900 года. Вы можете перевести дату 1С в это число, записать его в ячейку с флагом СодержитЗначение = Истина и типом Число, а затем наложить числовой формат даты средствами 1С.

Обратная задача: сохранение ведущих нулей (штрихкоды и артикулы)

Иногда требуется обратное: сделать так, чтобы числовое значение сохранилось строго как текст (например, артикулы или штрихкоды вида "000145" или длинные номера счетов). Если выгрузить их просто так, Excel удалит ведущие нули и превратит строку в число 145.

Чтобы принудительно задать текстовый формат ячейки в Excel, выполните следующие шаги:

  1. Установите ячейке тип значения «Строка» через свойство СодержитЗначение = Истина.
  2. Установите для ячейки горизонтальное выравнивание по левому краю: Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Лево.
  3. В крайнем случае, к выгружаемой строке в начале принудительно добавляют символ апострофа ('). Сам символ в Excel отображаться не будет, но заставит программу интерпретировать всю ячейку как текст: Область.Значение = "'" + СтрокаЗначения;.

Современные альтернативы COM-соединению

Использование COM-объекта Excel.Application для пост-обработки файлов сильно замедляет работу системы и категорически не рекомендуется для серверных вызовов (особенно под управлением Linux, где COM-технология не поддерживается на уровне ядра).

В качестве современной альтернативы разработчики используют:

Мы подробно разобрали, как штатные механизмы 1С позволяют управлять типами данных при экспорте. Использование свойства СодержитЗначение в сочетании с правильным выравниванием позволяет решить 95% задач по форматированию колонок в Excel без привлечения сторонних инструментов.

← На главную