Как в СКД подсчитать количество уникальных договоров и скрыть единицы на уровне регистратора?

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

При разработке отчетов в системе компоновки данных (СКД) программисты часто сталкиваются с задачей вывода детальных записей (документов-регистраторов) при необходимости подсчета уникальных родительских объектов (например, договоров, контрагентов или заявок) на верхних уровнях группировки. По умолчанию, если мы рассчитываем ресурс по полю договора, СКД выводит единицы на уровне каждой детальной записи регистратора. Эти единицы визуально перегружают отчет и могут запутать пользователя, хотя на общий итог они не влияют.

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

Выясняем причину поведения СКД

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


ВЫБРАТЬ
    ПродажиОбороты.Контрагент КАК Контрагент,
    ПродажиОбороты.Договор КАК Договор,
    ПродажиОбороты.Регистратор КАК Регистратор,
    ПродажиОбороты.СуммаОборот КАК Сумма
ИЗ
    РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты

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

Рассмотрим подробнее четыре практических способа реализации этой задачи.

Способ 1. Настройка расчета ресурса по группировкам (Наиболее правильный подход)

Этот метод основан на управлении расчетом итогов на уровне схемы компоновки данных. Мы можем явно указать СКД, для каких именно группировок нужно рассчитывать количество договоров, а для каких — выводить пустое значение или ноль.

Разберем этот метод по шагам:

  1. Откроем схему компоновки данных и перейдем на вкладку «Ресурсы».
  2. Найдем строку с нашим ресурсом (например, КоличествоДоговоров) и выражением Количество(Различные Договор).
  3. Обратим внимание на колонку «Рассчитывать по...». По умолчанию там ничего не заполнено, что означает расчет по всем группировкам.
  4. Нажмем на эту колонку и выберем только те группировки, на которых нам действительно важен этот показатель (например: Контрагент, Организация) и обязательно отметим Общий итог. Группировку Регистратор выбирать не нужно.
  5. Если нам требуется, чтобы вместо пустого поля на уровне регистратора выводился ноль или прочерк, мы можем добавить этот же ресурс во вторую строку таблицы ресурсов. В поле «Выражение» укажем 0 или NULL, а в колонке «Рассчитывать по...» выберем исключительно группировку Регистратор.

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

Способ 2. Отключение автополей в настройках группировки регистратора

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

Выполним следующие действия:

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

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

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

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

Настроим условное оформление по шагам:

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

При формировании отчета система рассчитает единицы, но при выводе на экран заменит их пустой строкой, сохранив идеальный внешний вид отчета.

Способ 4. Использование системного поля «УровеньВГруппировке»

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

Для реализации этого метода мы воспользуемся общим условным оформлением отчета:

  1. Перейдем в общие настройки отчета на вкладку «Условное оформление» и создадим новое правило.
  2. В оформлении выберем свойство «Текст» со значением пустой строки.
  3. В списке «Оформляемые поля» укажем наш ресурс количества договоров.
  4. В качестве Условия добавим системное поле: выберем СистемныеПоля.УровеньВГруппировке, установим вид сравнения «Не равно» и значение 1.

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

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

← На главную