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

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

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

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

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

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

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

Как устроена виртуальная таблица «Срез первых»

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

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

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

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

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

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

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

Как написать запрос со срезом первых

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

Пример запроса, получающего первую установленную цену по каждому товару:

ВЫБРАТЬ

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

Срез.Период КАК ДатаПервойЦены,

Срез.Цена

ИЗ

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

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

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

Типовые сценарии применения

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

Начальное значение показателя

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

Дата первого появления записи

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

Проверка корректности истории

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

Производительность и ограничения

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

Основные правила безопасной работы со срезами на больших объёмах:

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

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

Большинство проблем возникает не из-за самой виртуальной таблицы, а из-за неверных ожиданий от её поведения.

Типичные ошибки
01
Ожидание, что поле Период вернёт дату из параметра. На самом деле возвращается реальная дата найденной первой записи — она может быть на годы раньше.
02
Отбор по ресурсу в параметрах виртуальной таблицы. Условие вида «Цена > 0» в параметрах среза недопустимо — такой отбор нужно накладывать в секции ГДЕ основного запроса.
03
Использование среза первых там, где нужен срез последних. Если задача — актуальное значение на дату, срез первых даст стартовое значение и исказит отчёт.
04
Игнорирование записей, сделанных после заданного периода. Срез учитывает только записи не позже указанной даты — если первая запись вообще сделана позже, она не попадёт в результат.
05
Левое соединение без учёта пустого результата. Если по части измерений записей нет, поля среза будут NULL — это нужно обрабатывать через ЕСТЬNULL.

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

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

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

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

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

Дата реальной первой записи, она раньше или равна заданному периоду

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

Дата позже заданного периода — значит, логика запроса нарушена

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

Одна строка на каждое сочетание измерений

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

Несколько строк по одному измерению — вероятно, в регистре есть лишние измерения, не учтённые в ожиданиях

Значение ресурса
Норма

Совпадает со значением самой ранней записи при ручном просмотре регистра

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

Возвращается значение другой записи — проверьте, не перепутаны ли срез первых и срез последних

Пустые строки
Норма

NULL только там, где записей действительно нет

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

NULL там, где записи есть — проверьте условие отбора и тип соединения таблиц

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

Часто задаваемые вопросы

Можно ли получить срез первых без запроса, встроенными средствами?

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

Что вернёт срез первых, если по измерению нет ни одной записи?

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

Учитывает ли срез первых записи, сделанные позже указанного периода?

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

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

Да. Для таких регистров сравнение идёт не только по дате, но и по позиции документа внутри неё, поэтому «первой» считается запись самого раннего документа. В поле Период при этом возвращается дата документа-регистратора.

Что быстрее: срез первых или запрос с МИНИМУМ по периоду и соединением?

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

Можно ли в отборе среза первых использовать вложенную таблицу или временную таблицу?

Да, типовой приём — поместить нужные ссылки во временную таблицу, а в условии среза написать «Измерение В (ВЫБРАТЬ Ссылка ИЗ ВременнаяТаблица)». Это эффективнее, чем передавать огромный массив параметром, и позволяет комбинировать срез с уже отобранными данными.

Итог

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

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