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

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей
← На главную

При работе с отчетами в 1С:Предприятие часто возникает ситуация, когда номера документов или артикулы содержат лидирующие нули (например, "0001234"). При просмотре отчета внутри 1С все выглядит корректно, однако после выгрузки в Excel стандартными средствами платформы нули исчезают, а ячейка получает числовой формат. Это происходит из-за того, что Excel автоматически пытается определить тип данных и преобразует строку, похожую на число, в формат Double.

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

Почему Excel «съедает» нули и меняет формат?

Выясним причину такого поведения. Когда 1С выполняет команду Записать() для табличного документа в формате XLS или XLSX, она передает данные во внутренний конвертер. Если в ячейке находится значение, состоящее только из цифр, конвертер может пометить его как числовое. Excel, открывая такой файл, видит числовой тип и отбрасывает «незначащие» с точки зрения математики нули.

Иногда Excel применяет специфические форматы, такие как «АФМ» или «Почтовый индекс», пытаясь угадать логику данных, если длина строки составляет определенное количество символов. В итоге визуально нули могут остаться, но в строке формул будет число без нулей, что делает невозможным дальнейший поиск по этим данным или их загрузку в другие системы.

Способ 1: Программная настройка области табличного документа

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


// Получаем область ячейки по адресу (строка 4, колонка 3)
ПолеТабДок = ЭлементыФормы.тдПолеТабличногоДокумента;
ОбластьЯчейки = ПолеТабДок.Область("R4C3");

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

// Устанавливаем само значение
ОбластьЯчейки.Значение = "0001287";

// Дополнительно можно задать форматную строку, если это необходимо
ОбластьЯчейки.Формат = "ЧГ=0"; 

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

Способ 2: Использование условного оформления в СКД

Если отчет строится на базе Системы компоновки данных (СКД), мы можем попробовать решить задачу без написания кода, используя настройки оформления. Проанализируем, как это сделать:

  1. Откроем настройки отчета в конфигураторе или в режиме «1С:Предприятие».
  2. Перейдем на закладку «Условное оформление».
  3. Добавим новое поле оформления и выберем параметр «Текст».
  4. В выражении для текста можно использовать функцию Формат(), например: Формат(НомерДокумента, "ЧВН=8; ЧГ=0"). Это заставит систему всегда выводить 8 символов с дополнение нулями слева.
  5. В качестве условия укажем, что оформление применяется всегда или для конкретных типов документов.

Однако стоит учитывать, что даже при таком подходе стандартный экспорт в Excel иногда сбрасывает оформление к «общему» формату. Если это происходит, перейдем к более радикальным методам.

Способ 3: Добавление неявного текстового признака

Разберем «хитрый» способ, который часто используют разработчики. Чтобы Excel гарантированно посчитал ячейку текстовой, к значению можно добавить символ, который не виден глазу, но меняет тип данных. Таким символом является неразрывный пробел.

В запросе или в вычисляемом поле СКД мы можем написать следующее выражение:

МойНомерДокумента + Символы.НПП

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

Способ 4: Постобработка файла через COM-объект

Если отчет уже сформирован и сохранен, но формат ячеек в нем неверный, мы можем воспользоваться механизмом COM-соединения с установленным Excel на компьютере пользователя. Это наиболее надежный способ, так как он позволяет напрямую управлять объектами Excel.Application.

Рассмотрим пример готовой процедуры, которая открывает файл, находит нужную колонку (например, девятую), устанавливает для нее текстовый формат "@" и перезаписывает значения с сохранением нулей:


&НаКлиенте
Процедура ОбработатьФайлExcel(ПутьКФайлу)
    Попытка
        Excel = Новый COMОбъект("Excel.Application");
    Исключение
        Сообщить("Excel не установлен на данном компьютере!");
        Возврат;
    КонецПопытки;

    Попытка
        Книга = Excel.Workbooks.Open(СокрЛП(ПутьКФайлу));
        Лист = Книга.Sheets(1); // Работаем с первым листом
        
        НомерСтроки = 2; // Предположим, первая строка - заголовок
        КонецФайла = Ложь;
        
        Пока Не КонецФайла Цикл
            // Получаем значение из 9-й колонки
            ТекущееЗначение = СокрЛП(Лист.Cells(НомерСтроки, 9).Value);
            
            Если ПустаяСтрока(ТекущееЗначение) Тогда
                КонецФайла = Истина;
                Прервать;
            КонецЕсли;
            
            // Формируем правильную строку с нулями (до 8 символов)
            НовоеЗначение = Прав("00000000" + ТекущееЗначение, 8);
            
            // Устанавливаем текстовый формат ячейки перед записью значения
            Лист.Cells(НомерСтроки, 9).NumberFormat = "@";
            Лист.Cells(НомерСтроки, 9).Value = НовоеЗначение;
            
            НомерСтроки = НомерСтроки + 1;
        КонецЦикла;
        
        Excel.DisplayAlerts = 0; // Отключаем уведомления о сохранении
        Книга.Save();
        Книга.Close();
        Excel.Visible = 1; // Оставляем Excel открытым для проверки
        Сообщить("Обработка завершена успешно.");
        
    Исключение
        Сообщить("Ошибка при обработке файла: " + ОписаниеОшибки());
        Excel.Quit();
    КонецПопытки;
КонецПроцедуры

Подведем итоги

Проанализировав ситуацию, мы видим, что стандартный функционал 1С не всегда может «победить» внутренние алгоритмы Excel по определению типов данных. Для достижения гарантированного результата рекомендуется:

  1. Использовать формат XLSX вместо старого XLS, так как он лучше поддерживает типизацию XML-структур.
  2. В макетах 1С явно задавать ТипЗначения как Строка и отключать автоматическое определение формата.
  3. Если стандартные методы не помогают, применять COM-объекты для финальной коррекции файла, так как только через них можно принудительно установить свойство NumberFormat = "@" для уже сформированных ячеек.

Помните, что использование COMОбъект возможно только на ОС Windows и требует наличия установленного пакета Microsoft Office. Если ваша база работает на сервере под управлением Linux, стоит рассмотреть вариант использования сторонних библиотек для работы с OpenXML.

← На главную