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