Как вычислить разность дат между соседними записями в запросе 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Решение через самосоединение таблицы

Самым классическим способом решения этой задачи является соединение временной таблицы с самой собой. Мы сопоставляем каждую запись с той, которая идет следом или предшествует ей, используя условие по дате.

Предположим, у нас есть временная таблица ВТ_ДОКИ, содержащая поля Ссылка и Дата. Чтобы найти разность с предыдущим документом, воспользуемся следующим подходом:


ВЫБРАТЬ
    тт1.Ссылка,
    тт1.Дата,
    РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(МИНИМУМ(тт2.Дата), ДЕНЬ), НАЧАЛОПЕРИОДА(тт1.Дата, ДЕНЬ), ДЕНЬ) КАК РазностьДатМеждуДокументами
ИЗ
    ВТ_ДОКИ КАК тт1
ЛЕВОЕ СОЕДИНЕНИЕ
    ВТ_ДОКИ КАК тт2
ПО
    тт1.Дата < тт2.Дата
СГРУППИРОВАТЬ ПО
    тт1.Ссылка, тт1.Дата

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

Использование автонумерации строк

Если самосоединение работает слишком медленно или задача требует строгой последовательности, можно использовать нумерацию строк. В 1С есть нюанс: сортировка временной таблицы возможна только при использовании конструкции ПЕРВЫЕ. Мы можем использовать максимально большое число, чтобы включить всю таблицу в нумерацию.

  1. Создаем временную таблицу с АВТОНОМЕРЗАПИСИ.
  2. Используем ключевое слово ПЕРВЫЕ 999999999 для обеспечения сортировки данных по дате.
  3. Соединяем таблицу саму с собой по условию ВТ.НомерЗаписи + 1 = ВТ2.НомерЗаписи.

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

Особенности реализации в динамических списках

При использовании Динамического списка необходимо помнить, что запрос выполняется при каждом обновлении данных. Поэтому:

Рекомендации по оптимизации

При работе с большими объемами данных помните о следующих моментах:

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

Во-вторых, если вы используете ЛЕВОЕ СОЕДИНЕНИЕ, следите за индексацией полей Дата и Ссылка во временных таблицах — это критически важно для производительности СУБД (SQL Server или PostgreSQL).

В-третьих, если ваша версия платформы 1С выше 8.3.17, обратите внимание на оконные функции. Использование функций типа ЛАГ (LAG) — это современный стандарт, который позволяет избежать создания громоздких конструкций с соединениями, делая код запроса чище и значительно быстрее.

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

← На главную