Как правильно организовать хранение периодических коэффициентов, зависящих от возраста и региона

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

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

Анализ проблемы: почему нельзя хранить данные в табличных частях ресурса-справочника

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

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

Во-вторых, данные в табличных частях не индексируются стандартными средствами поиска регистра. Это означает, что поиск по интервалам (например, «в какой диапазон попадает возраст 25 лет») будет выполняться перебором в памяти, а не средствами СУБД.

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

Рекомендуемая структура: Метод «Граничных значений»

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

Рассмотрим подробнее, как это работает на примере возраста. Если сегодня интервал «18–27 лет» имеет коэффициент 1, а «28–35 лет» — коэффициент 3, мы создаем две записи:

  1. Порог 18 — Коэффициент 1.
  2. Порог 28 — Коэффициент 3.

Если с завтрашнего дня границы изменятся (например, станет «18–20 лет»), мы просто добавим новую запись в регистр с новой датой периода. Проанализируем, как получить данные запросом:


ВЫБРАТЬ ПЕРВЫЕ 1
    Т.Коэффициент
ИЗ
    РегистрСведений.КоэффициентыПоказателей.СрезПоследних(&ДатаРасчета, ВидПоказателя = &ВидПоказателяВозраст) КАК Т
ГДЕ
    Т.ЗначениеПорога <= &ВозрастКлиента
УПОРЯДОЧИТЬ ПО
    Т.ЗначениеПорога УБЫВАЮЩИМ

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

Хранение данных о возрасте и регионе клиента

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

Правильное решение:

  1. В карточке клиента (или в периодическом регистре сведений «ПерсональныеДанные») храним ДатаРождения.
  2. Возраст рассчитываем программно или в запросе в момент выполнения операции.

Пример функции для точного расчета возраста в коде 1С:


Функция РассчитатьВозраст(ДатаРождения, ДатаРасчета) Экспорт
    Возраст = Год(ДатаРасчета) - Год(ДатаРождения);
    Если ДобавитьМесяц(ДатаРождения, Возраст * 12) > ДатаРасчета Тогда
        Возраст = Возраст - 1;
    КонецЕсли;
    Возврат Возраст;
КонецФункции

Для региона используем периодический регистр сведений МестонахождениеКлиентов, где измерением будет Контрагент (или ФизЛицо), а ресурсом — Регион. Это позволит нам знать, где находился клиент в любой момент времени в прошлом.

Сведение данных в одном запросе

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

  1. Получаем данные клиента на &ДатаРасчета (Дата рождения, Регион).
  2. Вычисляем возраст (разность дат в годах).
  3. Соединяем результат с регистром коэффициентов для региона (по точному совпадению).
  4. Соединяем результат с регистром коэффициентов для возраста (по условию Порог <= Возраст с выбором максимального порога).

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

Версионирование настроек (продвинутый уровень)

Если коэффициентов очень много и они меняются массово (например, выход новой редакции правил оценки с 1-го числа), удобно внедрить справочник ВерсииНастроек.

В этом случае в регистр коэффициентов добавляется измерение ВерсияНастроек. А в отдельном периодическом регистре сведений АктивныеНастройки хранится одна запись: какой справочник ВерсииНастроек действует с текущей даты.

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

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

← На главную