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