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