При обновлении или переходе между конфигурациями (например, в отраслевых решениях для фитнес-клубов, салонов или сферы услуг) разработчики нередко сталкиваются с изменением архитектуры учета. Одной из типичных ситуаций является отказ от использования оборотного регистра накопления по посещениям в пользу хранения данных непосредственно в документах. В такой ситуации стандартный запрос к виртуальной таблице РегистрНакопления.Посещения.Обороты перестает работать, и требуется переписать алгоритм анализа непрерывности и периодичности визитов клиентов.
Разберем подробно, какими способами можно реализовать подобный анализ в 1С без использования регистра, а также рассмотрим альтернативные варианты архитектурного решения.
Проанализируем базовый запрос к таблице документов. Чтобы воспроизвести поведение параметра периодичности (например, Месяц или День), который ранее предоставляла виртуальная таблица оборотов регистра, используем встроенную функцию языка запросов НАЧАЛОПЕРИОДА внутри агрегатной функции КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ...).
Посмотрим на пример запроса, который выбирает клиентов и подсчитывает количество уникальных месяцев или дней, в которые были зафиксированы проведенные документы:
ВЫБРАТЬ
Посещение.Контрагент КАК Контрагент,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ НАЧАЛОПЕРИОДА(Посещение.Дата, МЕСЯЦ)) КАК КоличествоМесяцев
ИЗ
Документ.Посещение КАК Посещение
ГДЕ
Посещение.Проведен = ИСТИНА
И Посещение.Дата МЕЖДУ &НачалоПериода И &КонецПериода
СГРУППИРОВАТЬ ПО
Посещение.Контрагент
Разберем важные особенности этого запроса:
Документ.Посещение обязательным условием является отбор Посещение.Проведен = ИСТИНА, чтобы исключить помеченные на удаление и непроведенные документы.НАЧАЛОПЕРИОДА(Посещение.Дата, МЕСЯЦ) приводит все даты внутри одного календарного месяца к первому числу этого месяца. Оператор РАЗЛИЧНЫЕ исключает дублирование, если клиент посещал заведение несколько раз за месяц.Документ.Посещение.Клиенты), а обращение к дате и признаку проведения выполняется через реквизит Ссылка.Дата и Ссылка.Проведен.Если задача отчета заключается в поиске клиентов, которые посещали занятия строго без пропусков (или, наоборот, допустили пропуски в заданном интервале), в запрос добавляется секция ИМЕЮЩИЕ.
Рассмотрим пример запроса с посуточным или помесячным контролем пропусков с использованием функции РАЗНОСТЬДАТ:
ВЫБРАТЬ
Посещение.Контрагент КАК Контрагент,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ НАЧАЛОПЕРИОДА(Посещение.Дата, ДЕНЬ)) КАК КоличествоДней
ИЗ
Документ.Посещение КАК Посещение
ГДЕ
Посещение.Проведен = ИСТИНА
И Посещение.Дата МЕЖДУ &НачДата И &КонДата
СГРУППИРОВАТЬ ПО
Посещение.Контрагент
ИМЕЮЩИЕ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ НАЧАЛОПЕРИОДА(Посещение.Дата, ДЕНЬ)) = РАЗНОСТЬДАТ(&НачДата, &КонДата, ДЕНЬ) + 1
Если же необходимо проверить непрерывность внутри индивидуального диапазона посещений каждого конкретного клиента (от его первого до последнего визита), условие в секции ИМЕЮЩИЕ модифицируется с использованием минимальной и максимальной дат:
ИМЕЮЩИЕ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ НАЧАЛОПЕРИОДА(Посещение.Дата, МЕСЯЦ)) = РАЗНОСТЬДАТ(МИНИМУМ(НАЧАЛОПЕРИОДА(Посещение.Дата, МЕСЯЦ)), МАКСИМУМ(НАЧАЛОПЕРИОДА(Посещение.Дата, МЕСЯЦ)), МЕСЯЦ) + 1
Прямая выборка из таблиц документов имеет существенное ограничение производительности. В отличие от регистров накопления, где СУБД оперирует предрассчитанными итогами и кластерными индексами, сканирование больших таблиц документов при формировании отчетов за длительные периоды может замедлять работу базы данных.
Если объем данных велик, наиболее надежным решением с точки зрения архитектуры 1С является возвращение регистра накопления без изменения типовой конфигурации. Разберем по шагам, как это сделать с помощью расширения:
Адаптация или Дополнение.ПосещенияОбороты) с измерением Контрагент и ресурсом Количество.Посещение и создаем подписку на событие или переопределяем обработчик ОбработкаПроведения, в котором формируются движения по новому регистру накопления.Такой подход позволяет использовать прежний оптимизированный запрос к виртуальной таблице оборотов регистра без потери скорости формирования отчетов и без снятия конфигурации с поддержки.
Если отчет разрабатывается на базе СКД, для анализа непрерывности можно применить встроенный механизм дополнения периодов. Разберем, как это настроить:
Контрагент, Дата (с выражением НАЧАЛОПЕРИОДА(Дата, "Месяц")) и количество.Месяц.&НачалоПериода и &КонецПериода). СКД автоматически сформирует строки даже для тех месяцев, в которых документов посещений не было, что позволит наглядно отобразить разрывы в непрерывности посещений в итоговом отчете.