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

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

Срез последних в 1С: что это такое и как с ним работать

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

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

Механизм встроен в платформу и доступен для любого периодического регистра сведений. Разработчику не нужно писать сложный запрос с группировкой по максимальной дате — достаточно обратиться к виртуальной таблице «СрезПоследних» и передать ей параметры. Платформа сама сформирует оптимальное обращение к базе данных.

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

Где хранятся данные и почему нужен срез

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

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

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

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

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

Типовой пример запроса, возвращающего актуальные цены:

ВЫБРАТЬ

Срез.Номенклатура,

Срез.ТипЦен,

Срез.Цена

ИЗ

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

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

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

Как работает платформа при выполнении среза

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

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

Параметры и отборы: как ускорить запрос

Главное правило производительности: все отборы по измерениям регистра передавайте во второй параметр виртуальной таблицы, а не в секцию ГДЕ основного запроса. Условие в параметрах применяется до вычисления среза, условие в ГДЕ — после, когда платформа уже обработала все записи регистра.

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

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

Порядок получения актуальных данных
  1. 1
    Определите периодический регистр сведений, где хранятся нужные значения
  2. 2
    Сформулируйте дату среза — чаще всего текущая дата или дата документа
  3. 3
    Напишите запрос к виртуальной таблице СрезПоследних с параметром периода
  4. 4
    Добавьте отбор по измерениям во второй параметр виртуальной таблицы
  5. 5
    Выполните запрос и проверьте результат на контрольном элементе справочника

Типовые сценарии использования

Актуальные цены в документах и отчётах

При формировании прайса или подстановке цены в заказ срез последних по регистру цен даёт текущее значение на дату документа. Если документ проводится задним числом, передайте в параметр дату документа — получите цену, действовавшую на тот момент, а не сегодняшнюю.

Курсы валют на дату операции

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

Ответственные лица и значения по умолчанию

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

Маршрут решения

Как выбрать подход

Нужно одно актуальное значение на датуИспользуйте СрезПоследних с параметром периода
Нужно первое значение после даты (например, будущая цена)Используйте виртуальную таблицу СрезПервых
Нужна вся история измененийЧитайте физическую таблицу регистра без виртуальных таблиц
Регистр непериодическийСрез недоступен — данные и так актуальны, читайте таблицу напрямую

Частые ошибки и как их избежать

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

Ещё одна проблема — задвоение строк из-за нескольких записей на одну дату. Возникает после обменов, загрузок из внешних файлов или ручного редактирования регистра. Лечится поиском и удалением дублей, а в новых разработках — контролем уникальности при записи.

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

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

Срез первых и альтернативные подходы

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

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

Сравнение подходов

Срез последних

Стандартный способ, всегда актуален, но требует вычислений при каждом обращении

Дублирование в реквизите справочника

Быстрое чтение, но нужен код синхронизации и контроль расхождений

Срез первых

Для поиска ближайшего будущего значения, не заменяет срез последних

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

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

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

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

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

Совпадение с данными регистра
Норма

Значение из среза равно последней записи по измерению в форме списка регистра

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

Срез возвращает устаревшее или пустое значение

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

По каждой комбинации измерений ровно одна строка

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

Дубли строк — в регистре несколько записей на один период

Дата среза
Норма

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

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

Используется текущая дата при анализе исторических документов

Итог

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

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

Частые вопросы

Чем срез последних отличается от обычного чтения регистра?

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

Можно ли использовать срез последних для непериодического регистра?

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

Почему срез последних возвращает дубли строк?

Если на один и тот же период по одной комбинации измерений в регистре несколько записей, все они попадут в срез. Такое бывает после обменов данными, загрузок или ручного редактирования. Найдите дубли группировкой по измерениям и периоду и удалите лишние записи.

Как получить цену, которая действовала на дату старого документа?

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

Что делать, если запрос со срезом последних выполняется медленно?

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

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

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