Часто программисты 1С сталкиваются с неприятной ситуацией: при формировании отчета и его последующем сохранении в формате XLSX (особенно если процесс происходит в фоновом задании на сервере под управлением Linux), числовые данные в ячейках Excel воспринимаются как текст. Это блокирует возможность использования стандартных формул Excel, таких как СУММ, и вынуждает пользователей вручную преобразовывать данные. В этой статье мы подробно разберем причины такого поведения платформы и рассмотрим пошаговые методы решения проблемы.
Давайте разберем, почему это происходит. Когда 1С формирует файл XLSX на сервере (особенно в среде Linux), она делает это напрямую, без использования библиотек Microsoft Office (так как COM-объекты там недоступны). Платформа генерирует XML-структуру внутри архива XLSX. Если в этой структуре тип ячейки будет ошибочно помечен как s (string) или само значение будет содержать невидимые спецсимволы, Excel откажется признавать в нем число.
Проанализируем основные факторы, влияющие на этот процесс:
Рассмотрим самый первый и очевидный шаг. Откроем макет нашего отчета в конфигураторе и обратим внимание на палитру свойств проблемной ячейки. Посмотрим на важные параметры:
Параметр.Число.ЧГ=0 (Число Группировка = 0). Это уберет пробелы между тысячами. Например: ЧДЦ=2; ЧГ=0.Иногда настройки в визуальном редакторе макета "слетают" или игнорируются платформой при выводе. Проанализируем ситуацию, когда нам нужно принудительно задать тип в коде. Разберем пример того, как это сделать перед выводом области в табличный документ:
// Предположим, у нас есть ОбластьСтрока, которую мы выводим в цикле
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
// Заполняем параметр числовым значением (важно передавать именно Число, а не Формат(Число...))
ОбластьСтрока.Параметры.Сумма = ДанныеСтроки.Сумма;
// Принудительно назначаем тип значения для конкретной ячейки области
ТекущаяЯчейка = ОбластьСтрока.Область("Сумма"); // Обращаемся к ячейке по имени или адресу
ТекущаяЯчейка.СодержитЗначение = Истина;
ТекущаяЯчейка.ТипЗначения = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));
Использование функции Формат() при передаче значения в параметр макета — это распространенная ошибка. Помните: функция Формат() всегда возвращает строку. Если вы передадите результат этой функции в макет, 1С запишет в Excel текст, даже если в свойствах ячейки стоит "Число".
Если наш отчет формируется регламентным заданием на Linux-сервере, выясним причину в системных локалях. Платформа 1С использует настройки текущего пользователя системы (обычно usr1cv8). Если в системе не настроена русская локаль, разделители могут подменяться на точки или запятые в зависимости от системного дефолта.
Проанализируем шаги по настройке Linux-сервера:
ru_RU.UTF-8 командой locale -a./etc/default/1cv8 или в unit-файле systemd) явно заданы переменные окружения:
LANG=ru_RU.UTF-8
LC_ALL=ru_RU.UTF-8
Как показывает практика и советы опытных разработчиков, иногда на механизм определения типа в конвертере 1С влияет свойство Горизонтальное положение. Если установлено значение Авто, система может засомневаться в типе данных. Попробуем установить принудительное выравнивание Право для всех числовых колонок. Это дает платформе дополнительную подсказку при формировании структуры XLSX.
Если ничего не помогает, выясним причину, заглянув "под капот" файла Excel. Выполним следующие действия:
xlsx..zip и распакуем его.xl/worksheets/ и откроем sheet1.xml любым текстовым редактором.<v>.Если мы видим атрибут t="s" (type="string"), значит, 1С явно пометила число как строку. Если же атрибута нет, но внутри тега значения присутствуют странные символы (например, или неразрывные пробелы), значит, проблема в форматировании внутри самой 1С (см. Решение 1 про ЧГ=0).
В некоторых случаях, как отметил автор исходного вопроса, проблема может быть вызвана "залипанием" настроек или багом платформы. Если вы применили все настройки макета, но результат не меняется, выполните следующие действия:
snccntx и другие в каталоге пользователя usr1cv8).Следуя этим методикам, мы обеспечим корректную выгрузку числовых данных, что позволит конечным пользователям полноценно работать с отчетами в Excel без дополнительных манипуляций.