Может ли запрос к виртуальной таблице «СрезПоследних» вернуть несколько записей по одному значению измерения?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Постановка задачи и анализ структуры регистра

Представим периодический регистр сведений, у которого установлено свойство РежимЗаписи = ПодчинениеРегистратору. У регистра есть одно измерение (например, Склад) и ресурс (например, Цена). Мы выполняем запрос к виртуальной таблице СрезПоследних, накладывая условие на это единственное измерение. Возникает закономерное сомнение: если в одну и ту же секунду (один и тот же период) по этому складу были сделаны записи разными документами, не «запутается» ли система и не выдаст ли она обе записи?

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

  1. Период (дата и время записи).
  2. Регистратор (ссылка на документ, создавший запись).
  3. Номер строки (внутри набора записей одного документа).

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

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

Проанализируем ситуацию, когда несколько записей претендуют на звание «последних»:

Разбор на примере кода запроса

Посмотрим на пример типичного запроса, который может вызвать вопросы у разработчика:


ВЫБРАТЬ
    РегистрСрез.Цена,
    РегистрСрез.Склад
ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, Склад = &ВыбранныйСклад) КАК РегистрСрез

Даже если в базе данных существуют десятки записей по данному складу, этот запрос никогда не вернет более одной строки (если параметр &ВыбранныйСклад является конкретным значением). Платформа на уровне SQL-запроса строит вложенный выбор с использованием агрегатных функций (MAX) и условий связи, которые отсекают все записи, кроме самой актуальной.

Технические нюансы на уровне базы данных

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

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

Почему иногда кажется, что записей несколько?

Разберем ситуации, в которых разработчики ошибочно полагают, что срез вернул дубли:

  1. Запрос к физической таблице: Если вместо виртуальной таблицы СрезПоследних обратиться напрямую к таблице РегистрСведений.ИмяРегистра, то при совпадении условий вы действительно получите все записи.
  2. Неполный набор измерений: Если в регистре два измерения (например, Склад и Номенклатура), а вы делаете отбор только по Складу, запрос вернет последние записи для каждой номенклатуры на этом складе. Это правильное поведение, так как для каждой уникальной комбинации (Склад + Номенклатура) существует своя «последняя» запись.
  3. Использование итогов: В редких случаях при сбоях в базе данных (несоответствие итогов реальным записям) могут возникнуть аномалии. В таких ситуациях помогает стандартная процедура «Тестирование и исправление» с пересчетом итогов.

Итог исследования

Мы проанализировали внутренние механизмы платформы и можем сделать однозначный вывод: в штатном режиме работы 1С:Предприятие 8 невозможно получить более одной записи из виртуальной таблицы СрезПоследних при условии равенства всех имеющихся измерений конкретным значениям. Система всегда однозначно идентифицирует последнюю запись, используя цепочку приоритетов: Период -> Ссылка регистратора -> Номер строки.

← На главную