При разработке систем оценки клиентов, скоринга или расчета специфических коэффициентов физических лиц часто возникает задача хранения данных, которые зависят от нескольких условий (например, возраста и региона) и при этом меняются во времени. Рассмотрим, как эффективно реализовать такую структуру в среде «1С:Предприятие», избежав типичных ошибок проектирования.
Первоначальная идея автора темы заключалась в создании периодического регистра сведений, где ресурсом является СправочникСсылка, а сами коэффициенты и интервалы хранятся в табличных частях этого справочника. Разберем, почему этот путь ведет к техническому тупику.
Во-первых, работа с данными в табличных частях внутри запросов крайне неэффективна. Чтобы получить один коэффициент для конкретного региона, системе придется сначала найти актуальную запись в регистре сведений (через СрезПоследних), затем обратиться к табличной части справочника. Если вам нужно получить коэффициенты для списка из 1000 клиентов, такой подход создаст огромную нагрузку на сервер БД, так как вы не сможете выполнить простое соединение таблиц в одном запросе.
Во-вторых, данные в табличных частях не индексируются стандартными средствами поиска регистра. Это означает, что поиск по интервалам (например, «в какой диапазон попадает возраст 25 лет») будет выполняться перебором в памяти, а не средствами СУБД.
Важный вывод: Любые данные, которые должны участвовать в массовых расчетах или отчетах, должны храниться в измерениях или ресурсах регистров сведений напрямую.
Для хранения шкал (например, возрастных интервалов), которые могут меняться, лучше всего использовать структуру регистра, позволяющую искать данные по условию «больше или равно». Рассмотрим оптимальную структуру периодического регистра сведений КоэффициентыПоказателей:
ВидПоказателя (Тип: ПеречислениеСсылка.ВидыПоказателей — значения: Возраст, Регион).ЗначениеПорога (Тип: Число или СправочникСсылка). Для возраста здесь хранится нижняя граница интервала.Коэффициент (Тип: Число).Рассмотрим подробнее, как это работает на примере возраста. Если сегодня интервал «18–27 лет» имеет коэффициент 1, а «28–35 лет» — коэффициент 3, мы создаем две записи:
Если с завтрашнего дня границы изменятся (например, станет «18–20 лет»), мы просто добавим новую запись в регистр с новой датой периода. Проанализируем, как получить данные запросом:
ВЫБРАТЬ ПЕРВЫЕ 1
Т.Коэффициент
ИЗ
РегистрСведений.КоэффициентыПоказателей.СрезПоследних(&ДатаРасчета, ВидПоказателя = &ВидПоказателяВозраст) КАК Т
ГДЕ
Т.ЗначениеПорога <= &ВозрастКлиента
УПОРЯДОЧИТЬ ПО
Т.ЗначениеПорога УБЫВАЮЩИМ
Такой подход позволяет системе мгновенно находить нужный коэффициент, просто выбирая ближайший «порог» снизу.
Выясним важный нюанс: хранить текущий возраст клиента в его карточке или в регистре сведений — плохая практика. Возраст меняется каждый день, и данные будут устаревать без участия пользователя.
Правильное решение:
ДатаРождения.Пример функции для точного расчета возраста в коде 1С:
Функция РассчитатьВозраст(ДатаРождения, ДатаРасчета) Экспорт
Возраст = Год(ДатаРасчета) - Год(ДатаРождения);
Если ДобавитьМесяц(ДатаРождения, Возраст * 12) > ДатаРасчета Тогда
Возраст = Возраст - 1;
КонецЕсли;
Возврат Возраст;
КонецФункции
Для региона используем периодический регистр сведений МестонахождениеКлиентов, где измерением будет Контрагент (или ФизЛицо), а ресурсом — Регион. Это позволит нам знать, где находился клиент в любой момент времени в прошлом.
Когда нам нужно получить оценку клиента на определенную дату, мы выполняем соединение данных клиента и шкал коэффициентов. Разберем алгоритм по шагам:
&ДатаРасчета (Дата рождения, Регион).Порог <= Возраст с выбором максимального порога).Рассмотрим пример того, как это выглядит в Системе компоновки данных (СКД). В СКД можно настроить связь наборов данных, где в условии связи указать не только «Равно», но и другие операторы, что значительно упрощает получение коэффициентов из шкал без написания сложного кода.
Если коэффициентов очень много и они меняются массово (например, выход новой редакции правил оценки с 1-го числа), удобно внедрить справочник ВерсииНастроек.
В этом случае в регистр коэффициентов добавляется измерение ВерсияНастроек. А в отдельном периодическом регистре сведений АктивныеНастройки хранится одна запись: какой справочник ВерсииНастроек действует с текущей даты.
Это позволит вам подготовить новые коэффициенты за неделю до их вступления в силу, проверить их и «активировать» одной записью, не забивая основной регистр тысячами новых строк с одной и той же датой периода.
Итог: Используя периодические регистры сведений с правильной индексацией по измерениям и храня только базовые данные (дату рождения), вы получите гибкую и производительную систему, способную быстро пересчитывать показатели как на текущую дату, так и за прошлые периоды.