При выгрузке данных из 1С в формат CSV разработчики часто сталкиваются с неприятной особенностью: длинные числовые последовательности (например, 20-значные номера расчетных или лицевых счетов, такие как 40817810738050091838) при открытии готового файла в Microsoft Excel превращаются в нечитаемый вид с экспоненциальной записью (например, 4.08178E+19) или вовсе теряют точность, округляясь до 15 значащих цифр.
В этой статье мы подробно разберем, почему возникает эта проблема, как ведет себя формат CSV, и рассмотрим несколько эффективных способов сохранения исходного текстового представления чисел как при программной выгрузке из 1С, так и при настройке самого Excel.
Прежде чем приступать к написанию кода, давайте разберем физику процесса. Формат CSV (Comma-Separated Values) — это обычный текстовый файл. В нем нет и не может быть информации о форматировании ячеек, шрифтах, цветах или типах данных. Все значения там хранятся исключительно как строки текста, разделенные определенным символом (запятой, точкой с запятой или табуляцией).
Когда мы открываем CSV-файл двойным кликом, операционная система автоматически передает его программе Microsoft Excel. Excel, пытаясь «помочь» пользователю, запускает внутренний парсер и анализирует содержимое каждой колонки. Если парсер видит последовательность, состоящую только из цифр, он автоматически преобразует ее в числовой тип данных.
Здесь и кроется главная ловушка: стандарт представления чисел с плавающей запятой (IEEE 754), используемый в Excel, ограничивает точность числовых значений 15 значащими цифрами. Все цифры после 15-го знака заменяются нулями, а само число для компактности приводится к экспоненциальному виду. В результате наш 20-значный банковский счет безвозвратно портится при автоматическом открытии.
Если мы откроем этот же выгруженный файл через обычный Блокнот (Notepad) или любой другой текстовый редактор, мы увидим, что 1С выгрузила данные абсолютно корректно. Если файл предназначен исключительно для отправки в банк или другую внешнюю информационную систему, никаких доработок делать не нужно — принимающая сторона обработает текстовый файл без участия Excel, и данные будут прочитаны правильно.
Однако, если пользователям обязательно нужно просматривать и проверять эти файлы глазами в Excel, нам придется применить обходные технологии.
Рассмотрим элегантный программный трюк, который позволяет принудительно заставить парсер Excel воспринимать числовое поле как строку, не меняя при этом расширение файла. Для этого мы запишем значение ячейки в виде формулы равенства строки.
Вместо обычной записи номера счета:
40817810738050091838;Скалыга;Евгений;...
Мы сформируем в коде 1С специальную конструкцию:
="40817810738050091838";"Скалыга";"Евгений";...
Давайте проанализируем, как это реализовать в коде 1С. Обратите внимание, что для вывода двойных кавычек внутри строки их необходимо экранировать (удваивать).
// Пример формирования строки с явным приведением числа к текстовой формуле Excel
ФайлЗаписи = Новый ТекстовыйДокумент();
Для Каждого _Строка ИЗ Начисления Цикл
_Счет = _Строка.НомерЛицевогоСчета;
_Фамилия = СокрЛП(_Строка.Фамилия);
_Имя = СокрЛП(_Строка.Имя);
_Отчество = СокрЛП(_Строка.Отчество);
_СуммаСтр = Формат(_Строка.Сумма, "ЧДЦ=2; ЧГ=0");
// Формируем строку. Обратите внимание на конструкцию =""ссылка""
Стр = "="" " + _Счет + """;" + _Фамилия + ";" + _Имя + ";" + _Отчество + ";" + _СуммаСтр;
ФайлЗаписи.ДобавитьСтроку(Стр);
КонецЦикла;
ФайлЗаписи.Записать(Объект.Файл, "windows-1251");
При открытии полученного CSV-файла Excel распознает конструкцию ="число" как формулу, возвращающую текст. На экране отобразится точное 20-значное число с сохранением всех ведущих нулей, а математические преобразования и округления к нему применяться не будут.
Если выгрузка формируется стандартным образом и менять код 1С не планируется, можно настроить сам Excel на компьютерах пользователей. В современных версиях пакета Microsoft Office (начиная с обновлений для Microsoft 365 и версии Excel 2024) появилась штатная опция управления автоматическим преобразованием типов.
Выполним следующие шаги для настройки приложения:
После этого Excel перестанет портить длинные числовые строки при открытии любых CSV-файлов на данном рабочем месте.
Если пользователям необходимо разово просмотреть выгрузку без изменения глобальных настроек программы, научим их правильному импорту данных. Открывать файл двойным кликом в данном случае нельзя. Вместо этого используем процедуру контролируемого импорта.
Рассмотрим порядок действий для пользователей:
При таком подходе данные загружаются в таблицу Excel строго в исходном текстовом виде, гарантируя стопроцентную точность отображения номеров счетов.
Полезный лайфхак: Если вы переименуете расширение файла выгрузки из 1С с .csv на .txt, то при попытке открыть его через Excel автоматически запустится классический пошаговый "Мастeр импорта текстов". На третьем шаге этого мастера можно наглядно выбрать колонку с номерами счетов мышкой и назначить ей формат "текстовый" перед выводом на экран.
Если конечным потребителем файла является человек, а не банковский шлюз автоматического обмена, использование формата CSV изначально несет в себе риски ошибок со стороны пользователей. Наиболее надежным решением будет программное формирование полноценного файла Excel средствами платформы 1С.
Используя объект ТабличныйДокумент, мы можем жестко зафиксировать текстовый тип данных для конкретных ячеек на уровне метаданных самого файла. При сохранении в формате .xlsx Excel откроет файл корректно на абсолютно любом компьютере.
Давайте посмотрим, как реализовать такую выгрузку программно:
// Создаем табличный документ для формирования структуры файла
ТабДок = Новый ТабличныйДокумент;
// Задаем параметры макета или формируем ячейки программно
НомерСтроки = 1;
Для Каждого _Строка ИЗ Начисления Цикл
// Получаем область конкретной ячейки под номер счета
ОбластьСчета = ТабДок.Область(НомерСтроки, 1);
// Явно указываем тип значения как Строка
ОбластьСчета.СодержитЗначение = Истина;
ОбластьСчета.ТипЗначения = Новый ОписаниеТипов("Строка");
// Записываем строковое значение счета
ОбластьСчета.Значение = Строка(_Строка.НомерЛицевогоСчета);
// Заполняем остальные колонки (ФИО, Сумма)
ТабДок.Область(НомерСтроки, 2).Текст = СокрЛП(_Строка.Фамилия);
ТабДок.Область(НомерСтроки, 3).Текст = СокрЛП(_Строка.Имя);
ТабДок.Область(НомерСтроки, 4).Текст = СокрЛП(_Строка.Отчество);
ОбластьСуммы = ТабДок.Область(НомерСтроки, 5);
ОбластьСуммы.СодержитЗначение = Истина;
ОбластьСуммы.ТипЗначения = Новый ОписаниеТипов("Число");
ОбластьСуммы.Значение = _Строка.Сумма;
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
// Записываем сформированный документ в формате XLSX
ТабДок.Записать(Объект.ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Использование этого метода полностью снимает головную боль с форматированием у конечных пользователей. Файл откроется в первозданном виде, а номера счетов сохранят все символы без искажений.