При разработке отчетов и печатных форм в системе 1С:Предприятие программисты часто сталкиваются с досадной проблемой: при сохранении табличного документа в формате xlsx или xls, числовые данные в итоговом файле Excel отображаются как текст. Это делает невозможным дальнейшее использование формул и суммирование данных без ручного преобразования типов. В этой статье мы подробно разберем, почему это происходит, и проанализируем все способы решения этой задачи — от простых визуальных настроек до глубокой типизации данных в макете.
Для начала давайте выясним причину такого поведения системы. Когда мы используем метод ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.xlsx), платформа 1С формирует файл на основе внутреннего представления табличного документа. Если в ячейке макета не заданы жесткие правила типизации, 1С передает в Excel «представление» числа — то есть готовую строку с разделителями, пробелами и знаками валют.
Рассмотрим стандартный код выгрузки, который часто приводит к ошибке:
ТабДок = Новый ТабличныйДокумент;
// ... заполнение табличного документа данными ...
ПутьКФайлу = "C:\Reports\MyReport.xlsx";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.xlsx);
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);
АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтаФорма.УникальныйИдентификатор);
Проблема в том, что Excel при открытии файла пытается «угадать» тип данных. Если он видит в ячейке неразрывный пробел (разделитель групп разрядов) или если ячейка выровнена по левому краю, он с высокой вероятностью пометит ее как текстовую.
Проанализируем самый распространенный случай — влияние разделителей групп разрядов. В 1С по умолчанию числа форматируются с использованием неразрывного пробела (символ с кодом 160) для разделения тысяч (например, «1 500,00»). Excel воспринимает этот символ как буквенный, а не цифровой.
Что нужно сделать:
ЧГ=0.Это действие уберет пробелы между тысячами. Теперь 1С передаст в Excel «чистое» число, которое программа Microsoft сможет корректно интерпретировать.
Многие разработчики забывают про критически важное свойство ячейки табличного документа, которое напрямую управляет типизацией при экспорте. Рассмотрим его подробнее.
В свойствах ячейки, помимо заполнения («Текст», «Параметр», «Шаблон»), есть раздел Значение. По умолчанию 1С выводит в Excel результат функции Представление(). Чтобы передать именно числовой тип, выполните следующие шаги:
Когда это свойство установлено, платформа при выгрузке в xlsx создает специальный тег в XML-структуре файла, указывающий Excel, что в данной ячейке находится именно Number, а не String.
Проанализируем программную часть. Часто программисты сами превращают число в текст еще на этапе заполнения макета, совершая классическую ошибку. Посмотрим на пример некорректного кода:
// ОШИБОЧНЫЙ ВАРИАНТ
Область = Макет.ПолучитьОбласть("Строка");
// Функция Формат() превращает число в строку!
Область.Параметры.Сумма = Формат(Данные.Сумма, "ЧЦ=15; ЧДЦ=2");
ТабДок.Вывести(Область);
В этом случае, какие бы настройки в макете вы ни делали, в параметр Сумма уже попала строка. Для корректной выгрузки нужно передавать «чистое» число:
// ПРАВИЛЬНЫЙ ВАРИАНТ
Область = Макет.ПолучитьОбласть("Строка");
// Передаем число как есть
Область.Параметры.Сумма = Данные.Сумма;
// Оформление (округление, знаки после запятой) настраиваем в свойствах макета
ТабДок.Вывести(Область);
Как было подмечено опытными разработчиками в обсуждении, иногда помогает простой визуальный прием. Выясним причину: алгоритмы импорта Excel при анализе неопределенных данных используют эвристику. По стандартам бухгалтерского учета и ИТ, числа должны быть выровнены по правому краю, а текст — по левому.
Пошаговая инструкция:
Рассмотрим технические нюансы работы движка сохранения 1С. В старых версиях платформы (ниже 8.3.14) конвертер в формат .xlsx работал менее стабильно, чем в старый формат .xls. Если вы используете устаревшую платформу и вышеописанные методы не помогают, попробуйте изменить тип файла при записи:
// Использование старого формата XLS иногда решает проблемы с типами
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLS);
Однако для современных версий (8.3.18+) рекомендуется использовать именно xlsx, так как он лучше поддерживает типизацию через метаданные XML. Также убедитесь, что у ячеек не установлено свойство Защита. Иногда включенная защита ячеек в макете 1С блокирует возможность автоматического преобразования типов в Excel.
Чтобы ваши числа всегда оставались числами в Excel, придерживайтесь этого алгоритма при создании макета:
Число), не используйте функцию Формат() в программном коде.ЧГ=0 (отключите группировку разрядов).Соблюдение этих правил позволит вам создавать профессиональные отчеты, которые будут корректно открываться в любых табличных редакторах, сохраняя возможность выполнения математических операций.