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

Программист 1С v8.3 (Управляемые формы)
← На главную

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

Проблема разделителей и «невидимых» символов

Одной из главных причин, почему Excel не распознает числа, является использование разделителя групп разрядов. В 1С по умолчанию для удобства чтения больших чисел используется неразрывный пробел (символ с кодом 160). Для человеческого глаза он выглядит как обычный пробел, но для Excel ячейка 1 500,00 с таким символом становится строкой, а не числом.

Рассмотрим, как принудительно убрать эти разделители при формировании макета. Для этого в форматной строке ячейки необходимо использовать параметр ЧГ=0 (Число Группировка = 0). Проанализируем пример кода:


// Установка формата для конкретной области
Область = Макет.ПолучитьОбласть("Строка");
Область.Параметры.Сумма = Данные.Сумма;
// Убираем разделители групп, чтобы Excel воспринял это как число
Область.Область("Сумма").Формат = "ЧЦ=15; ЧДЦ=2; ЧГ=0";
ТабДок.Вывести(Область);

Использование ЧГ=0 гарантирует, что число будет передано в файл в «чистом» виде, без лишних пробелов, которые мешают математическим операциям в Excel.

Явное указание типа значения ячейки

Просто передать число в параметр ячейки иногда недостаточно. Для того чтобы движок экспорта 1С точно понимал, какой тип данных записывать в XLSX-структуру, рекомендуется использовать свойства объекта ОбластьЯчеек. Выясним, какие свойства за это отвечают:

  1. СодержитЗначение — это свойство нужно установить в значение Истина.
  2. ТипЗначения — здесь мы явно указываем, что в ячейке будет число.
  3. Значение — передаем сюда саму переменную, содержащую числовое значение.

Посмотрим на пример реализации этого подхода:


ТекущаяОбласть = ТабДок.Область(НомерСтроки, НомерКолонки);
ТекущаяОбласть.СодержитЗначение = Истина;
ТекущаяОбласть.ТипЗначения = Новый ОписаниеТипов("Число");
ТекущаяОбласть.Значение = ИтогПоДокументу;

При таком подходе 1С записывает данные в XML-структуру файла Excel с тегом типа «Number», что позволяет Excel сразу использовать эти данные в расчетах без дополнительных преобразований.

Обработка данных при загрузке (если файл уже сформирован)

Иногда мы сталкиваемся с ситуацией, когда нужно программно обработать уже имеющиеся текстовые представления чисел. В этом случае поможет замена символов. Разберем ситуацию, когда в приемник попадает строка с запятой, которую нужно превратить в число:


// Заменяем запятую на точку для корректного преобразования
ТЗСумма = Число(СтрЗаменить(ТЗСумма, ",", "."));

Важно помнить, что если в строке присутствуют неразрывные пробелы, их также нужно удалять перед преобразованием, используя СтрЗаменить(Значение, Символы.НПП, "").

Особенности работы с объединенными ячейками

Объединение ячеек в 1С и Excel работает по разным алгоритмам. При экспорте макета с объединенными ячейками часто возникает путаница с тем, в какой именно ячейке лежат данные. В Excel значение всегда хранится в самой левой верхней ячейке области объединения. Все остальные ячейки, входящие в объединение, считаются пустыми.

Если вы пытаетесь строить формулы СУММ в Excel по колонкам, где есть горизонтальное объединение, результат может быть непредсказуемым. Проанализируем рекомендации по работе с такими макетами:

Передача формул из 1С напрямую в Excel

Вместо того чтобы надеяться на автосумму пользователя, мы можем программно вставить формулу Excel прямо в файл при сохранении из 1С. Для этого используется свойство Текст ячейки табличного документа. Однако здесь есть важный технический нюанс: Excel внутри файлов XLSX использует английские названия функций.

Разберем пример установки формулы:


// В 1С устанавливаем текст ячейки как формулу
ОбластьИтог = ТабДок.Область("R10C5");
ОбластьИтог.Текст = "=SUM(E1:E9)"; 

При открытии такого файла Excel распознает конструкцию SUM и автоматически переведет её на язык локализации пользователя (например, в СУММ для русской версии), сохранив при этом живую связь между ячейками.

Борьба с расхождениями из-за округления

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

Чтобы избежать этой проблемы, проанализируем правило: всегда используйте функцию Окр() перед выводом данных в макет или расчетом итогов в 1С.


// Плохо:
Секция.Параметры.НДС = СуммаБезНДС * 0.2;

// Хорошо:
Секция.Параметры.НДС = Окр(СуммаБезНДС * 0.2, 2);

Альтернативные методы: COM-объекты и NativeXLSX

Если стандартный метод Записать() не удовлетворяет вашим требованиям по качеству форматирования, рассмотрим альтернативные пути.

1. Использование COM-объекта (Excel.Application): Этот метод позволяет управлять Excel напрямую. Мы можем задать формат каждой ячейки программно.


Попытка
    Эксель = Новый COMОбъект("Excel.Application");
    Книга = Эксель.Workbooks.Add();
    Лист = Книга.Worksheets(1);
    Лист.Cells(1, 1).Value = ЧислоИз1С;
    Лист.Cells(1, 1).NumberFormat = "#,##0.00";
Исключение
    Сообщить("Excel не установлен");
КонецПопытки;

Это надежный, но медленный способ, требующий наличия установленного Excel на сервере или клиенте.

2. Библиотеки прямого формирования XLSX: Существуют решения (например, NativeXLSX или использование встроенных средств формирования XML), которые создают файл без участия установленного Microsoft Office. Это самый быстрый и профессиональный способ, так как он позволяет полностью контролировать структуру типов данных внутри XML-файла Excel.

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

← На главную