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

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При выгрузке данных из 1С в Microsoft Excel разработчики часто сталкиваются со следующей проблемой: длинные числовые последовательности (например, 20-значные номера расчетных счетов в банке, номера пластиковых карт или штрихкоды EAN-13/EAN-14) отображаются некорректно. Вместо привычной строки цифр Excel выводит значение в экспоненциальном (научном) формате, например, 1,23456Е+19. Хуже того, при попытке сохранить такое число стандартными методами Excel безвозвратно искажает данные.

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


Выясняем причину: почему Excel искажает длинные числа?

В основе проблемы лежит внутреннее ограничение самого табличного процессора Microsoft Excel. По умолчанию программа хранит все числовые значения в соответствии с международным стандартом IEEE 754 (числа с плавающей запятой двойной точности). Этот стандарт физически обеспечивает максимум 15 значащих цифр точности.

Если длина числа, передаваемого в ячейку, превышает 15 символов (как в случае с 20-значным номером банковского счета), Excel выполняет следующие действия:

  1. Преобразует отображение ячейки в экспоненциальный вид (например, 1,23E+19).
  2. Безвозвратно заменяет все цифры начиная с 16-й на нули. Например, число 1234567890123456790 превратится в 1234567890123450000.

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


Анализ неудачных попыток и типичных ошибок

Давайте проанализируем типичные попытки решения этой задачи через COM-объединение и разберем, почему они приводят к ошибкам.

Попытка №1: Использование свойства Range.String

Некоторые разработчики по аналогии с LibreOffice или OpenOffice пытаются использовать следующее свойство:

Лист.Cells(row, 6).String = "1234567890123456790";

Этот код вызовет ошибку выполнения в 1С, так как в объектной модели Microsoft Excel у объекта Range (ячейка) нет свойства String.

Попытка №2: Использование свойства Range.Text

Попытка записать значение напрямую в текстовое представление ячейки также обречена на провал:

Лист.Cells(row, 6).Text = "1234567890123456790";

В результате система выдаст ошибку: "Нельзя установить свойство Text класса Range". Это связано с тем, что свойство Text в COM-модели Excel предназначено только для чтения. Оно возвращает то, что пользователь видит на экране с учетом текущего форматирования, но изменять его напрямую нельзя.

Попытка №3: Добавление пробела перед числом

Иногда разработчики пытаются обмануть Excel, добавляя в начало строки пробел. Однако встроенные механизмы автоматического распознавания типов Excel часто игнорируют ведущие пробелы, очищают их и все равно преобразуют строку в число со всеми вытекающими искажениями.


Способ 1. Использование символа апострофа (Быстрое решение)

Самый простой и классический способ принудительно указать Excel, что значение в ячейке является текстом — это добавление в начало строки одиночного апострофа (символа ').

Рассмотрим пример кода:


НомерСчета = "1234567890123456790";
Лист.Cells(row, 6).Value = "'" + НомерСчета;

Как это работает: символ апострофа в начале строки служит для Excel служебным маркером, указывающим: "Далее следует текст". При этом сам апостроф визуально скрывается от пользователя — в ячейке отображается только чистое число, выровненное по левому краю (как обычный текст). При редактировании ячейки апостроф будет виден только в строке формул.

Недостатки метода: хотя этот способ прост и эффективен, у него есть минусы. Символ апострофа физически присутствует в значении ячейки. Это может вызвать проблемы при последующей обработке файла: например, при поиске по таблице, использовании функций ВПР (VLOOKUP) или при разборе этого файла другими внешними программами, которые считывают "сырые" значения ячеек.


Способ 2. Явное задание текстового формата ячейки перед записью (Рекомендуемый COM-метод)

Более чистым и профессиональным решением при работе через COM является предварительное изменение формата ячейки (или всей колонки) на текстовый до момента записи самого значения.

Для этого используется свойство NumberFormat, которому присваивается значение "@" (это служебный символ Excel для текстового формата).

Разберем по шагам, как это реализовать:

Вариант А: Изменение формата конкретной ячейки


// Сначала принудительно задаем текстовый формат для ячейки
Лист.Cells(row, 6).NumberFormat = "@"; 

// Теперь записываем длинное число как обычную строку
Лист.Cells(row, 6).Value = "1234567890123456790"; 

Вариант Б: Оптимальное решение для всей колонки целиком

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


// Задаем текстовый формат для всей 6-й колонки (F)
Лист.Columns(6).NumberFormat = "@"; 

// Теперь в цикле просто записываем данные без дополнительных манипуляций
Пока Выборка.Следующий() Цикл
    Лист.Cells(row, 6).Value = Выборка.НомерСчета;
    row = row + 1;
КонецЦикла;

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


Способ 3. Передача значения через текстовую формулу

Еще один интересный способ заставить Excel воспринимать числовую последовательность как текст — передать ее в виде формулы, возвращающей строку.

Рассмотрим пример кода:

Лист.Cells(row, 6).Formula = "=""1234567890123456790""";

В данном случае Excel вычислит формулу ="1234567890123456790" и отобразит результат как текст. Этот метод полностью исключает появление предупреждений от Excel о том, что "число сохранено как текст" (зеленые треугольники в углах ячеек), но усложняет чтение файла внешними обработчиками.


Способ 4. Формирование через Табличный Документ 1С (без использования COM)

Если ваша задача — сформировать файл Excel стандартным для платформы 1С 8.x путем (через создание объекта ТабличныйДокумент с последующим методом Записать() в формат XLSX), вам не нужно использовать COM-объекты. Достаточно правильно настроить свойства ячеек в макете или коде 1С.

Давайте разберем, как это сделать программно:

  1. Установите признак того, что ячейка содержит типизированное значение.
  2. Явно задайте тип значения ячейки как Строка.
  3. Установите выравнивание по левому краю. Это крайне важно, так как Excel при импорте файлов часто ориентируется на выравнивание: если строка из цифр выровнена по правому краю, он может проигнорировать типы и попытаться преобразовать её в число.

Посмотрим на пример реализации:


// Получаем нужную область табличного документа
Область = ТабДок.Область("R" + row + "C6");

// Настраиваем свойства ячейки для хранения текста
Область.СодержитЗначение = Истина;
Область.ТипЗначения = Новый ОписаниеТипов("Строка");
Область.Значение = "1234567890123456790";

// Принудительно выравниваем по левому краю для защиты от автопреобразования в Excel
Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Лево;

После вывода всех данных мы можем записать документ в файл:

ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);

Этот способ гарантирует сохранение всех значащих цифр номера счета при открытии полученного файла в Excel, LibreOffice или МойОфис.


Современный подход: почему стоит отказываться от COM-объектов?

В современной практике разработки на платформе 1С:Предприятие использование COM-соединения Excel.Application считается устаревшим и нерекомендуемым подходом по ряду причин:

Рекомендуемая альтернатива: используйте встроенный объект 1С ТабличныйДокумент для формирования отчетов и выгрузок. Платформа 1С умеет напрямую генерировать XML-структуру файлов формата .xlsx (который по сути является ZIP-архивом с XML-документами внутри). При формировании файла средствами 1С, для нужной ячейки в XML-код автоматически прописывается атрибут строкового типа данных t="s" (string), что гарантирует идеальное открытие вашей таблицы в любой программе без искажения числовых последовательностей.

← На главную