Как реализовать разноцветные границы у ячеек в табличном документе 1С

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

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

Анализ ограничений платформы

Прежде чем переходить к решениям, проанализируем ситуацию. Объект ЯчейкаТабличногоДокумента в платформе 1С:Предприятие 8 имеет свойство Рамка, которое определяет стиль линий (сплошная, пунктир и т.д.), и свойство ЦветРамки, которое определяет цвет. К сожалению, архитектура табличного документа не предусматривает раздельного управления цветом для каждой стороны (Сверху, Снизу, Слева, Справа). Если мы устанавливаем цвет, он применяется ко всем четырем сторонам. Тем не менее, существует несколько способов «обмануть» систему.

Способ 1: Использование вспомогательных сверхтонких ячеек

Этот метод можно назвать «геометрическим». Мы не раскрашиваем границы основной ячейки, а имитируем их с помощью соседних ячеек экстремально малой высоты и ширины. Рассмотрим этот процесс по шагам:

  1. Создадим в макете основную ячейку для данных.
  2. Сверху и снизу от нее добавим строки, высоту которых установим в минимально возможное значение (например, 1 или 2 пункта).
  3. Слева и справа добавим колонки с минимальной шириной (например, 0.1).
  4. Для этих узких ячеек установим нужный нам ЦветФона. Например, для верхней и нижней строк — красный, для боковых колонок — синий.
  5. У самих ячеек (и основной, и вспомогательных) границы (рамки) при этом должны быть отключены.

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

Способ 2: Программное наложение графических объектов (линий)

Более технологичный вариант — использование коллекции Рисунки табличного документа. Мы можем программно «нарисовать» линии поверх границ ячеек. Разберем пример кода, который добавляет цветную линию к определенной области:


// Допустим, ТабДок - наш сформированный отчет
Область = ТабДок.Область("R5C2:R5C2"); // Нужная ячейка
// Рассчитаем координаты ячейки
Верх = Область.Верх;
Лево = Область.Лево;
Ширина = Область.Ширина;
Высота = Область.Высота;

// Добавляем горизонтальную красную линию сверху
ЛинияСверху = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Линия);
ЛинияСверху.Верх = Верх;
ЛинияСверху.Лево = Лево;
ЛинияСверху.Ширина = Ширина;
ЛинияСверху.Высота = 0; // Линия горизонтальная
ЛинияСверху.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Сплошная, 1);
ЛинияСверху.ЦветЛинии = ЦветаСтиля.Красный;

// Добавляем вертикальную синюю линию слева
ЛинияСлева = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Линия);
ЛинияСлева.Верх = Верх;
ЛинияСлева.Лево = Лево;
ЛинияСлева.Ширина = 0; // Линия вертикальная
ЛинияСлева.Высота = Высота;
ЛинияСлева.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Сплошная, 1);
ЛинияСлева.ЦветЛинии = ЦветаСтиля.Синий;

Этот способ хорош тем, что он не портит структуру ячеек. Линии существуют как графический слой поверх таблицы.

Способ 3: Фоновые изображения в ячейках СКД

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

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

  1. Добавить в макет оформления поле, которое будет содержать двоичные данные картинки.
  2. В настройках набора данных или в вычисляемых полях подготовить ссылку на эту картинку.
  3. В макете ячейки указать параметр Значение для картинки и настроить ТипВыводаКартинки в значение Растянуть.

Интересный фокус: картинку можно хранить прямо в коде в виде строки Base64 и преобразовывать её во временное хранилище перед выводом отчета. Это позволит избежать хранения лишних файлов в конфигурации.

Управление отображением сетки при экспорте в Excel

Часто вопрос разноцветных границ возникает в контексте последующего сохранения отчета в Excel. Программисты иногда пытаются скрыть стандартную сетку Excel, устанавливая всем ячейкам белые границы. Рассмотрим более правильный подход. В 1С есть свойство табличного документа ОтображатьСетку. Если программно установить его в значение Ложь, то при сохранении в формат .xlsx файл откроется в Excel с уже отключенной сеткой (аналог снятия галочки "Сетка" на вкладке "Вид" в Excel).


ТабДок.ОтображатьСетку = Ложь;
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);

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

Программная пост-обработка через COM-соединение

Если ни один из методов внутри 1С не подходит (например, нужно очень сложное оформление для финансового директора), можно прибегнуть к внешнему управлению. После того как файл сохранен в формате Excel, мы можем открыть его через COM и раскрасить границы каждой ячейки индивидуально, используя объектную модель самого Excel.


Попытка
    Excel = Новый COMОбъект("Excel.Application");
    Книга = Excel.Workbooks.Open(ПутьКФайлу);
    Лист = Книга.Sheets(1);
    
    Ячейка = Лист.Cells(5, 2);
    // 8 - это xlEdgeTop (верхняя граница), 10 - xlEdgeRight и т.д.
    Ячейка.Borders(8).Color = 255; // Красный (RGB: 255, 0, 0)
    Ячейка.Borders(7).Color = 16711680; // Синий (RGB: 0, 0, 255)
    
    Книга.Save();
    Книга.Close();
    Excel.Quit();
Исключение
    Сообщить("Ошибка при обработке Excel: " + ОписаниеОшибки());
КонецПопытки;

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

← На главную