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

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

Регистр сведений в 1С: что такое срез последних и как его использовать

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

Регистр сведений в 1С — это объект конфигурации, который хранит информацию в разрезе заданных измерений: например, цены товаров, курсы валют, адреса сотрудников или ставки НДС. Если у регистра установлен режим «Периодический», каждая запись привязывается к дате, и одна и та же комбинация измерений может встречаться в таблице многократно — с разными значениями на разные моменты времени.

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

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

Как устроен срез последних и когда он появляется

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

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

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

Как написать запрос со срезом последних

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

// Актуальные цены на дату документа

ВЫБРАТЬ

Цены.Номенклатура КАК Номенклатура,

Цены.Цена КАК Цена

ИЗ

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

Если дату не указать (оставить круглые скобки пустыми), срез будет построен на максимально возможную дату — фактически «на текущий момент». Это удобно для отчётов об актуальном состоянии, но опасно в проведении документов: документ задним числом получит будущие значения. Поэтому в модулях проведения дату среза всегда передают явно — как правило, дату документа.

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

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

В конструкторе запросов виртуальная таблица выбирается в дереве объектов внутри ветки регистра сведений. После добавления в список таблиц на вкладке «Таблицы и поля» появляется кнопка «Параметры виртуальной таблицы», где задаются дата и условие отбора. Конструктор сам подставит параметры &Период и текст условия.

Получение значений на дату каждого документа

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

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

ВЫБРАТЬ

Продажи.Номенклатура КАК Номенклатура,

Продажи.Дата КАК Дата,

МАКСИМУМ(Курсы.Период) КАК ПериодКурса

ПОМЕСТИТЬ ДатыКурсов

ИЗ

Продажи КАК Продажи

ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК Курсы

ПО Курсы.Валюта = Продажи.Валюта

И Курсы.Период <= Продажи.Дата

СГРУППИРОВАТЬ ПО Продажи.Номенклатура, Продажи.Дата

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

Порядок получения актуального значения
  1. 1
    Убедитесь, что регистр сведений периодический — иначе среза не существует
  2. 2
    Напишите запрос к таблице РегистрСведений.ИмяРегистра.СрезПоследних
  3. 3
    Передайте дату среза параметром — в проведении это дата документа
  4. 4
    При большом объёме добавьте отбор по измерениям во второй параметр
  5. 5
    Проверьте результат на тестовых данных с несколькими записями в разные даты

Отличие среза последних от среза первых и от основной таблицы

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

ТаблицаЧто возвращаетКогда применять
Основная таблица регистраВсе записи за всё времяИстория изменений, анализ динамики, корректировка данных
Срез последнихПо одной самой поздней записи на датуАктуальные цены, курсы, ставки, настройки
Срез первыхПо одной самой ранней записи на датуНачальные значения, дата первого появления записи

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

Производительность: когда срез становится проблемой

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

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

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

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

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

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

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

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

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

Количество строк в срезе
Норма

Равно числу уникальных комбинаций измерений

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

Строк больше — вероятны дубли записей на один период

Значения на контрольную дату
Норма

Совпадают с последней записью в основной таблице до этой даты

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

Подтянулась более поздняя или более ранняя запись — проверьте параметр даты

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

Все строки документа сохранены, у части значения NULL

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

Строки пропали — использовано внутреннее соединение вместо левого

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

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

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

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

Оптимальна в запросах по множеству объектов; требует периодичности регистра и аккуратной передачи параметров

Метод ПолучитьПоследнее

Подходит для точечного чтения одного значения из кода; для списков объектов порождает множество обращений к базе

Максимум периода с группировкой

Гибкий ручной способ для среза на разные даты; сложнее в написании и отладке

Дублирующий непериодический регистр

Быстрое чтение актуальных значений на больших объёмах; требует синхронизации при записи и контроля расхождений

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

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

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

Почему срез последних недоступен для моего регистра сведений?

Виртуальные таблицы срезов создаются только для периодических регистров. Откройте свойства регистра в конфигураторе и проверьте поле «Периодичность»: если там «Непериодический», срезов не будет. Либо включите периодичность (с перезаписью существующих данных), либо работайте с основной таблицей — у непериодического регистра записи и так уникальны по измерениям.

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

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

Как получить срез последних на текущую дату?

Оставьте параметры виртуальной таблицы пустыми: СрезПоследних() — платформа построит срез на максимальную дату. Либо передайте текущую дату явно через параметр. Явная передача предпочтительнее: запрос становится предсказуемым и легче тестируется на исторических данных.

Можно ли использовать срез последних в СКД и отчётах?

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

Чем срез последних отличается от виртуальной таблицы остатков регистра накопления?

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

Влияет ли режим «подчинение регистратору» на срез последних?

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

Итог

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

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