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

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

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

Разбор основной проблемы: почему Excel видит текст вместо числа?

Для начала давайте выясним причину такого поведения системы. Когда мы используем метод ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.xlsx), платформа 1С формирует файл на основе внутреннего представления табличного документа. Если в ячейке макета не заданы жесткие правила типизации, 1С передает в Excel «представление» числа — то есть готовую строку с разделителями, пробелами и знаками валют.

Рассмотрим стандартный код выгрузки, который часто приводит к ошибке:


ТабДок = Новый ТабличныйДокумент;
// ... заполнение табличного документа данными ...
ПутьКФайлу = "C:\Reports\MyReport.xlsx";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.xlsx);

ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);
АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтаФорма.УникальныйИдентификатор);

Проблема в том, что Excel при открытии файла пытается «угадать» тип данных. Если он видит в ячейке неразрывный пробел (разделитель групп разрядов) или если ячейка выровнена по левому краю, он с высокой вероятностью пометит ее как текстовую.

Решение 1: Настройка формата в макете (Параметр ЧГ)

Проанализируем самый распространенный случай — влияние разделителей групп разрядов. В 1С по умолчанию числа форматируются с использованием неразрывного пробела (символ с кодом 160) для разделения тысяч (например, «1 500,00»). Excel воспринимает этот символ как буквенный, а не цифровой.

Что нужно сделать:

  1. Откройте макет вашего отчета.
  2. Выделите ячейку (или параметр), в которую выводится число.
  3. Откройте палитру свойств (F4).
  4. Найдите свойство Формат и нажмите на кнопку выбора.
  5. В появившемся конструкторе формата установите флажок «Группировка» в значение «0» или вручную пропишите в строке формата ЧГ=0.

Это действие уберет пробелы между тысячами. Теперь 1С передаст в Excel «чистое» число, которое программа Microsoft сможет корректно интерпретировать.

Решение 2: Использование свойства «Содержит значение»

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

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

  1. В макете выделите нужную ячейку.
  2. В свойствах найдите флажок Содержит значение и установите его.
  3. В поле Тип значения выберите «Число».
  4. Убедитесь, что параметр заполняется именно числом, а не строкой.

Когда это свойство установлено, платформа при выгрузке в xlsx создает специальный тег в XML-структуре файла, указывающий Excel, что в данной ячейке находится именно Number, а не String.

Решение 3: Правильная передача данных в коде

Проанализируем программную часть. Часто программисты сами превращают число в текст еще на этапе заполнения макета, совершая классическую ошибку. Посмотрим на пример некорректного кода:


// ОШИБОЧНЫЙ ВАРИАНТ
Область = Макет.ПолучитьОбласть("Строка");
// Функция Формат() превращает число в строку!
Область.Параметры.Сумма = Формат(Данные.Сумма, "ЧЦ=15; ЧДЦ=2"); 
ТабДок.Вывести(Область);

В этом случае, какие бы настройки в макете вы ни делали, в параметр Сумма уже попала строка. Для корректной выгрузки нужно передавать «чистое» число:


// ПРАВИЛЬНЫЙ ВАРИАНТ
Область = Макет.ПолучитьОбласть("Строка");
// Передаем число как есть
Область.Параметры.Сумма = Данные.Сумма; 
// Оформление (округление, знаки после запятой) настраиваем в свойствах макета
ТабДок.Вывести(Область);

Решение 4: «Магия» выравнивания по правому краю

Как было подмечено опытными разработчиками в обсуждении, иногда помогает простой визуальный прием. Выясним причину: алгоритмы импорта Excel при анализе неопределенных данных используют эвристику. По стандартам бухгалтерского учета и ИТ, числа должны быть выровнены по правому краю, а текст — по левому.

Пошаговая инструкция:

  1. В макете 1С выделите колонки с числовыми данными.
  2. Установите горизонтальное выравнивание По правому краю.
  3. Даже если формат ячейки не задан явно, Excel с большей вероятностью применит к такой ячейке числовой тип данных при открытии файла.

Решение 5: Особенности версий платформы и формата файлов

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


// Использование старого формата XLS иногда решает проблемы с типами
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLS);

Однако для современных версий (8.3.18+) рекомендуется использовать именно xlsx, так как он лучше поддерживает типизацию через метаданные XML. Также убедитесь, что у ячеек не установлено свойство Защита. Иногда включенная защита ячеек в макете 1С блокирует возможность автоматического преобразования типов в Excel.

Итоговый чек-лист для гарантированного результата

Чтобы ваши числа всегда оставались числами в Excel, придерживайтесь этого алгоритма при создании макета:

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

← На главную