Нередко пользователи, привыкшие к гибким возможностям форматирования таблиц в Excel, просят реализовать аналогичное отображение данных и в отчетах 1С. Одна из таких распространенных задач – обведение рамкой областей отчета, содержащих одинаковые значения, для повышения читабельности и удобства анализа. В этой статье мы подробно рассмотрим, как решить эту задачу в отчетах, построенных на Системе Компоновки Данных (СКД) под управляемыми формами, используя стандартные механизмы СКД без сложной программной постобработки табличного документа.
Давайте проанализируем ситуацию, с которой сталкиваются разработчики, когда необходимо реализовать обводку областей с одинаковыми значениями в отчетах СКД. Основная цель – улучшить визуальное восприятие отчета, сделав его более наглядным и структурированным для конечного пользователя, зачастую ориентированного на внешний вид отчетов Excel.
Изначально, при попытке решить подобную задачу, разработчики часто рассматривают следующие пути:
ТабличныйДокумент, можно программно обойти все его ячейки и, анализируя их значения, отрисовать необходимые границы. Этот метод предоставляет максимальную гибкость в оформлении, позволяя достичь практически любого желаемого результата. Однако, у него есть существенные недостатки:
Текст ячеек было пустым при попытке получить значения для анализа. Это могло быть связано с особенностями формирования отчета СКД или тем, что значения хранились не в виде Текст, а в свойстве Значение, доступ к которому тоже имеет свои нюансы. В любом случае, это блокировало данный путь для автора.Таким образом, мы видим, что ни один из "очевидных" путей не является идеальным. Однако, существует элегантное решение, которое сочетает преимущества СКД по работе с группировками и мощь условного оформления, позволяя достичь требуемого визуального эффекта без сложного программирования.
Ключ к решению лежит в использовании стандартных группировок СКД, но с их специальной настройкой, чтобы они не отображались как обычные заголовки или итоги, а служили лишь логическим контейнером для применения условного оформления. Далее мы пошагово рассмотрим, как это сделать.
Прежде всего, нам необходимо создать группировку по тому полю, значения которого мы хотим объединять и обводить рамкой. Предположим, у нас есть отчет, где требуется обвести одинаковые значения в колонке "Номенклатура".
На этом этапе, при формировании отчета, мы увидим стандартные заголовки группировки "Номенклатура", что нам не подходит, так как мы хотим создать единый блок без дополнительных строк.
Теперь мы переходим к самому главному – настройке группировки таким образом, чтобы она логически присутствовала в структуре данных, но при этом визуально не выделялась в отчете, позволяя нам применять к ней условное оформление без лишних элементов. Мы сделаем группировку "невидимой" для пользователя.
Благодаря этим настройкам, СКД будет продолжать группировать данные по "Номенклатуре" на логическом уровне, но в сформированном табличном документе эти группировки не будут добавлять лишних строк, заголовков или итогов. Это сохранит компактность отчета и позволит нам работать с блоками данных как с единым целым.
Теперь, когда у нас есть логическая группировка, которая не портит внешний вид отчета, мы можем использовать мощный механизм условного оформления СКД для отрисовки границ вокруг областей с одинаковыми значениями. Условное оформление будет применяться к полям отчета, которые находятся внутри нашей скрытой группировки.
Нажмите кнопку выбора значения напротив свойства "Граница". Здесь вы можете настроить стиль, толщину и цвет границы. Выберите нужный стиль (например, "Одинарная", "Двойная"), толщину (например, "Тонкая", "Средняя") и желаемый цвет. Для формирования рамки вокруг блока, нам потребуется настроить все четыре границы: Верхнюю, Нижнюю, Левую и Правую.
Это самый важный пункт, определяющий, когда должна применяться граница. Нам нужно обвести всю область с одинаковыми значениями. Чтобы создать эффект "единой рамки" для блока, а не обводить каждую ячейку в отдельности, мы будем использовать условия, основанные на сравнении текущего значения с предыдущим или следующим. Это потребует использования вычисляемых полей в СКД, которые позволят нам узнать, является ли текущая строка началом или концом группы одинаковых значений.
Сначала нам нужно создать вспомогательные вычисляемые поля в СКД. Перейдите на вкладку "Наборы данных", выберите нужный набор данных и добавьте вычисляемые поля:
Создание вычисляемых полей для условий:
Назначение: определить значение "Номенклатуры" в предыдущей строке. Это поможет понять, изменилась ли "Номенклатура" по сравнению с предыдущей записью.
Выражение:
ПРЕДЫДУЩЕЕ_ЗНАЧЕНИЕ("Номенклатура")
Важно! Это поле должно быть доступно в запросе или через функцию СКД.
Назначение: определить значение "Номенклатуры" в следующей строке. Это поможет понять, изменится ли "Номенклатура" в следующей записи.
Выражение:
СЛЕДУЮЩЕЕ_ЗНАЧЕНИЕ("Номенклатура")
Важно! Как и ПРЕДЫДУЩЕЕ_ЗНАЧЕНИЕ, СЛЕДУЮЩЕЕ_ЗНАЧЕНИЕ работают только в определенных контекстах СКД. Убедитесь, что они доступны для вашего набора данных и запроса.
Теперь, используя эти вычисляемые поля, мы можем настроить условия для каждой границы:
Условие: НЕ Номенклатура = ПредыдущаяНоменклатура ИЛИ ПредыдущаяНоменклатура ЕСТЬ NULL
Это условие означает: "Отобразить верхнюю границу, если текущее значение Номенклатуры отличается от предыдущего ИЛИ если это первая строка в отчете (где предыдущего значения нет)".
Примените это условие к оформлению, где выбрана только "Верхняя граница".
Условие: НЕ Номенклатура = СледующаяНоменклатура ИЛИ СледующаяНоменклатура ЕСТЬ NULL
Это условие означает: "Отобразить нижнюю границу, если текущее значение Номенклатуры отличается от следующего ИЛИ если это последняя строка в отчете (где следующего значения нет)".
Примените это условие к оформлению, где выбрана только "Нижняя граница".
Для создания непрерывных боковых границ для всего блока, мы можем применить их ко всем полям, которые находятся внутри нашей скрытой группировки. Условие может быть простым:
Условие: Истина
Это означает, что левая и правая границы будут отображаться для каждой строки в обведенной области.
Примените это условие к оформлению, где выбраны "Левая граница" и "Правая граница".
Таким образом, у вас будет как минимум три правила условного оформления: одно для верхней границы, одно для нижней, и одно для боковых. Вы можете настроить их стили и цвета индивидуально.
Нажмите кнопку выбора значения напротив свойства "Поля". Выберите все поля, которые вы хотите включить в обведенную рамкой область (например, "Номенклатура", "Количество", "Сумма" и любые другие поля детальных записей, которые находятся внутри вашей скрытой группировки).
Применяя эти правила, мы добьемся того, что СКД будет динамически отрисовывать границы вокруг каждого блока строк с одинаковыми значениями "Номенклатуры", создавая эффект объединенной области.
Чтобы отчет выглядел еще более "по-экселевски" и не перегружал пользователя повторяющейся информацией, часто требуется, чтобы повторяющееся значение поля ("Номенклатура" в нашем примере) отображалось только в первой строке обведенной области, а в остальных строках было пустым или невидимым.
"". Это физически удалит текст из ячейки.Для поля, которое должно скрывать повторяющиеся значения (в нашем случае "Номенклатура"), установите следующее условие:
Условие: Номенклатура = ПредыдущаяНоменклатура И НЕ ПредыдущаяНоменклатура ЕСТЬ NULL
Это условие означает: "Скрыть текст, если текущее значение Номенклатуры совпадает с предыдущим И это не первая строка в отчете".
Выберите только то поле, текст которого нужно скрыть (в нашем случае это "Номенклатура").
Таким образом, мы добьемся того, что название номенклатуры будет видно только в первой строке каждого обведенного блока, а остальные строки внутри блока будут выглядеть пустыми в колонке "Номенклатура", имитируя объединенные ячейки Excel.
Реализация специфических требований к оформлению отчетов через СКД, хотя и мощна, требует внимательной настройки. Мы рассмотрим несколько важных аспектов, которые помогут вам избежать распространенных ошибок и оптимизировать работу:
Убедитесь, что границы отрисовываются корректно во всех случаях и что скрытие повторяющихся значений работает как ожидается.
НомерПоПорядкуВГруппе(), условие скрытия было бы НомерПоПорядкуВГруппе("Номенклатура") > 1. Однако, функции ПРЕДЫДУЩЕЕ_ЗНАЧЕНИЕ и СЛЕДУЮЩЕЕ_ЗНАЧЕНИЕ являются более универсальным подходом для таких задач.Применяя эти шаги и учитывая приведенные рекомендации, вы сможете создавать отчеты СКД, которые не только функциональны, но и визуально приятны, соответствуя высоким требованиям пользователей к читабельности и представлению данных, что было бы крайне сложно достичь без глубокого понимания возможностей СКД.