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