При программном создании файлов Excel из 1С с помощью COM-объекта разработчики часто сталкиваются с проблемой: заданный формат ячейки для даты или числа отображается некорректно. Например, попытка установить числовой формат "# ##0.00" приводит к результату "#\ ## 000", а формат даты "ДД.ММ.ГГ" превращается в "\Д\Д.\М\М.\Г\Г\Г\Г". В итоге ячейка получает пользовательский формат вместо стандартного, что мешает дальнейшей работе с данными в Excel.
Давайте разберемся, почему это происходит и как исправить ситуацию, чтобы форматы передавались корректно.
Проблема кроется в двух ключевых моментах: порядке действий и синтаксисе самих строк формата. Часто ошибка возникает, когда в ячейку пытаются записать уже отформатированную строку, а не "сырые" данные, или когда используются локализованные (русскоязычные) коды формата, которые могут быть неправильно поняты Excel в зависимости от версии или региональных настроек системы.
Рассмотрим код, который приводит к ошибке:
// Неправильный подход: передача отформатированной строки
Лист.Cells(1, 7).Value = Формат(СуммаДокумента, "ЧДЦ=2");
// И последующая установка формата, который может быть проигнорирован или искажен
Лист.Cells(1, 7).NumberFormat = "# ##0.00";
// Аналогичная ошибка с датой
Лист.Cells(2, 3).Value = Формат(Дата, "ДФ=dd.MM.yy");
Лист.Cells(2, 3).NumberFormat = "ДД.ММ.ГГ";
В этом примере в ячейку записывается не число или дата, а их строковое представление. Excel, получив строку, не может применить к ней числовой или датный формат. Последующая установка свойства NumberFormat приводит к тому, что Excel пытается интерпретировать заданную строку формата, но из-за несоответствия типов данных и потенциальных конфликтов с региональными настройками "экранирует" символы, добавляя обратный слэш.
Основное правило при работе с Excel через COM — это строгая последовательность: сначала передаем чистое значение, затем устанавливаем для ячейки формат. Excel должен получить данные в их исходном типе (Число, Дата), чтобы корректно применить к ним правила форматирования.
Исправим наш код в соответствии с этим правилом.
Шаг 1. Передайте в свойство Value ячейки переменную с типом Число без предварительного форматирования функцией Формат().
Шаг 2. После этого установите для той же ячейки свойство NumberFormat.
Посмотрим на исправленный код:
// Правильная установка числового формата
// Сначала передаем "сырое" числовое значение
Лист.Cells(1, 7).Value = СуммаДокумента;
// Затем устанавливаем формат для этой ячейки
Лист.Cells(1, 7).NumberFormat = "# ##0,00"; // Обратите внимание на запятую
// Правильная установка формата даты
// Сначала передаем "сырое" значение даты
Лист.Cells(2, 3).Value = Дата;
// Затем устанавливаем формат даты
Лист.Cells(2, 3).NumberFormat = "dd.mm.yyyy";
Этот подход гарантирует, что Excel сначала получит данные нужного типа, а уже потом применит к ним визуальное представление, которое вы задали.
Вторая причина проблемы — использование локализованных кодов формата, таких как "ДД", "ММ", "ГГ". Они работают только в русскоязычной версии Excel и могут вызывать сбои на компьютерах с другой версией Office или иными региональными настройками Windows.
Для надежности всегда используйте международные (англоязычные) коды формата. Они универсальны и будут корректно работать в любой версии Excel.
"ДД.ММ.ГГГГ" используйте "dd.mm.yyyy"."# ##0.00" используйте "#,##0.00".Важный момент: разделитель целой и дробной части (точка или запятая) в строке формата также зависит от региональных стандартов. В России это запятая, в США — точка. То же касается и разделителя групп разрядов (пробел или запятая). Если вы не уверены, какой формат использовать, есть надежный способ это выяснить.
Чтобы точно узнать, какую строку формата ожидает ваша версия Excel, можно воспользоваться встроенным рекордером макросов. Это самый надежный способ получить корректный синтаксис.
1234567,89), а в другую — пример даты (например, 15.10.2023).
Sub Макрос1()
'
' Макрос1 Макрос
'
Range("A1").Select
Selection.NumberFormat = "#,##0.00"
Range("A2").Select
Selection.NumberFormat = "dd.mm.yy;@"
End Sub
Именно эти строки — "#,##0.00" и "dd.mm.yy;@" — являются правильными для вашей системы. Скопируйте их и используйте в своем коде 1С. Этот метод исключает любые догадки и гарантирует совместимость.
Если работа с COM-объектом продолжает вызывать сложности или требуется более высокая надежность, рассмотрите возможность формирования отчета сначала средствами 1С.
ТабличныйДокумент в 1С.Записать().
ТабДок = Новый ТабличныйДокумент;
// ...здесь код по заполнению ТабДок...
// Установка формата в 1С
ОбластьЯчеек.Формат = "ЧДЦ=2; ЧРГ=' '; ЧГ=3,0";
// Сохранение в файл
ТабДок.Записать("C:\Temp\Отчет.xlsx", ТипФайлаТабличногоДокумента.XLSX);
Этот метод часто оказывается проще и стабильнее, так как 1С берет на себя все нюансы правильной конвертации форматов в стандарт Excel.