Как сохранить числа из 1С в Excel без потери числового формата?

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

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

Проблема: Почему числа становятся текстом?

Рассмотрим ситуацию: у нас есть объект ТабличныйДокумент, который мы заполняем данными из таблицы значений или результата запроса. Мы используем стандартный метод Записать() с типом файла ТипФайлаТабличногоДокумента.XLS или XLSX. Несмотря на то, что в исходной таблице 1С значения имеют тип Число, в Excel они приходят как строки.

Проанализируем типичную ошибку. Многие пытаются исправить ситуацию уже после того, как таблица сформирована, проходя по ней циклом и устанавливая формат:


л_ТипЧисло = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3));
л_КоличествоКолонок = л_ТД.ШиринаТаблицы;
Для л_СчетчикСтрок = 2 по л_ТД.ВысотаТаблицы Цикл
    Для л_СчетчикКолонок = 2 по л_КоличествоКолонок Цикл
        л_Область = л_ТД.Область(л_СчетчикСтрок, л_СчетчикКолонок, л_СчетчикСтрок, л_СчетчикКолонок);
        Если л_Область.СодержитЗначение Тогда
            л_Область.ТипЗначения = л_ТипЧисло;
            л_Область.Формат = "ЧРД=','; ЧН=''; ЧГ=''";
        КонецЕсли;
    КонецЦикла;
КонецЦикла;

Однако такой подход часто не дает результата. Выясним причину: если в момент записи значения в ячейку (через свойство Текст или Значение) система 1С уже определила тип ячейки как «строка», то последующее изменение ТипЗначения может не сработать для конвертера Excel. Нам нужно действовать превентивно.

Решение: Правильная типизация в момент заполнения

Самый надежный способ гарантировать корректный экспорт — настраивать свойства ячейки непосредственно в процессе вывода данных. Мы должны сообщить табличному документу, что ячейка будет хранить не просто текст для отображения, а типизированное значение.

Разберем по шагам алгоритм правильного заполнения:

  1. Включаем хранение значения: Для области или конкретной ячейки устанавливаем свойство СодержитЗначение = Истина.
  2. Определяем тип: Устанавливаем свойство ТипЗначения, используя объект ОписаниеТипов.
  3. Записываем данные: Помещаем число в свойство Значение, а не в свойство Текст.

Посмотрим на пример кода, который решает проблему при обходе таблицы значений (ТЗ):


// При обходе строк вашей таблицы значений
Для Каждого текСтрокаТЗ Из МояТаблицаЗначений Цикл
    // Допустим, мы выводим данные в ОбластьТД
    ОбластьТД = л_ТД.Область(ТекущаяСтрока, НомерКолонки);
    
    // Проверяем тип данных в источнике
    Если ТипЗнч(текСтрокаТЗ[ИмяКолонки]) = Тип("Число") Тогда
        // Указываем, что ячейка содержит значение
        ОбластьТД.СодержитЗначение = Истина;
        // Явно задаем тип значения для ячейки
        ОбластьТД.ТипЗначения = Новый ОписаниеТипов("Число");
        // Записываем само число
        ОбластьТД.Значение = текСтрокаТЗ[ИмяКолонки];
    Иначе
        ОбластьТД.Текст = Строка(текСтрокаТЗ[ИмяКолонки]);
    КонецЕсли;
КонецЦикла;

Важный момент: Если вы используете макеты (.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 необходимо соблюдать правило: явно задавать ТипЗначения и заполнять свойство Значение еще на этапе формирования табличного документа, не полагаясь на автоматическую конвертацию при сохранении файла.

← На главную