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