В процессе работы с данными регистров сведений часто возникает задача анализа временных рядов. Рассмотрим ситуацию, когда необходимо определить суммарное время, в течение которого зафиксированные показатели (например, температура) превышали установленное пороговое значение. Сложность заключается в том, что данные могут содержать «разрывы» — моменты, когда показатель опускался ниже нормы, и их необходимо корректно исключать из расчетов.
Прежде чем приступать к написанию кода, проанализируем структуру нашего регистра. Обычно мы имеем два ключевых поля: Период (дата и время замера) и Значение (температура). Проблема возникает из-за дискретности: данные поступают через равные или неравные промежутки времени. Если мы просто воспользуемся конструкцией ГДЕ Температура >= 110, мы потеряем информацию о контексте и не сможем корректно сгруппировать периоды, если между валидными записями были пропуски.
Рассмотрим пошаговый метод обработки данных с помощью пакетных запросов. Суть метода заключается в создании промежуточных таблиц для последовательного вычисления длительности каждого «удачного» отрезка.
Шаг 1. Формирование временной таблицы. Нам необходимо преобразовать исходные данные, добавив вычисляемый признак учета времени. Это позволит нам унифицировать логику для всех записей.
ВЫБРАТЬ
ИсходнаяТаблица.Период КАК Период,
ИсходнаяТаблица.Температура КАК Температура,
ВЫБОР
КОГДА ИсходнаяТаблица.Температура >= &Порог ТОГДА 15
ИНАЧЕ 0
КОНЕЦ КАК Длительность
ПОМЕСТИТЬ втДанные
ИЗ
РегистрСведений.ТемпературныйРежим КАК ИсходнаяТаблица;
Шаг 2. Расчет итогового времени. После того как мы получили временную таблицу с рассчитанной Длительность для каждой строки (где 15 — это интервал между замерами в секундах), задача упрощается до простой агрегации.
ВЫБРАТЬ
СУММА(втДанные.Длительность) КАК ОбщееВремяВСекундах
ИЗ
втДанные КАК втДанные;
Если задача требует более высокой точности, например, с учетом того, что прибор мог давать сбои или нам нужно знать точное количество периодов, используйте подход с соединением таблицы самой на себя.
ВЫБОР КОГДА ... ТОГДА ... КОНЕЦ.ЛЕВОЕ СОЕДИНЕНИЕ, чтобы сравнить текущую запись с предыдущей по полю Период.РАЗНОСТЬДАТ(НачалоПериода, КонецПериода, СЕКУНДА) для получения точного количества секунд в каждом интервале.РАЗНОСТЬДАТ между соседними записями, которые соответствуют условию.ЕСТЬNULL).ПОМЕСТИТЬ позволяет разбить сложный алгоритм на читаемые блоки, что значительно упрощает отладку запроса при работе с большими объемами данных.Таким образом, мы рассмотрели наиболее эффективные способы решения задачи. Выбор конкретного метода зависит от требований к точности и качества поступающих в регистр данных. Если вы работаете с регулярными замерами, простейший метод с ВЫБОР в запросе даст быстрый результат, а при необходимости точного учета сбоев оборудования — используйте метод группировки интервалов через временные таблицы.