Как правильно сгруппировать данные регистра по диапазонам значений в отчете 1С?

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

При решении задач распределения сотрудников или кандидатов по диапазонам баллов (например, от 140 до 150, от 150 до 160, 180+) начинающие разработчики часто совершают архитектурную ошибку: создают под каждый интервал отдельный ресурс или даже отдельный регистр накопления. Разберем, почему такой подход приводит к проблемам и как правильно организовать структуру данных и построить отчет в системе компоновки данных (СКД).

Анализ архитектурных ограничений

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

  1. Жесткая фиксация интервалов в метаданных: если шкала оценивания изменится (например, потребуется разбить интервал 180+ на 180–190 и 190+), придется менять структуру конфигурации, переписывать модули проведения документов и выполнять полное перепроведение данных за прошлые периоды.
  2. Избыточность и сложность запросов: чтобы вывести данные из разных ресурсов или регистров в единую таблицу отчета, приходится использовать оператор ОБЪЕДИНИТЬ ВСЕ, что снижает производительность СУБД и усложняет текст запросов.

Корректная модель хранения данных

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

Для учета результатов тестирования или приема создадим регистр (сведений или накопления) со следующей структурой:

  1. Измерения: Сотрудник (или Кандидат) — ссылка на справочник, Подразделение (или Отдел) — ссылка на справочник.
  2. Ресурсы: Балл (или ТестБалл) — тип Число.

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

Вариант 1. Формирование интервалов через конструкцию ВЫБОР в запросе

Разберем, как получить нужную аналитическую группировку в запросе СКД с помощью конструкции ВЫБОР. Этот способ подходит, если границы диапазонов стабильны и редко меняются.


ВЫБРАТЬ
    Рег.Подразделение КАК Подразделение,
    Рег.Сотрудник КАК Сотрудник,
    ВЫБОР
        КОГДА Рег.Балл < 140 ТОГДА "Менее 140"
        КОГДА Рег.Балл >= 140 И Рег.Балл < 150 ТОГДА "140–150"
        КОГДА Рег.Балл >= 150 И Рег.Балл < 160 ТОГДА "150–160"
        КОГДА Рег.Балл >= 160 И Рег.Балл < 180 ТОГДА "160–180"
        ИНАЧЕ "180 и более"
    КОНЕЦ КАК КатегорияБаллов,
    1 КАК Количество
ИЗ
    РегистрСведений.РезультатыТестирования КАК Рег

Вариант 2. Динамическая шкала интервалов через справочник

Посмотрим на пример, когда границы интервалов должны настраиваться пользователями в режиме 1С:Предприятие без доработки конфигуратора.

  1. Создаем справочник ШкалаОценок с реквизитами МинимальныйБалл (Число) и МаксимальныйБалл (Число).
  2. В запросе СКД связываем движения регистра со справочником по условию вхождения числа в границы:

ВЫБРАТЬ
    Рег.Подразделение КАК Подразделение,
    Рег.Сотрудник КАК Сотрудник,
    ЕСТЬNULL(Шкала.Наименование, "Вне шкалы") КАК КатегорияБаллов,
    1 КАК Количество
ИЗ
    РегистрСведений.РезультатыТестирования КАК Рег
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ШкалаОценок КАК Шкала
        ПО Рег.Балл >= Шкала.МинимальныйБалл
        И (Рег.Балл < Шкала.МаксимальныйБалл ИЛИ Шкала.МаксимальныйБалл = 0)

Настройка кросс-таблицы в СКД

Выясним, как настроить вывод данных, чтобы строки представляли подразделения, а колонки — интервалы баллов:

  1. Переходим на вкладку Ресурсы схемы компоновки данных. Добавляем поле Количество с выражением Сумма(Количество) (или Количество(Различные Сотрудник)).
  2. Переходим на вкладку Настройки. Добавляем группировку типа Таблица.
  3. В секцию Строки таблицы добавляем поле Подразделение.
  4. В секцию Колонки таблицы добавляем поле КатегорияБаллов.
  5. В секцию Выбранные поля добавляем ресурс Количество.

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

Временное решение при уже существующей структуре регистров

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


ВЫБРАТЬ
    Рег.Подразделение КАК Подразделение,
    "140-150" КАК КатегорияБаллов,
    Рег.Ресурс140_150 КАК Количество
ИЗ
    РегистрНакопления.ДанныеПриема КАК Рег
ГДЕ
    Рег.Ресурс140_150 > 0

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Рег.Подразделение,
    "150-160",
    Рег.Ресурс150_160
ИЗ
    РегистрНакопления.ДанныеПриема КАК Рег
ГДЕ
    Рег.Ресурс150_160 > 0

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Рег.Подразделение,
    "180+",
    Рег.Ресурс180
ИЗ
    РегистрНакопления.ДанныеПриема КАК Рег
ГДЕ
    Рег.Ресурс180 > 0

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

← На главную