Как обвести области с одинаковыми значениями в отчете СКД под управляемыми формами?

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

Нередко пользователи, привыкшие к гибким возможностям форматирования таблиц в Excel, просят реализовать аналогичное отображение данных и в отчетах 1С. Одна из таких распространенных задач – обведение рамкой областей отчета, содержащих одинаковые значения, для повышения читабельности и удобства анализа. В этой статье мы подробно рассмотрим, как решить эту задачу в отчетах, построенных на Системе Компоновки Данных (СКД) под управляемыми формами, используя стандартные механизмы СКД без сложной программной постобработки табличного документа.

Обоснование задачи и первоначальные трудности

Давайте проанализируем ситуацию, с которой сталкиваются разработчики, когда необходимо реализовать обводку областей с одинаковыми значениями в отчетах СКД. Основная цель – улучшить визуальное восприятие отчета, сделав его более наглядным и структурированным для конечного пользователя, зачастую ориентированного на внешний вид отчетов Excel.

Изначально, при попытке решить подобную задачу, разработчики часто рассматривают следующие пути:

  1. Использование стандартных группировок СКД: Этот подход кажется логичным, поскольку СКД предназначена для группировки данных. Однако, стандартное отображение группировок обычно включает в себя вывод отдельных строк заголовков групп, итогов по группам и прочих элементов, которые визуально разбивают данные и не создают эффекта "единого блока", обведенного рамкой, как в Excel при объединении ячеек. Пользователи часто отвергают такой вид, требуя более компактное и интегрированное отображение. Автор исходной темы также столкнулся с нежеланием пользователей видеть стандартные группировки.
  2. Программная постобработка табличного документа: После формирования отчета, когда он уже представлен в виде объекта ТабличныйДокумент, можно программно обойти все его ячейки и, анализируя их значения, отрисовать необходимые границы. Этот метод предоставляет максимальную гибкость в оформлении, позволяя достичь практически любого желаемого результата. Однако, у него есть существенные недостатки:
    • Снижение производительности: Обход большого табличного документа и изменение его свойств может занимать значительное время, особенно при больших объемах данных.
    • Усложнение кода: Требуется написание дополнительного программного кода для анализа и форматирования, что увеличивает сложность поддержки отчета.
    • Трудности с получением значений: Автор темы столкнулся с проблемой, когда свойство Текст ячеек было пустым при попытке получить значения для анализа. Это могло быть связано с особенностями формирования отчета СКД или тем, что значения хранились не в виде Текст, а в свойстве Значение, доступ к которому тоже имеет свои нюансы. В любом случае, это блокировало данный путь для автора.

Таким образом, мы видим, что ни один из "очевидных" путей не является идеальным. Однако, существует элегантное решение, которое сочетает преимущества СКД по работе с группировками и мощь условного оформления, позволяя достичь требуемого визуального эффекта без сложного программирования.

Решение: Использование скрытых группировок и гибкого условного оформления

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

Шаг 1: Создание группировки по полю, содержащему одинаковые значения

Прежде всего, нам необходимо создать группировку по тому полю, значения которого мы хотим объединять и обводить рамкой. Предположим, у нас есть отчет, где требуется обвести одинаковые значения в колонке "Номенклатура".

  1. Откройте настройки отчета СКД. Обычно это делается через кнопку "Настройки..." в форме отчета или при редактировании схемы компоновки данных.
  2. Перейдите на вкладку "Структура" (или "Настройки", если вы работаете в конфигураторе).
  3. Добавьте новую группировку для поля, которое должно содержать одинаковые значения. В нашем примере это поле "Номенклатура". Вы можете перетащить поле из списка доступных полей в область группировок или использовать кнопку "Добавить группировку" и выбрать нужное поле.
  4. Убедитесь, что детальные записи отчета (если они присутствуют) или другие поля, которые должны быть внутри обведенной области, находятся внутри этой новой группировки. Если отчет имеет иерархическую структуру, поместите новую группировку на нужный уровень.

На этом этапе, при формировании отчета, мы увидим стандартные заголовки группировки "Номенклатура", что нам не подходит, так как мы хотим создать единый блок без дополнительных строк.

Шаг 2: Настройка отображения группировки для её скрытия

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

  1. В окне настроек отчета перейдите на вкладку "Дополнительные настройки".
  2. Разверните ветку "Структура". Здесь вы увидите созданную вами группировку по "Номенклатуре".
  3. Найдите флажок "Авто" напротив вашей группировки и снимите его. Это действие критически важно, так как оно позволяет нам вручную управлять всеми параметрами отображения группировки, отключая автоматические настройки.
  4. После снятия флажка "Авто" станут доступны дополнительные настройки для этой группировки. Нам нужно изменить следующие свойства, отвечающие за вывод заголовка и итогов:
    • Для свойства "Заголовок" установите значение "Не выводить".
    • Для свойства "Выводить общие итоги" установите значение "Не выводить".

Благодаря этим настройкам, СКД будет продолжать группировать данные по "Номенклатуре" на логическом уровне, но в сформированном табличном документе эти группировки не будут добавлять лишних строк, заголовков или итогов. Это сохранит компактность отчета и позволит нам работать с блоками данных как с единым целым.

Шаг 3: Применение условного оформления для обводки границ

Теперь, когда у нас есть логическая группировка, которая не портит внешний вид отчета, мы можем использовать мощный механизм условного оформления СКД для отрисовки границ вокруг областей с одинаковыми значениями. Условное оформление будет применяться к полям отчета, которые находятся внутри нашей скрытой группировки.

  1. В окне настроек отчета перейдите на вкладку "Условное оформление".
  2. Нажмите кнопку "Добавить" для создания нового элемента оформления. Нам потребуется как минимум одно правило для каждой стороны рамки или одно комплексное правило.
  3. В настройках созданного элемента оформления:
    • Оформление:

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

    • Условие:

      Это самый важный пункт, определяющий, когда должна применяться граница. Нам нужно обвести всю область с одинаковыми значениями. Чтобы создать эффект "единой рамки" для блока, а не обводить каждую ячейку в отдельности, мы будем использовать условия, основанные на сравнении текущего значения с предыдущим или следующим. Это потребует использования вычисляемых полей в СКД, которые позволят нам узнать, является ли текущая строка началом или концом группы одинаковых значений.

      Сначала нам нужно создать вспомогательные вычисляемые поля в СКД. Перейдите на вкладку "Наборы данных", выберите нужный набор данных и добавьте вычисляемые поля:

      Создание вычисляемых полей для условий:

      • Вычисляемое поле "ПредыдущаяНоменклатура":

        Назначение: определить значение "Номенклатуры" в предыдущей строке. Это поможет понять, изменилась ли "Номенклатура" по сравнению с предыдущей записью.

        Выражение:

        ПРЕДЫДУЩЕЕ_ЗНАЧЕНИЕ("Номенклатура")

        Важно! Это поле должно быть доступно в запросе или через функцию СКД.

      • Вычисляемое поле "СледующаяНоменклатура":

        Назначение: определить значение "Номенклатуры" в следующей строке. Это поможет понять, изменится ли "Номенклатура" в следующей записи.

        Выражение:

        СЛЕДУЮЩЕЕ_ЗНАЧЕНИЕ("Номенклатура")

        Важно! Как и ПРЕДЫДУЩЕЕ_ЗНАЧЕНИЕ, СЛЕДУЮЩЕЕ_ЗНАЧЕНИЕ работают только в определенных контекстах СКД. Убедитесь, что они доступны для вашего набора данных и запроса.

      Теперь, используя эти вычисляемые поля, мы можем настроить условия для каждой границы:

      • Для Верхней границы:

        Условие: НЕ Номенклатура = ПредыдущаяНоменклатура ИЛИ ПредыдущаяНоменклатура ЕСТЬ NULL

        Это условие означает: "Отобразить верхнюю границу, если текущее значение Номенклатуры отличается от предыдущего ИЛИ если это первая строка в отчете (где предыдущего значения нет)".

        Примените это условие к оформлению, где выбрана только "Верхняя граница".

      • Для Нижней границы:

        Условие: НЕ Номенклатура = СледующаяНоменклатура ИЛИ СледующаяНоменклатура ЕСТЬ NULL

        Это условие означает: "Отобразить нижнюю границу, если текущее значение Номенклатуры отличается от следующего ИЛИ если это последняя строка в отчете (где следующего значения нет)".

        Примените это условие к оформлению, где выбрана только "Нижняя граница".

      • Для Левой и Правой границ:

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

        Условие: Истина

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

        Примените это условие к оформлению, где выбраны "Левая граница" и "Правая граница".

      Таким образом, у вас будет как минимум три правила условного оформления: одно для верхней границы, одно для нижней, и одно для боковых. Вы можете настроить их стили и цвета индивидуально.

    • Оформляемые поля:

      Нажмите кнопку выбора значения напротив свойства "Поля". Выберите все поля, которые вы хотите включить в обведенную рамкой область (например, "Номенклатура", "Количество", "Сумма" и любые другие поля детальных записей, которые находятся внутри вашей скрытой группировки).

Применяя эти правила, мы добьемся того, что СКД будет динамически отрисовывать границы вокруг каждого блока строк с одинаковыми значениями "Номенклатуры", создавая эффект объединенной области.

Шаг 4: Скрытие повторяющихся значений (опционально, но рекомендовано)

Чтобы отчет выглядел еще более "по-экселевски" и не перегружал пользователя повторяющейся информацией, часто требуется, чтобы повторяющееся значение поля ("Номенклатура" в нашем примере) отображалось только в первой строке обведенной области, а в остальных строках было пустым или невидимым.

  1. Вернитесь на вкладку "Условное оформление".
  2. Добавьте новый элемент оформления.
  3. Оформление:
    • Выберите "Цвет текста" и установите его в цвет фона отчета (например, белый, если фон белый), чтобы текст стал невидимым.
    • Или, что часто предпочтительнее, выберите "Текст" и установите его в пустую строку "". Это физически удалит текст из ячейки.
  4. Условие:

    Для поля, которое должно скрывать повторяющиеся значения (в нашем случае "Номенклатура"), установите следующее условие:

    Условие: Номенклатура = ПредыдущаяНоменклатура И НЕ ПредыдущаяНоменклатура ЕСТЬ NULL

    Это условие означает: "Скрыть текст, если текущее значение Номенклатуры совпадает с предыдущим И это не первая строка в отчете".

  5. Оформляемые поля:

    Выберите только то поле, текст которого нужно скрыть (в нашем случае это "Номенклатура").

Таким образом, мы добьемся того, что название номенклатуры будет видно только в первой строке каждого обведенного блока, а остальные строки внутри блока будут выглядеть пустыми в колонке "Номенклатура", имитируя объединенные ячейки Excel.

Важные замечания и рекомендации

Реализация специфических требований к оформлению отчетов через СКД, хотя и мощна, требует внимательной настройки. Мы рассмотрим несколько важных аспектов, которые помогут вам избежать распространенных ошибок и оптимизировать работу:

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

← На главную