При выгрузке отчетов и печатных форм из 1С в форматы электронных таблиц (XLS, XLSX) разработчики часто сталкиваются с неприятным поведением: буквенно-цифровые строки (например, артикул вида 55QTG5A) внезапно превращаются в число 55, а строковые номера карт или расчетные счета (например, 00485585) теряют начальные нули и становятся числом 485585. При этом в самой печатной форме 1С данные отображаются совершенно корректно, а в строке формул Excel значение искажается.
Проанализируем механику возникновения этой ошибки, разберем причины поведения платформы и подробно рассмотрим проверенные способы решения проблемы.
Выясним причину такого поведения конвертера платформы 1С. При выполнении стандартной операции сохранения табличного документа встроенный конвертер пытается оптимизировать данные на лету и автоматически определить тип для каждой ячейки.
На искажение данных влияют три ключевых фактора:
55QTG5A превращается в числовое значение 55.Формат часто остается маска числового представления (например, ЧГ=0). Даже если в ячейку выводится строковый реквизит, наличие числового формата заставляет механизм экспорта интерпретировать данные как число.Разберем по шагам наиболее правильный и надежный метод исправления ошибки непосредственно в макете отчета или обработки. Чтобы платформа не пыталась угадать тип данных, его необходимо зафиксировать явно.
После включения типизации платформа принудительно сохраняет текстовую природу ячейки, и при экспорте в файл XLSX значение сохраняется в исходном виде, включая начальные нули и буквенные индексы.
Если отчет формируется программно без использования статического макета или выводятся динамические области, зададим типизацию непосредственно в коде модуля перед выводом секции в результирующий документ.
Посмотрим на пример кода:
Область = Макет.ПолучитьОбласть("СтрокаТаблицы");
// Явно настраиваем типизацию ячейки
Область.Параметры.НомерКарты.СодержитЗначение = Истина;
Область.Параметры.НомерКарты.ТипЗначения = Новый ОписаниеТипов("Строка");
Область.Параметры.НомерКарты.Значение = Строка(Выборка.НомерКарты);
// Выводим подготовленную область в табличный документ
ТабДокумент.Вывести(Область);
Обратите внимание: когда для ячейки используется строгая типизация, заполнять данные рекомендуется через свойство Значение, а не через текстовое представление Текст. Это гарантирует сохранение типа данных внутри объектной модели табличного документа.
Рассмотрим альтернативный обходной путь для ситуаций, когда нет возможности менять свойства макета (например, в типовых или внешних печатных формах с жесткой структурой). Чтобы предотвратить автоопределение числа, к строковому значению программно добавляют неразрывный пробел Символы.НПП.
Разберем пример:
СтроковоеПоле = Символы.НПП + СокрЛП(Выборка.Артикул);
Область.Параметры.Артикул = СтроковоеПоле;
Символ неразрывного пробела визуально незаметен пользователю, но полностью блокирует числовой парсер платформы 1С при экспорте. В отличие от стандартного апострофа, неразрывный пробел не отображается в строке формул как отдельный знак редактирования.
Если отчет выгружается во внешний файл в рамках автоматического обмена или регламентного задания, надежным способом является управление форматированием колонок через объектную модель Excel.
Рассмотрим пример кода:
Попытка
ExcelПриложение = Новый COMОбъект("Excel.Application");
Книга = ExcelПриложение.Workbooks.Open(ПутьКФайлу);
Лист = Книга.Sheets(1);
// Принудительно задаем текстовый формат для всей колонки с артикулами
Лист.Columns(2).NumberFormat = "@";
Книга.Save();
ExcelПриложение.Quit();
Исключение
ExcelПриложение.Quit();
ВызватьИсключение;
КонецПопытки;
Формат "@" сообщает табличному редактору, что содержимое всего диапазона должно интерпретироваться исключительно как текст. Это исключает экспоненциальное представление длинных номеров (например, 4,08196E+11) и сохраняет все лидирующие нули.
При программном вызове метода ТабличныйДокумент.Записать() всегда используйте современный формат ТипФайлаТабличногоДокумента.XLSX. Устаревший формат XLS (Excel 97–2003) имеет жесткие технические ограничения стандарта BIFF8 (не более 65 536 строк и 256 колонок), а также менее надежные алгоритмы сохранения типов данных по сравнению с форматом OpenXML.