К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как работает срез последних в запросе 1С

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

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

Разработчику важно понимать, что срез последних — это не физическая таблица, а результат, который платформа вычисляет на лету по данным регистра. От того, как построен запрос, зависит скорость его выполнения: неправильно написанный запрос со срезом способен сканировать миллионы записей, хотя нужна была сотня.

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

Что такое виртуальная таблица СрезПоследних

Виртуальная таблица РегистрСведений.<ИмяРегистра>.СрезПоследних доступна только для периодических регистров сведений. Она содержит все измерения регистра, поле Период и все ресурсы и реквизиты той записи, которая является последней на момент среза. Если для какой-то комбинации измерений записей нет вообще, такая комбинация в срез не попадает.

Логика отбора проста: платформа берёт все записи регистра с периодом меньше или равным указанной дате, группирует их по измерениям и для каждой группы выбирает запись с максимальным периодом. Если на один и тот же период есть несколько записей по одному сочетанию измерений, выбирается запись с большим моментом времени или с большим значением служебного порядка — в типичном сценарии это последняя введённая запись.

Если дата среза не указана, срез строится без ограничения по времени — возвращается последняя запись по каждой комбинации измерений за всю историю регистра. Такой вариант допустим, но часто приводит к избыточной обработке данных, особенно на больших регистрах.

Синтаксис и параметры виртуальной таблицы

Срез последних вызывается в секции ИЗ запроса с двумя параметрами в скобках: первый — дата среза, второй — условие отбора по измерениям. Оба параметра необязательны, но их грамотное использование критично для производительности.

ВЫБРАТЬ

Срез.Номенклатура,

Срез.Цена,

Срез.Период

ИЗ

РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаСреза, ТипЦен = &ТипЦен) КАК Срез

Первый параметр — выражение даты. В него можно передать параметр запроса, константу даты или выражение. Если нужен срез на конец дня, передавайте дату со временем 23:59:59 или используйте функцию КОНЕЦПЕРИОДА(&Дата, ДЕНЬ), иначе записи, сделанные в течение дня, могут не попасть в срез.

Второй параметр — условие на языке запросов, которое применяется к измерениям регистра до вычисления среза. Именно здесь следует фильтровать данные: например, по типу цен, организации, валюте. Условие во втором параметре выполняется на уровне выборки из регистра, тогда как фильтр в секции ГДЕ применяется уже к готовому результату среза.

Почему параметры важнее секции ГДЕ

Самая частая причина медленных запросов со срезом последних — фильтрация результата через ГДЕ вместо параметра виртуальной таблицы. Когда условие стоит в ГДЕ, платформа сначала вычисляет срез по всем записям регистра, а потом отбрасывает лишнее. На регистре с миллионами записей это означает полное сканирование и группировку всей таблицы.

Когда условие передано вторым параметром, платформа ограничивает выборку ещё до группировки. Разница во времени выполнения на больших регистрах может достигать десятков и сотен раз. Это особенно заметно в отчётах, где срез соединяется с таблицей документов или справочника.

Ещё эффективнее работает схема, когда сначала во временную таблицу выбирается список нужных объектов (например, номенклатура из табличной части документа), а затем срез соединяется с этой таблицей. В этом случае оптимизатор СУБД получает узкий набор ключей и вычисляет срез только по ним.

Порядок построения быстрого запроса со срезом
  1. 1
    Поместите список нужных объектов (измерений) во временную таблицу с индексом по полям соединения
  2. 2
    Вызовите СрезПоследних с параметром даты и условием по измерениям
  3. 3
    Соедините временную таблицу со срезом по всем измерениям
  4. 4
    Проверьте время выполнения на копии рабочей базы с реальным объёмом данных

Примеры типовых запросов со срезом последних

Актуальные цены для списка товаров

Классическая задача — получить цены только для товаров из конкретного документа. Соединение со временной таблицей исключает вычисление среза по всей номенклатуре базы.

ВЫБРАТЬ

Товары.Номенклатура КАК Номенклатура

ПОМЕСТИТЬ ВТ_Товары

ИЗ

&ТаблицаТоваров КАК Товары

ИНДЕКСИРОВАТЬ ПО

Номенклатура

;

ВЫБРАТЬ

Товары.Номенклатура,

ЕСТЬNULL(Цены.Цена, 0) КАК Цена

ИЗ

ВТ_Товары КАК Товары

ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(

&Дата, ТипЦен = &ТипЦен) КАК Цены

ПО Товары.Номенклатура = Цены.Номенклатура

Срез с учётом нескольких измерений

Если регистр имеет несколько измерений (например, организация и сотрудник), соединение должно идти по всем измерениям, участвующим в задаче. Пропуск одного измерения в условии соединения приведёт к декартову перемножению строк и неверным итогам.

Левое соединение и отсутствующие записи

Используйте ЛЕВОЕ СОЕДИНЕНИЕ, если часть объектов может не иметь записей в регистре, и обрабатывайте NULL через ЕСТЬNULL. Внутреннее соединение молча отбросит объекты без цен, что в отчётах выглядит как потеря строк.

bsl
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Срез.Сотрудник, Срез.Должность ИЗ РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(&ДатаСреза, Организация = &Организация) КАК Срез";
Запрос.УстановитьПараметр("ДатаСреза", КонецДня(ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("Организация", Организация);
Результат = Запрос.Выполнить().Выгрузить();

Типичные ошибки при работе со срезом последних

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

Вторая ошибка — ожидание, что срез вернёт записи по всем объектам справочника. Срез возвращает только те комбинации измерений, по которым есть записи в регистре. Если по товару цена никогда не устанавливалась, его в срезе не будет — об этом нужно помнить при проектировании отчётов.

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

Типичные ошибки
01
Фильтрация через ГДЕ вместо параметра виртуальной таблицы — срез вычисляется по всему регистру
02
Передача даты без времени — записи текущего дня теряются
03
Внутреннее соединение со срезом — объекты без записей пропадают из результата
04
Соединение не по всем измерениям — строки дублируются, итоги завышаются
05
Срез внутри цикла по датам — запрос выполняется многократно вместо одного обращения к регистру

Производительность: как срез выполняется на СУБД

На уровне СУБД срез последних обычно разворачивается в подзапрос с группировкой по измерениям и поиском максимального периода с последующим соединением. Скорость зависит от наличия подходящих индексов — платформа создаёт их по структуре регистра, но при нестандартных отборах план запроса может оказаться неоптимальным.

На больших регистрах (миллионы записей) даже правильно написанный срез может выполняться заметное время. Практические приёмы ускорения: ограничение состава измерений в условии, использование временных таблиц с узким списком ключей, вынос среза в отдельный пакет запроса, а в критичных случаях — хранение актуальных значений в отдельном непериодическом регистре, который заполняется при записи основного.

Проверить реальное поведение запроса помогает консоль запросов с замером времени и анализ плана запроса средствами СУБД. Ориентироваться стоит не на абстрактные нормы, а на приемлемое время отклика конкретного отчёта на реальном объёме данных.

Контрольные точки

Как проверить результат

Время выполнения запроса
Норма

Запрос выполняется за время, приемлемое для интерактивной работы

Тревожный признак

Запрос выполняется десятки секунд и дольше на типовом отчёте

Состав строк результата
Норма

По каждой комбинации измерений ровно одна строка с актуальным периодом

Тревожный признак

Дубли строк или отсутствие объектов, по которым записи есть

Период в результате
Норма

Период не позже даты среза и является максимальным из имеющихся

Тревожный признак

Период старше ожидаемого — признак потери записей из-за времени в дате среза

Альтернативы срезу последних

Срез последних — не единственный способ получить актуальные значения. В зависимости от задачи может быть выгоднее другой подход. Выбор определяется частотой обращений, объёмом регистра и требованиями к актуальности данных.

ПодходКогда подходитОграничения
СрезПоследних с параметрамиЭпизодические отчёты, небольшие и средние регистрыВычисляется при каждом обращении
Временная таблица + срезСрез по узкому списку объектовТребует подготовки списка ключей
Отдельный регистр актуальных значенийЧастые обращения, большие объёмыНужна логика поддержания актуальности при записи
Запрос к основной таблице с МАКСИМУМ(Период)Нестандартная логика выбора записиСложнее в сопровождении, легко ошибиться

Отдельный регистр актуальных значений — распространённый приём в высоконагруженных решениях: при записи в основной регистр та же процедура обновляет сводную таблицу «текущих» значений, и отчёты читают её без всяких срезов. Платой является усложнение логики записи и риск рассинхронизации при обменах и загрузках данных.

Сравнение вариантов

СрезПоследних с параметрами

Просто и надёжно; подходит для большинства отчётов. Ограничение — стоимость вычисления при каждом выполнении

Регистр актуальных значений

Мгновенное чтение актуальных данных. Ограничение — нужно поддерживать при записи и следить за целостностью

Соединение с временной таблицей

Лучшая производительность при известном списке объектов. Ограничение — не работает для произвольных отборов

FAQ по срезу последних

Почему срез на текущую дату не видит записи, сделанные сегодня?

Параметр даты без времени интерпретируется как начало дня. Передайте конец дня — функцию КОНЕЦПЕРИОДА(&Дата, ДЕНЬ) в тексте запроса или КонецДня() при установке параметра из кода.

Можно ли во втором параметре среза отфильтровать по ресурсу, например Цена > 0?

Нет, условие виртуальной таблицы работает только по измерениям регистра. Отбор по ресурсам и реквизитам размещайте в секции ГДЕ основного запроса — он применится к уже вычисленному срезу.

Что вернёт срез, если по объекту нет ни одной записи в регистре?

Такая комбинация измерений просто не попадёт в результат. Чтобы объект сохранился в выборке, используйте левое соединение со срезом и обрабатывайте NULL функцией ЕСТЬNULL.

Чем СрезПоследних отличается от СрезПервых?

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

Работает ли срез последних для регистров, подчинённых регистратору?

Да, для периодических регистров сведений с режимом «подчинение регистратору» виртуальная таблица доступна. Дополнительно становится доступным поле Регистратор, а при равенстве периодов последней считается запись с более поздним моментом времени документа.

Как ускорить отчёт, который строит срез в цикле по датам?

Замените цикл одним запросом к основной таблице регистра с группировкой по датам и измерениям, либо получите срезы по всем нужным датам через соединение с таблицей дат. Многократное выполнение среза в цикле — один из самых затратных антипаттернов.

Итог

Что важно запомнить

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