При стандартной выгрузке табличных документов из платформы 1С:Предприятие в формат Microsoft Excel разработчики часто сталкиваются с неприятной особенностью: все ячейки в созданном файле получают формат «Общий». Это приводит к тому, что числа теряют свою точность, пропадают разделители триад, а даты превращаются в нечитаемый текст. Открывать файл программно через COM-объект и форматировать его «на лету» — медленный и устаревший подход, который к тому же не работает под операционными системами Linux.
В этой статье мы подробно разберем, как заставить платформу 1С передавать правильные типы данных в Excel штатными средствами, а также рассмотрим неочевидные нюансы платформы и современные альтернативные методы.
Выясним причину, почему Excel игнорирует форматирование 1С при обычном сохранении. По умолчанию ячейки табличного документа содержат просто текст. Чтобы платформа поняла, что в ячейке находится именно число, нам нужно явно указать его тип в свойствах ячейки макета.
Разберем по шагам, как это сделать в конфигураторе:
СодержитЗначение) и установим для него флаг в положение Истина.Число. При необходимости здесь же можно настроить длину и точность (например, 15 знаков всего и 2 знака после запятой).После выполнения этих простых настроек при обычном интерактивном сохранении («Файл» — «Сохранить как...») или при программной записи табличного документа платформа автоматически сопоставит типы, и Excel отобразит полноценный числовой формат ячеек.
Что делать, если табличный документ формируется полностью программно, без использования готового интерактивного макета? Проанализируем ситуацию. В этом случае мы можем управлять свойствами типизации ячеек напрямую из программного кода 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, выполните следующие шаги:
СодержитЗначение = Истина.Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Лево.'). Сам символ в Excel отображаться не будет, но заставит программу интерпретировать всю ячейку как текст: Область.Значение = "'" + СтрокаЗначения;.Использование COM-объекта Excel.Application для пост-обработки файлов сильно замедляет работу системы и категорически не рекомендуется для серверных вызовов (особенно под управлением Linux, где COM-технология не поддерживается на уровне ядра).
В качестве современной альтернативы разработчики используют:
.xlsx представляет собой zip-архив с набором XML-файлов. Платформа позволяет распаковать полученный файл через ЧтениеZipФайла, точечно отредактировать XML со стилями (styles.xml) и собрать архив обратно через ЗаписьZipФайла.Мы подробно разобрали, как штатные механизмы 1С позволяют управлять типами данных при экспорте. Использование свойства СодержитЗначение в сочетании с правильным выравниванием позволяет решить 95% задач по форматированию колонок в Excel без привлечения сторонних инструментов.