При выгрузке данных из 1С:Предприятия в формат Excel программисты часто сталкиваются с неприятной особенностью: числа в итоговом файле отображаются с «зеленым уголком», а Excel выдает предупреждение «Число сохранено как текст». Это не только портит внешний вид документа, но и блокирует возможность использования формул (например, автосуммы) без предварительного преобразования данных. В этой статье мы подробно разберем, почему так происходит, и как правильно настроить программный вывод данных, чтобы типы сохранялись корректно.
Рассмотрим ситуацию: у нас есть объект ТабличныйДокумент, который мы заполняем данными из таблицы значений или результата запроса. Мы используем стандартный метод Записать() с типом файла ТипФайлаТабличногоДокумента.XLS или XLSX. Несмотря на то, что в исходной таблице 1С значения имеют тип Число, в Excel они приходят как строки.
Проанализируем типичную ошибку. Многие пытаются исправить ситуацию уже после того, как таблица сформирована, проходя по ней циклом и устанавливая формат:
л_ТипЧисло = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3));
л_КоличествоКолонок = л_ТД.ШиринаТаблицы;
Для л_СчетчикСтрок = 2 по л_ТД.ВысотаТаблицы Цикл
Для л_СчетчикКолонок = 2 по л_КоличествоКолонок Цикл
л_Область = л_ТД.Область(л_СчетчикСтрок, л_СчетчикКолонок, л_СчетчикСтрок, л_СчетчикКолонок);
Если л_Область.СодержитЗначение Тогда
л_Область.ТипЗначения = л_ТипЧисло;
л_Область.Формат = "ЧРД=','; ЧН=''; ЧГ=''";
КонецЕсли;
КонецЦикла;
КонецЦикла;
Однако такой подход часто не дает результата. Выясним причину: если в момент записи значения в ячейку (через свойство Текст или Значение) система 1С уже определила тип ячейки как «строка», то последующее изменение ТипЗначения может не сработать для конвертера Excel. Нам нужно действовать превентивно.
Самый надежный способ гарантировать корректный экспорт — настраивать свойства ячейки непосредственно в процессе вывода данных. Мы должны сообщить табличному документу, что ячейка будет хранить не просто текст для отображения, а типизированное значение.
Разберем по шагам алгоритм правильного заполнения:
СодержитЗначение = Истина.ТипЗначения, используя объект ОписаниеТипов.Значение, а не в свойство Текст.Посмотрим на пример кода, который решает проблему при обходе таблицы значений (ТЗ):
// При обходе строк вашей таблицы значений
Для Каждого текСтрокаТЗ Из МояТаблицаЗначений Цикл
// Допустим, мы выводим данные в ОбластьТД
ОбластьТД = л_ТД.Область(ТекущаяСтрока, НомерКолонки);
// Проверяем тип данных в источнике
Если ТипЗнч(текСтрокаТЗ[ИмяКолонки]) = Тип("Число") Тогда
// Указываем, что ячейка содержит значение
ОбластьТД.СодержитЗначение = Истина;
// Явно задаем тип значения для ячейки
ОбластьТД.ТипЗначения = Новый ОписаниеТипов("Число");
// Записываем само число
ОбластьТД.Значение = текСтрокаТЗ[ИмяКолонки];
Иначе
ОбластьТД.Текст = Строка(текСтрокаТЗ[ИмяКолонки]);
КонецЕсли;
КонецЦикла;
Важный момент: Если вы используете макеты (.getTemplate / .ПолучитьМакет), лучше всего заранее настроить эти свойства в конфигураторе. В свойствах ячейки макета на закладке «Основные» установите флажок «Содержит значение» и выберите тип «Число». Тогда при программном заполнении через параметры или области свойства будут наследоваться автоматически.
Рассмотрим подробнее нюансы, которые могут повлиять на результат даже при правильном коде:
1. Использование современного формата XLSX.
Формат ТипФайлаТабличногоДокумента.XLS (старый Excel 97) крайне капризен к типам данных. Переход на ТипФайлаТабличногоДокумента.XLSX часто решает половину проблем с типизацией «из коробки», так как структура XML внутри файла более строго описывает типы ячеек.
2. Форматная строка и группировка разрядов.
Иногда визуальное представление числа в 1С мешает Excel. Если в 1С настроен формат с группировкой (например, 1 000 000 с пробелом), конвертер может ошибочно интерпретировать это как строку. Выясним, как это предотвратить: используйте параметр ЧГ=0 (отключение группировки) в свойстве Формат.
// Пример настройки формата для исключения пробелов-разделителей
ОбластьТД.Формат = "ЧГ=0";
3. Проблема разделителя дробной части.
В разных региональных настройках разделителем может быть точка или запятая. При использовании свойства Значение 1С передает число в универсальном формате, и Excel сам подставляет нужный разделитель согласно настройкам Windows пользователя. Но если вы попытаетесь передать число через свойство Текст, применив Формат(), вы зафиксируете разделитель, и Excel может его не узнать.
Проанализируем ситуацию, когда таблица очень большая (десятки тысяч строк). Поячеечный обход и установка ТипЗначения для каждой ячейки существенно замедлят формирование отчета.
Чтобы ускорить процесс, мы рекомендуем применять настройки к целым колонкам. Например:
// Установка типа данных сразу на всю колонку (если структура позволяет)
КолонкаСЧислами = л_ТД.Область(, 2, , 2); // Вторая колонка целиком
КолонкаСЧислами.СодержитЗначение = Истина;
КолонкаСЧислами.ТипЗначения = Новый ОписаниеТипов("Число");
Это позволит системе применить метаданные к большому блоку ячеек за одну операцию, что гораздо эффективнее, чем работа внутри вложенных циклов.
Таким образом, для безупречного сохранения чисел в Excel необходимо соблюдать правило: явно задавать ТипЗначения и заполнять свойство Значение еще на этапе формирования табличного документа, не полагаясь на автоматическую конвертацию при сохранении файла.