При разработке отчетов или динамических списков в 1С часто возникает задача сравнения текущей записи с предыдущей или следующей. Например, нам нужно вычислить количество дней, прошедших с даты предыдущего документа, чтобы проанализировать интервалы между операциями. Разберем, как реализовать такую задачу средствами языка запросов 1С.
Самым классическим способом решения этой задачи является соединение временной таблицы с самой собой. Мы сопоставляем каждую запись с той, которая идет следом или предшествует ей, используя условие по дате.
Предположим, у нас есть временная таблица ВТ_ДОКИ, содержащая поля Ссылка и Дата. Чтобы найти разность с предыдущим документом, воспользуемся следующим подходом:
ВЫБРАТЬ
тт1.Ссылка,
тт1.Дата,
РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(МИНИМУМ(тт2.Дата), ДЕНЬ), НАЧАЛОПЕРИОДА(тт1.Дата, ДЕНЬ), ДЕНЬ) КАК РазностьДатМеждуДокументами
ИЗ
ВТ_ДОКИ КАК тт1
ЛЕВОЕ СОЕДИНЕНИЕ
ВТ_ДОКИ КАК тт2
ПО
тт1.Дата < тт2.Дата
СГРУППИРОВАТЬ ПО
тт1.Ссылка, тт1.Дата
Важное примечание: При использовании этого метода для группировки по контрагентам, убедитесь, что вы добавляете поле контрагента как в условие соединения, так и в группировку, иначе расчеты могут затрагивать весь объем данных, игнорируя границы контрагента.
Если самосоединение работает слишком медленно или задача требует строгой последовательности, можно использовать нумерацию строк. В 1С есть нюанс: сортировка временной таблицы возможна только при использовании конструкции ПЕРВЫЕ. Мы можем использовать максимально большое число, чтобы включить всю таблицу в нумерацию.
АВТОНОМЕРЗАПИСИ.ПЕРВЫЕ 999999999 для обеспечения сортировки данных по дате.ВТ.НомерЗаписи + 1 = ВТ2.НомерЗаписи.Этот метод гарантирует, что мы будем сравнивать запись строго с «соседом» по порядку, что исключает ошибки, возникающие при совпадении дат в разных документах.
При использовании Динамического списка необходимо помнить, что запрос выполняется при каждом обновлении данных. Поэтому:
Систему Компоновки Данных (СКД).ВычислитьВыражение, которое позволяет обращаться к предыдущим записям без перегрузки запроса к базе данных сложными JOIN-ами.При работе с большими объемами данных помните о следующих моментах:
Во-первых, всегда обеспечивайте уникальность. Если несколько документов имеют абсолютно одинаковую дату, сортировка может быть непредсказуемой. Включайте в условие сортировки Ссылка или любой другой уникальный идентификатор записи.
Во-вторых, если вы используете ЛЕВОЕ СОЕДИНЕНИЕ, следите за индексацией полей Дата и Ссылка во временных таблицах — это критически важно для производительности СУБД (SQL Server или PostgreSQL).
В-третьих, если ваша версия платформы 1С выше 8.3.17, обратите внимание на оконные функции. Использование функций типа ЛАГ (LAG) — это современный стандарт, который позволяет избежать создания громоздких конструкций с соединениями, делая код запроса чище и значительно быстрее.
Рассмотренные выше методы помогут вам эффективно решать аналитические задачи по расчету интервалов между событиями в 1С. Выбирайте вариант, исходя из требований к производительности и версии используемой вами платформы.