Виртуальная таблица СрезПоследних в 1С:Предприятие 8.3 — синтаксис, параметры и примеры использования

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

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

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

Теоретические основы: что такое СрезПоследних?

Виртуальная таблица СрезПоследних предназначена исключительно для регистров сведений (для регистров накопления используются виртуальные таблицы «Остатки» и «Обороты»).

Главное правило: для каждой уникальной комбинации значений измерений регистра сведений таблица возвращает ровно одну запись — самую последнюю (по периоду/моменту времени) на указанную дату среза.

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

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

В тексте запроса обращение выглядит следующим образом:

РегистрСведений;ИмяРегистра.СрезПоследних(<ДатаСреза>, <УсловиеОтбора>)

Параметры:

  1. ДатаСреза (обязательный, тип Дата) — дата (и время), на которую нужно получить актуальные данные.
    • Можно передать параметр запроса (например, &ДатаОтчета).
    • Можно использовать функции языка запросов: ТЕКУЩАЯДАТА, ДАТАВРЕМЯ(2023, 12, 31, 23, 59, 59).
  2. УсловиеОтбора (необязательный, тип Строка), строка с условием отбора в синтаксисе языка запросов (аналог секции ГДЕ), применяемое до взятия среза.
    • Позволяет отфильтровать записи регистра еще на этапе чтения с диска (оптимизация производительности).
    • Пример: "ТипЦен = &ТипЦен И Валюта = &Валюта".

Базовые примеры использования

Пример 1: Простой срез на дату параметра

Получаем последние цены номенклатуры на дату отчета.

ВЫБРАТЬ
 ЦеныНоменклатурыСрезПоследних.Номенклатура,
 ЦеныНоменклатурыСрезПоследних.ТипЦен,
 ЦеныНоменклатурыСрезПоследних.Цена
ИЗ
 РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаОтчета) КАК ЦеныНоменклатурыСрезПоследних

Пример 2: Использование параметра отбора (второй параметр)

Это рекомендуемый способ фильтрации по измерениям, так как он работает быстрее, чем соединение (JOIN) или условие WHERE над результатом среза.

ВЫБРАТЬ
 КурсыВалютСрезПоследних.Валюта,
 КурсыВалютСрезПоследних.Курс
ИЗ
 РегистрСведений.КурсыВалют.СрезПоследних(&ДатаОтчета, "Валюта = &ВалютаРубль") КАК КурсыВалютСрезПоследних

Пример 3: Срез на конкретную дату/время (хардкод или вычисляемое выражение)

ВЫБРАТЬ
 СрезПоследних.Номенклатура,
 СрезПоследних.Характеристика,
 СрезПоследних.Количество
ИЗ
 РегистрСведений.ОстаткиТоваров.СрезПоследних(ДАТАВРЕМЯ(2026, 1, 1, 0, 0, 0)) КАК СрезПоследних

Продвинутые сценарии и паттерны

Срез последних на каждую дату из набора дат (например, по документам)

Частая задача: есть таблица документов (или дат), нужно получить курс валюты/цену на дату каждого документа.

Решение: Использование временной таблицы (ВТ) и соединения (ЛЕВОЕ СОЕДИНЕНИЕ).

// 1. Помещаем даты документов во временную таблицу
ВЫБРАТЬ
 РеализацияТоваровУслуг.Ссылка КАК Документ,
 РеализацияТоваровУслуг.Дата КАК ДатаДокумента
ПОМЕСТИТЬ ВТ_ДатыДокументов
ИЗ
 Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
 РеализацияТоваровУслуг;Дата МЕЖДУ &НачалоПериода И &КонецПериода
;
// 2. Делаем срез последних на каждую дату из ВТ
// Важно: Соединяем по Измерениям + ДатаСреза = ДатаДокумента
ВЫБРАТЬ
 ВТ_ДатыДокументов.Документ,
 ВТ_ДатыДокументов.ДатаДокумента,
 КурсыВалютСрезПоследних.Курс
ИЗ
 ВТ_ДатыДокументов КАК ВТ_ДатыДокументов
 ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(ВТ_ДатыДокументов.ДатаДокумента, "Валюта = &ВалютаUSD") КАК КурсыВалютСрезПоследних
 ПО (ИСТИНА) // Условие соединения не нужно, так как срез уже сделан на нужную дату
 // Если нужно соединить по измерениям (например, Валюта), условие ПО добавляется явно

> Важно: Платформа 1С позволяет передать в параметр ДатаСреза не только константу или параметр запроса, но и поле другой таблицы (как в примере выше: ВТ_ДатыДокументов.ДатаДокумента). Это ключевая фича для построения отчетов «на каждую дату».

Получение среза по ключу записи (для программного доступа)

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

ВЫБРАТЬ
 СрезПоследних.Показатель1
ИЗ
 РегистрСведений.МойРегистр.СрезПоследних(&Дата, "КлючЗаписи = &МойКлюч") КАК СрезПоследних

Особенности периодичности: «В пределах секунды» vs «В пределах дня»

  • Периодичность «В пределах секунды» (Момент времени): Срез ищет запись с максимальным значением поля Период (тип Дата с точностью до секунды). Если есть несколько записей в одну секунду — берется последняя по автоупорядочиванию (обычно по регистратору).
  • Периодичность «В пределах дня» (или месяца/года): Поле Период хранит только дату (время 00:00:00). Срез последних на дату 2026-01-15 12:00:00 вернет запись за 2026-01-15, если она есть. Если записи за эту дату нет — вернет запись за предыдущую дату (месяц/год).

Типичные ошибки и ловушки

Ошибка 1: Использование WHERE вместо параметра отбора

Плохо:

ВЫБРАТЬ ... ИЗ РегистрСведений.Цены.СрезПоследних(&Дата) ГДЕ Номенклатура = &Ном

Платформа сначала построит срез по всей таблице цен (все номенклатуру), а потом отфильтрует. На больших объемах это катастрофа для производительности.

Хорошо:

ВЫБРАТЬ ... ИЗ РегистрСведений.Цены.СрезПоследних(&Дата, "Номенклатура = &Ном")

Ошибка 2: Игнорирование измерений в результате

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

Ошибка 3: Попытка использовать СрезПоследних для регистра накопления

Компилятор выдаст ошибку: «Виртуальная таблица СрезПоследних недоступна для регистра накопления…». Используйте Остатки(&Дата, ...).

Ошибка 4: Некорректная дата среза (NULL или «пустая» дата)

Если параметр &ДатаОтчета не передан (равен ДАТАВРЕМЯ(1,1,1)), срез вернет пустой результат (нет записей раньше 0001 года). Всегда проверяйте заполненность даты перед выполнением запроса.

Оптимизация и лучшие практики

  1. Всегда используйте второй параметр (УсловиеОтбора) для фильтрации по измерениям. Это позволяет СУБД использовать индексы регистра эффективно (Index Seek вместо Index Scan).
  2. Индексы регистра: Убедитесь, что у регистра сведений настроены правильные индексы (обычно платформа создает их автоматически по измерениям + периоду, но для сложных отборов могут потребоваться дополнительные).
  3. Избегайте лишних полей: В списке выборки (SELECT) указывайте только нужные ресурсы и измерения. Не пишите ВЫБРАТЬ *.
  4. Временные таблицы для массовых срезов: Если нужно сделать срез на 10 000 разных дат (например, для каждого документа за год), передача таблицы дат в параметр среза (как в п. 4.1) — единственно верный путь. Цикл по датам с выполнением 10 000 запросов «убьет» производительность.
  5. Поле «Период» в результате: Виртуальная таблица возвращает поле Период — дату/время найденной записи. Это полезно для отладки: можно проверить, какая именно запись попала в срез.

Пример комплексного запроса (Шаблон для копирования)

ВЫБРАТЬ
 Товары.Ссылка КАК Номенклатура,
 Товары.Артикул,
 // Берем цену на дату отчета для конкретного типа цен
 ЦеныСрез.Цена КАК ЦенаРеализации,
 ЦеныСрез.Период КАК ДатаУстановкиЦены
ИЗ
 Справочник.Номенклатура КАК Товары
 ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
 &ДатаОтчета, 
 "ТипЦен = &ТипЦенРозница И Валюта = &ВалютаРуб"
 ) КАК ЦеныСрез
 ПО Товары.Ссылка = ЦеныСрез.Номенклатура
ГДЕ
 Товары.ПометкаУдаления = ЛОЖЬ
 И Товары.ЭтоГруппа = ЛОЖЬ
УПОРЯДОЧИТЬ ПО
 Товары.Наименование

Виртуальная таблица СрезПоследних — это мощный и оптимизированный на уровне СУБД инструмент для получения актуальных значений регистров сведений. Ключевые моменты для профессионального использования:

  • Понимать, что срез делается по измерениям (одна запись на комбинацию).
  • Обязательно использовать второй параметр (УсловиеОтбора) для предварительной фильтрации.
  • Уметь передавать поле даты из другой таблицы в параметр среза для решения задач «срез на каждую дату».
  • Учитывать периодичность регистра (секунда/день) при интерпретации результатов.

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