Как программно отключить отображение сетки на листе Excel при работе из 1С?

Программист 1С v8.3 (Управляемые формы)
← К списку

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

Выясняем причину: свойство DisplayGridlines

Начнем с анализа ситуации. Попытка отключить сетку, обращаясь к свойству DisplayGridlines непосредственно у объекта листа Excel (например, Лист.DisplayGridlines = 0), как правило, не приводит к успеху. Разберем по шагам, почему это так.

  1. Неправильное обращение к свойству: Мы выясним, что свойство DisplayGridlines, отвечающее за отображение линий сетки, является свойством объекта Window (Окно), а не объекта Worksheet (Лист). Это подтверждается официальной документацией Microsoft Learn.
  2. Значения свойства: Проанализируем, какие значения принимает это свойство:
    • 0 (или False) – скрывает линии сетки.
    • -1 (или True) – отображает линии сетки.

    Таким образом, даже если бы мы обращались к свойству DisplayGridlines у листа, значение -1 (как это иногда ошибочно предлагается) не отключило бы, а, наоборот, включило бы сетку.

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

Решение 1: Отключение сетки для активного окна

Наиболее простой и часто используемый способ – это отключение сетки для активного окна Excel. Рассмотрим подробнее этот подход.

  1. Получаем активное окно: Когда мы работаем с экземпляром приложения Excel через 1С, у этого экземпляра всегда есть активное окно (ActiveWindow). Именно к этому окну мы и будем обращаться.
  2. Устанавливаем свойство DisplayGridlines: Для скрытия сетки мы присваиваем свойству DisplayGridlines значение 0 (или False).

Посмотрим на пример кода, который демонстрирует этот подход:


// Предполагаем, что переменная Эксель уже содержит объект приложения Excel,
// а Книга - открытую книгу Excel.

// Активируем нужный лист, если он еще не активен.
// Например, активируем второй лист в книге.
ВторойЛист = Эксель.Sheets(2);
ВторойЛист.Activate();

// Теперь, когда нужный лист активен, обращаемся к свойству ActiveWindow
// экземпляра приложения Excel и отключаем сетку.
Эксель.ActiveWindow.DisplayGridlines = 0;

Важный момент: Этот метод отключит сетку только для того листа, который является активным в момент выполнения команды Эксель.ActiveWindow.DisplayGridlines = 0;. Если вам нужно отключить сетку на нескольких листах, потребуется другой подход.

Решение 2: Отключение сетки на нескольких листах или для всех листов книги

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

Способ 1: Активация каждого листа по очереди

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

  1. Перебираем листы: Используем цикл для итерации по коллекции Sheets (или Worksheets) книги Excel.
  2. Активируем каждый лист: Внутри цикла вызываем метод Activate() для текущего листа.
  3. Отключаем сетку: После активации листа, применяем уже известный нам метод Эксель.ActiveWindow.DisplayGridlines = 0;.

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


// Предполагаем, что переменная Эксель уже содержит объект приложения Excel,
// а Книга - открытую книгу Excel.

// Перебираем все листы в книге
Для Каждого Лист Из Книга.Sheets Цикл
    // Активируем текущий лист
    Лист.Activate();
    
    // Отключаем сетку для активного окна (которое теперь отображает текущий лист)
    Эксель.ActiveWindow.DisplayGridlines = 0;
КонецЦикла;

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

Способ 2: Использование коллекции SheetViews

Для более продвинутого управления представлением листов, особенно если вы хотите избежать постоянной активации, можно использовать коллекцию SheetViews. Каждому листу соответствует одно или несколько представлений, и именно у представления мы можем управлять свойством DisplayGridlines.

  1. Получаем объект листа: Обращаемся к конкретному листу, для которого хотим отключить сетку.
  2. Получаем представление листа: У каждого объекта Worksheet есть свойство SheetViews, которое является коллекцией. Как правило, для обычного листа достаточно обратиться к первому элементу этой коллекции (Лист.SheetViews(1)).
  3. Устанавливаем свойство DisplayGridlines для представления: Теперь мы можем установить свойство DisplayGridlines непосредственно для этого представления.

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


// Предполагаем, что переменная Эксель уже содержит объект приложения Excel,
// а Книга - открытую книгу Excel.

// Перебираем все листы в книге
Для Каждого Лист Из Книга.Sheets Цикл
    // Проверяем, что это действительно рабочий лист (Worksheet),
    // так как в коллекции Sheets могут быть и другие типы листов (например, Chart).
    Если Лист.Type = 1 Тогда // xlWorksheet = 1
        // Обращаемся к первому представлению листа и отключаем сетку
        Лист.SheetViews(1).DisplayGridlines = 0;
    КонецЕсли;
КонецЦикла;

Этот метод является более "прямым" и может быть предпочтительнее, поскольку он не требует активации каждого листа, что может ускорить выполнение кода, особенно при работе с большим количеством листов.

Дополнительные нюансы и полезная информация

Рассмотрим еще несколько важных моментов, которые помогут вам лучше понять и использовать эту функциональность.

Мы подробно разобрали различные способы отключения сетки в Excel при работе из 1С. Используя объектную модель Excel и правильно обращаясь к свойствам ActiveWindow.DisplayGridlines или SheetView.DisplayGridlines, вы сможете легко управлять внешним видом ваших отчетов и документов.

← К списку