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