При решении задач распределения сотрудников или кандидатов по диапазонам баллов (например, от 140 до 150, от 150 до 160, 180+) начинающие разработчики часто совершают архитектурную ошибку: создают под каждый интервал отдельный ресурс или даже отдельный регистр накопления. Разберем, почему такой подход приводит к проблемам и как правильно организовать структуру данных и построить отчет в системе компоновки данных (СКД).
Проанализируем ситуацию, когда под каждый диапазон создается отдельный ресурс в регистре. Такой подход порождает ряд критических проблем:
ОБЪЕДИНИТЬ ВСЕ, что снижает производительность СУБД и усложняет текст запросов.Рассмотрим правильный подход к проектированию метаданных. Всегда следует разделять хранение первичного факта и его аналитическое представление в отчетах.
Для учета результатов тестирования или приема создадим регистр (сведений или накопления) со следующей структурой:
Сотрудник (или Кандидат) — ссылка на справочник, Подразделение (или Отдел) — ссылка на справочник.Балл (или ТестБалл) — тип Число.При проведении документа в регистр записывается конкретное полученное числовое значение, а задача распределения по колонкам и интервалам переносится на уровень запроса и схемы компоновки данных.
Разберем, как получить нужную аналитическую группировку в запросе СКД с помощью конструкции ВЫБОР. Этот способ подходит, если границы диапазонов стабильны и редко меняются.
ВЫБРАТЬ
Рег.Подразделение КАК Подразделение,
Рег.Сотрудник КАК Сотрудник,
ВЫБОР
КОГДА Рег.Балл < 140 ТОГДА "Менее 140"
КОГДА Рег.Балл >= 140 И Рег.Балл < 150 ТОГДА "140–150"
КОГДА Рег.Балл >= 150 И Рег.Балл < 160 ТОГДА "150–160"
КОГДА Рег.Балл >= 160 И Рег.Балл < 180 ТОГДА "160–180"
ИНАЧЕ "180 и более"
КОНЕЦ КАК КатегорияБаллов,
1 КАК Количество
ИЗ
РегистрСведений.РезультатыТестирования КАК Рег
Посмотрим на пример, когда границы интервалов должны настраиваться пользователями в режиме 1С:Предприятие без доработки конфигуратора.
ШкалаОценок с реквизитами МинимальныйБалл (Число) и МаксимальныйБалл (Число).
ВЫБРАТЬ
Рег.Подразделение КАК Подразделение,
Рег.Сотрудник КАК Сотрудник,
ЕСТЬNULL(Шкала.Наименование, "Вне шкалы") КАК КатегорияБаллов,
1 КАК Количество
ИЗ
РегистрСведений.РезультатыТестирования КАК Рег
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ШкалаОценок КАК Шкала
ПО Рег.Балл >= Шкала.МинимальныйБалл
И (Рег.Балл < Шкала.МаксимальныйБалл ИЛИ Шкала.МаксимальныйБалл = 0)
Выясним, как настроить вывод данных, чтобы строки представляли подразделения, а колонки — интервалы баллов:
Количество с выражением Сумма(Количество) (или Количество(Различные Сотрудник)).Подразделение.КатегорияБаллов.Количество.В результате формируется кросс-отчет, где на пересечении подразделений и категорий отображается точное количество прошедших людей.
Если структура с несколькими ресурсами уже создана в рабочей базе и перепроведение документов невозможно, разберем способ нормализации выборки через транспонирование в запросе:
ВЫБРАТЬ
Рег.Подразделение КАК Подразделение,
"140-150" КАК КатегорияБаллов,
Рег.Ресурс140_150 КАК Количество
ИЗ
РегистрНакопления.ДанныеПриема КАК Рег
ГДЕ
Рег.Ресурс140_150 > 0
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Рег.Подразделение,
"150-160",
Рег.Ресурс150_160
ИЗ
РегистрНакопления.ДанныеПриема КАК Рег
ГДЕ
Рег.Ресурс150_160 > 0
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Рег.Подразделение,
"180+",
Рег.Ресурс180
ИЗ
РегистрНакопления.ДанныеПриема КАК Рег
ГДЕ
Рег.Ресурс180 > 0
Полученный набор данных подается в стандартную кросс-таблицу СКД, что позволяет вывести нужный отчет без немедленной переработки структуры хранения данных.