Разработчики и пользователи 1С часто сталкиваются с ситуацией, когда стандартное свойство табличного документа ДокументРезультат.ОтображатьСетку = Ложь не дает ожидаемого эффекта в отчетах, построенных на Системе Компоновки Данных (СКД). Вместо полного скрытия сетки, мы видим навязчивые серые линии, которые не только мешают визуальному восприятию отчета, но и, что особенно неприятно, выводятся при печати. В этом материале мы подробно разберем, почему возникает такая ситуация, и рассмотрим эффективные способы решения этой проблемы.
Для того чтобы понять, почему свойство ОтображатьСетку может не работать так, как мы от него ожидаем, давайте проанализируем его природу и механизм формирования отчетов СКД:
ОтображатьСетку относится непосредственно к объекту ТабличныйДокумент, в который выводится результат. СКД же формирует макет отчета, включая границы ячеек, как часть своего собственного оформления или макета. Это означает, что линии, которые мы видим, могут быть не просто "сеткой" табличного документа, а заданными границами ячеек, сформированными компоновщиком макета СКД.ДокументРезультат.ОтображатьСетку = Ложь до того, как результат СКД будет выведен в табличный документ, или для неправильного экземпляра табличного документа, то это свойство, естественно, не сработает. Важно понимать, что это свойство влияет только на "техническую" сетку табличного документа, а не на явно заданные границы ячеек.ТабДок.ОтображатьСетку = Ложь не помогает для так называемых "коричневых" сеток, которые могут появляться при использовании собственных макетов в СКД. Это еще раз подтверждает, что речь идет о границах, заданных в макете.ОтображатьСетку необходимо устанавливать не напрямую для объекта ТабличныйДокумент, а для элемента формы типа "Поле табличного документа", который отображает результат. Однако даже в этом случае, если границы заданы СКД, это может не помочь.Таким образом, основная причина заключается в том, что СКД активно участвует в формировании внешнего вида отчета, включая явное задание границ ячеек. Эти границы воспринимаются как часть содержимого ячеек, а не как общая сетка табличного документа.
Наиболее эффективным и гибким способом управления внешним видом отчета СКД, включая скрытие сетки, является использование Условного оформления. Мы не будем "скрывать" сетку в привычном понимании, а изменим цвет ее линий на цвет фона (обычно белый), делая их невидимыми.
Мы используем механизм условного оформления, чтобы явно указать, что границы всех ячеек или определенных областей отчета должны быть белого цвета (или цвета фона). Это перекрывает любые линии, заданные компоновщиком макета СКД.
Поле = "Итоги" для скрытия сетки только в итоговых строках).Важность порядка применения: следует помнить, что условное оформление применяется в определенном порядке: сначала оформление группировок, затем таблиц/диаграмм, и в конце всего отчета. Если у вас несколько элементов условного оформления, их порядок может иметь значение. Если какой-либо другой элемент оформления задает границы, он может перекрыть ваше "белое" оформление. В этом случае убедитесь, что ваш элемент, скрывающий сетку, имеет более высокий приоритет (находится выше в списке).
В некоторых случаях может потребоваться программно добавить или изменить элемент условного оформления, например, если отчет формируется динамически или требуется гибкое управление. Мы можем использовать объект КомпоновщикНастроек или непосредственно структуру настроек схемы компоновки данных.
Рассмотрим пример добавления элемента условного оформления для скрытия границ:
// Предполагаем, что КомпоновщикНастроек уже инициализирован и содержит настройки отчета
// Например, это может быть в модуле формы отчета:
// КомпоновщикНастроек = Отчет.КомпоновщикНастроек;
// Создаем новый элемент условного оформления
ЭлементОформления = КомпоновщикНастроек.Настройки.УсловноеОформление.Элементы.Добавить();
// Настраиваем оформление
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветРамки", Новый Цвет(255, 255, 255)); // Белый цвет рамки
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("СтильРамки", Новый СтильГраницы(ТипЛинииТаблицы.Нет)); // Отсутствие стиля линии
// Если нужно задать цвет фона (необязательно, но может быть полезно)
// ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(255, 255, 255));
// Настраиваем область применения (по умолчанию, если не указано, применяется ко всему)
// Например, если мы хотим применить только к детальным записям:
// ОбластьПрименения = ЭлементОформления.ОбластьПрименения.Элементы.Добавить(Тип("ОбластьПримененияУсловногоОформленияДетальныеЗаписи"));
// Если нужно применить ко всему отчету, можно оставить ОбластьПрименения пустой или добавить несколько элементов.
// Чтобы применить ко всему отчету, можно добавить несколько областей применения
// ОбластьПримененияДетальные = ЭлементОформления.ОбластьПрименения.Элементы.Добавить(Тип("ОбластьПримененияУсловногоОформленияДетальныеЗаписи"));
// ОбластьПримененияГруппировки = ЭлементОформления.ОбластьПрименения.Элементы.Добавить(Тип("ОбластьПримененияУсловногоОформленияГруппировка"));
// ... и так далее для всех нужных областей
После программного добавления элемента условного оформления необходимо убедиться, что настройки компоновщика применяются к отчету перед его формированием.
Помимо условного оформления, существуют и другие подходы, которые могут помочь в борьбе с нежелательной сеткой, особенно в определенных сценариях.
СКД позволяет использовать различные макеты оформления, которые могут влиять на внешний вид отчета, включая наличие и стиль границ. Мы можем попробовать использовать стандартные возможности СКД для выбора макета оформления.
Этот метод полезен, если проблема в том, что стандартный макет оформления СКД добавляет нежелательные линии. Однако он может также убрать и другое, нужное вам оформление, поэтому используйте его с осторожностью.
Если в вашем отчете используются собственные макеты СКД (например, для шапки, подвала, детальных записей, группировок), и сетка отображается именно в этих областях, то проблема, скорее всего, кроется в самих макетах. В этом случае необходимо изменить макеты.
Ctrl+A). В окне свойств (или через контекстное меню "Свойства ячеек...") проверьте настройки границ:
Этот подход позволяет точечно управлять оформлением в тех областях, где вы используете собственный дизайн, и гарантирует, что ваши макеты не добавляют нежелательные линии.
Хотя этот метод менее эффективен для границ, сформированных СКД, он может быть полезен в случаях, когда сетка появляется из-за других причин или для воздействия на общую сетку табличного документа после вывода. Мы можем программно обработать ТабличныйДокумент после того, как в него был выведен результат СКД.
// Предположим, что ТабДок - это объект ТабличныйДокумент, в который выведен результат СКД
ТабДок = Новый ТабличныйДокумент;
// ... Здесь происходит формирование отчета СКД и его вывод в ТабДок
// Например:
// КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
// МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
// ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
// ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
// ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
// ПроцессорВывода.УстановитьДокумент(ТабДок);
// ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// ...
// После вывода, мы можем попытаться убрать линии программно
ТабДок.ОтображатьСетку = Ложь; // Это свойство управляет стандартной сеткой ТабДока.
// Также можно пройтись по всем областям и убрать линии
Для Каждого Область ИЗ ТабДок.Области Цикл
// Устанавливаем стиль линии "Нет" для всех границ области
// Важно: Линии = ТипЛинииТаблицы.Нет; может не работать, если границы заданы цветом.
// Лучше явно установить цвет и стиль.
Область.ЛеваяЛиния.Тип = ТипЛинииТаблицы.Нет;
Область.ПраваяЛиния.Тип = ТипЛинииТаблицы.Нет;
Область.ВерхняяЛиния.Тип = ТипЛинииТаблицы.Нет;
Область.НижняяЛиния.Тип = ТипЛинииТаблицы.Нет;
// Или установить белый цвет для всех линий
// Область.ЛеваяЛиния.Цвет = Новый Цвет(255, 255, 255);
// Область.ПраваяЛиния.Цвет = Новый Цвет(255, 255, 255);
// Область.ВерхняяЛиния.Цвет = Новый Цвет(255, 255, 255);
// Область.НижняяЛиния.Цвет = Новый Цвет(255, 255, 255);
КонецЦикла;
// Или можно пройти по ячейкам, что может быть очень ресурсоемко для больших отчетов
Для Стр = 1 По ТабДок.ВысотаТаблицы Цикл
Для Кол = 1 По ТабДок.ШиринаТаблицы Цикл
Ячейка = ТабДок.Область(Стр, Кол, Стр, Кол);
Если Ячейка <> Неопределено Тогда
Ячейка.ЛеваяЛиния.Тип = ТипЛинииТаблицы.Нет;
Ячейка.ПраваяЛиния.Тип = ТипЛинииТаблицы.Нет;
Ячейка.ВерхняяЛиния.Тип = ТипЛинииТаблицы.Нет;
Ячейка.НижняяЛиния.Тип = ТипЛинииТаблицы.Нет;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Мы должны предупредить, что программная манипуляция областями ТабличныйДокумент после вывода СКД может быть не всегда эффективной для "скрытия" уже нарисованных границ, так как СКД рисует границы как часть содержимого ячеек, а не как общую сетку. Тем не менее, это может помочь в некоторых специфических ситуациях.
В заключение, когда свойство ДокументРезультат.ОтображатьСетку = Ложь не дает желаемого результата в отчетах СКД, самым надежным, гибким и контролируемым способом является использование Условного оформления для изменения цвета границ ячеек на цвет фона (обычно белый). Этот метод позволяет нам эффективно управлять внешним видом отчета и избежать навязчивых серых линий, которые не только ухудшают восприятие, но и выводятся на печать.