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

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

Срез первых в 1С: как работает виртуальная таблица и когда её использовать

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

Виртуальная таблица «СрезПервых» формируется платформой 1С для регистров сведений с режимом периодичности и возвращает самые ранние значения ресурсов на указанный момент времени. Проще говоря, запрос отвечает на вопрос: «Какие значения были установлены первыми в периоде до заданной даты?» Это зеркальный аналог более известного «СрезПоследних», который возвращает, наоборот, самые поздние записи.

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

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

Что такое виртуальная таблица СрезПервых

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

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

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

Синтаксис запроса и параметры

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

// Пример: первые цены номенклатуры на начало года

ВЫБРАТЬ

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

Срез.Цена,

Срез.Период

ИЗ

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

Если параметр периода опустить, платформа вернёт самые первые записи за всё время ведения регистра. Условие отбора записывается как строка языка запросов, например "Номенклатура = &Номенклатура". Важный нюанс: условие применяется до построения среза, то есть сначала отбираются записи, потом среди них ищутся первые. Это может существенно ускорить запрос, но меняет смысл результата.

В полях выборки доступны измерения, ресурсы, реквизиты регистра и стандартное поле Период. Если регистр подчинён регистратору, доступен и регистратор записи.

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

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

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

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

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

Что выбрать

СрезПервых

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

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

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

Прямая выборка из таблицы регистра

Нужны все записи за период или анализ динамики изменений — виртуальный срез здесь избыточен.

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

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

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

Практические сценарии применения

Первоначальная цена товара

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

Аудит изменений условий

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

Проверка корректности заполнения

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

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

Типичные ошибки и ограничения

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

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

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

Типичные ошибки
01
Передача даты без времени — теряются записи текущего дня, используйте КонецДня()
02
Ожидание пустых значений для измерений без записей — такие комбинации просто не попадают в результат
03
Условие отбора применяется до среза, а не после — результат отличается от фильтрации готовой выборки
04
Попытка использовать СрезПервых для непериодического регистра — ошибка запроса
05
Игнорирование поля Период в результате — без него нельзя понять, когда значение было установлено

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

Надёжный способ проверки — сопоставить результат среза с прямым просмотром регистра. Откройте регистр в режиме предприятия, отсортируйте по периоду и сравните первую запись по конкретному измерению с тем, что вернул запрос. Значения ресурсов и период должны совпасть.

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

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

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

Поле Период в результате
Норма

Период не позже даты отсечения

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

Период позже даты отсечения — ошибка в параметрах

Количество записей по измерению
Норма

Одна запись на комбинацию измерений

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

Несколько записей — возможно, срез применён не к той таблице

Сравнение со СрезПоследних на тех же данных
Норма

При одной записи в регистре результаты совпадают

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

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

FAQ

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

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

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

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

Почему условие отбора меняет результат, а не просто фильтрует его?

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

Как получить первую запись после определённой даты, а не до неё?

Штатный СрезПервых так не работает — отсечка действует только сверху. Решение: выборка из основной таблицы регистра с условием Период >= &Дата, упорядочиванием по периоду и группировкой по измерениям с функцией МИНИМУМ(Период).

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

Механика среза одинакова, но для регистра, подчинённого регистратору, в результате дополнительно доступно поле Регистратор — можно сразу увидеть, каким документом внесена первая запись, что удобно для аудита.

Итог

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

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