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

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

Наверняка многие разработчики 1С сталкивались с ситуацией, когда пользователи просят сделать отчеты, отправляемые по электронной почте, максимально презентабельными. При выгрузке отчетов в формат Excel стандартная серая сетка и заголовки строк и колонок (буквы A, B, C... и цифры 1, 2, 3...) часто портят внешний вид документа. Особенно остро эта проблема встает при автоматической рассылке отчетов в таких конфигурациях, как 1С:Документооборот, 1С:ERP Управление предприятием или 1С:Комплексная автоматизация, где файлы формируются в фоновом режиме на сервере и отправляются напрямую адресатам.

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

Способ №1: Использование встроенных свойств 1С (Рекомендуемый кроссплатформенный метод)

Посмотрим на самый элегантный и правильный способ решения проблемы, который работает непосредственно на стороне платформы 1С:Предприятие 8.3. Многие разработчики знают про свойства табличного документа ОтображатьСетку и ОтображатьЗаголовки, однако простое их отключение перед записью файла часто не дает результата в итоговом файле Excel.

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

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


// Предположим, что ТабДок — это наш готовый ТабличныйДокумент с отчетом СКД

// 1. Отключаем отображение сетки на уровне 1С
ТабДок.ОтображатьСетку = Ложь;

// 2. Отключаем отображение заголовков строк и колонок (A, B, C... 1, 2, 3...)
ТабДок.ОтображатьЗаголовки = Ложь;

// 3. Устанавливаем ключевой флаг сохранения свойств отображения для Excel
ТабДок.СохранятьСвойстваОтображения = Истина;

// 4. Записываем файл в нужном формате (например, XLSX)
ТабДок.Записать(ПолноеИмяФайла, ТипФайлаТабличногоДокумента.XLSX);

Важное преимущество этого метода: он является абсолютно безопасным для выполнения на сервере (в фоновых заданиях рассылки отчетов) и отлично работает на серверах под управлением ОС Linux, так как не требует установленного Microsoft Office или вызова Windows-специфичных библиотек.

Способ №2: Визуальное скрытие сетки через заливку фона (Альтернативный трюк)

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

Рассмотрим, как программно залить весь сформированный отчет белым цветом в 1С:


// Определяем область, охватывающую весь заполненный документ
ОбластьВсегоДокумента = ТабДок.Область(1, 1, ТабДок.ВысотаТаблицы, ТабДок.ШиринаТаблицы);

// Принудительно устанавливаем белый цвет фона для всех ячеек
ОбластьВсегоДокумента.ЦветФона = Новый Цвет(255, 255, 255); // Или WebЦвета.Белый

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

При использовании этого метода сетка в сохраненном файле Excel визуально исчезнет, так как ячейки будут иметь сплошную белую заливку. Однако учитывайте два нюанса: во-первых, заголовки строк и колонок (A, B, C...) этим способом скрыть не удастся; во-вторых, файл может незначительно увеличиться в объеме из-за добавления информации о стиле заливки для каждой ячейки.

Способ №3: Пост-обработка файла через COM-объект Excel (Только для Windows-окружения)

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

Внимание: этот метод категорически не рекомендуется использовать в фоновых заданиях на сервере 1С, так как инициализация тяжелых COM-процессов Excel может приводить к утечкам памяти, зависаниям сервера и требует обязательного наличия установленного MS Office на сервере. Также этот способ физически не будет работать на серверах 1С под управлением ОС Linux.

Если же выгрузка выполняется на стороне клиента под управлением Windows, мы можем использовать следующий алгоритм работы:


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

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

Попытка
    // Открываем ранее сохраненный файл отчета
    Книга = ExcelПриложение.Workbooks.Open(ПутьКФайлу);
    
    // В Excel параметры сетки и заголовков привязаны к активному окну отображения (ActiveWindow).
    // Нам необходимо активировать каждый лист книги и отключить эти свойства.
    Для Каждого ТекущийЛист Из Книга.Worksheets Цикл
        ТекущийЛист.Activate();
        
        // Отключаем отображение сетки в активном окне для текущего листа
        ExcelПриложение.ActiveWindow.DisplayGridlines = Ложь;
        
        // Отключаем отображение заголовков (A, B, C... 1, 2, 3...)
        ExcelПриложение.ActiveWindow.DisplayHeadings = Ложь;
    КонецЦикла;
    
    // Сохраняем изменения и закрываем книгу
    Книга.Save();
    Книга.Close();
    
Исключение
    Сообщить("Произошла ошибка при обработке файла Excel: " + ОписаниеОшибки());
КонецПопытки;

// Обязательно закрываем процесс Excel, чтобы он не висел в диспетчере задач
ExcelПриложение.Quit();
ExcelПриложение = Неопределено;

Этот способ гарантирует 100% результат сокрытия элементов интерфейса непосредственно средствами самого табличного процессора Microsoft Excel, но требует аккуратного обращения с закрытием COM-объектов в блоках Попытка...Исключение.

Способ №4: Прямая модификация XML-архива XLSX (Продвинутый уровень)

Для самых сложных случаев, когда сервер работает под Linux, COM-соединение недоступно, а стандартные механизмы платформы по какой-то причине не дают нужного результата, можно использовать тот факт, что современный файл формата .xlsx представляет собой обычный ZIP-архив, содержащий XML-файлы разметки.

За отображение сетки и заголовков в структуре XML отвечает тег <sheetView> внутри файла описания листа (например, xl/worksheets/sheet1.xml). Мы можем программно изменить значения атрибутов этого тега:

  1. Распаковываем сохраненный файл .xlsx как архив с помощью встроенного объекта 1С ЧтениеZipФайла.
  2. Находим XML-файл нужного листа (обычно это xl/worksheets/sheet1.xml).
  3. Считываем его содержимое и находим тег <sheetView>.
  4. Устанавливаем или добавляем в него параметры showGridLines="0" (отключение сетки) и showRowColHeaders="0" (отключение заголовков строк/колонок).
  5. Сохраняем измененный XML-файл и запаковываем всю структуру обратно с помощью объекта ЗаписьZipФайла.

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

Резюме и рекомендации

Подводя итог, рекомендуем вам всегда начинать решение этой задачи со Способа №1. Использование встроенного свойства ТабличныйДокумент.СохранятьСвойстваОтображения = Истина совместно с отключением сетки и заголовков решает проблему в 95% случаев. Это штатное, быстрое и надежное серверное решение, которое идеально подходит для таких задач, как автоматическая рассылка отчетов в фоновом режиме.

← На главную