При работе с периодическими регистрами сведений в системе 1С:Предприятие часто возникает вопрос: как именно платформа определяет «последнюю» запись и возможна ли ситуация, при которой виртуальная таблица СрезПоследних вернет более одной строки для одного и того же набора измерений? Особенно этот вопрос актуален для регистров с режимом записи «Подчинение регистратору», где данные записываются документами. Рассмотрим этот механизм подробно и разберем, как платформа обеспечивает уникальность результата.
Представим периодический регистр сведений, у которого установлено свойство РежимЗаписи = ПодчинениеРегистратору. У регистра есть одно измерение (например, Склад) и ресурс (например, Цена). Мы выполняем запрос к виртуальной таблице СрезПоследних, накладывая условие на это единственное измерение. Возникает закономерное сомнение: если в одну и ту же секунду (один и тот же период) по этому складу были сделаны записи разными документами, не «запутается» ли система и не выдаст ли она обе записи?
Для ответа на этот вопрос проанализируем, из чего складывается уникальность записи в таком регистре. В отличие от независимых регистров, где уникальность определяется только периодом и набором измерений, в регистрах, подчиненных регистратору, в ключ уникальности добавляются:
Рассмотрим подробнее логику получения данных. Виртуальная таблица СрезПоследних предназначена для получения наиболее актуальных данных на определенный момент времени. Платформа 1С гарантирует, что для каждой уникальной комбинации измерений будет возвращена строго одна запись.
Проанализируем ситуацию, когда несколько записей претендуют на звание «последних»:
Период.НомерСтроки (LineNo). В срез попадет запись с наибольшим номером строки.Посмотрим на пример типичного запроса, который может вызвать вопросы у разработчика:
ВЫБРАТЬ
РегистрСрез.Цена,
РегистрСрез.Склад
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, Склад = &ВыбранныйСклад) КАК РегистрСрез
Даже если в базе данных существуют десятки записей по данному складу, этот запрос никогда не вернет более одной строки (если параметр &ВыбранныйСклад является конкретным значением). Платформа на уровне SQL-запроса строит вложенный выбор с использованием агрегатных функций (MAX) и условий связи, которые отсекают все записи, кроме самой актуальной.
Выясним причину такой жесткой фильтрации. Когда мы обращаемся к СрезПоследних, система генерирует сложный SQL-запрос. В упрощенном виде он выглядит так: сначала выбираются максимальные периоды для каждой комбинации измерений, затем для этих периодов выбираются максимальные регистраторы, и, наконец, максимальные номера строк.
Важно помнить про свойство «Активность». Записи регистра сведений могут быть помечены как неактивные. Виртуальная таблица СрезПоследних по умолчанию учитывает только активные записи. Если последняя по времени запись является неактивной, система будет «искать» предыдущую активную запись.
Разберем ситуации, в которых разработчики ошибочно полагают, что срез вернул дубли:
СрезПоследних обратиться напрямую к таблице РегистрСведений.ИмяРегистра, то при совпадении условий вы действительно получите все записи.Склад и Номенклатура), а вы делаете отбор только по Складу, запрос вернет последние записи для каждой номенклатуры на этом складе. Это правильное поведение, так как для каждой уникальной комбинации (Склад + Номенклатура) существует своя «последняя» запись.Мы проанализировали внутренние механизмы платформы и можем сделать однозначный вывод: в штатном режиме работы 1С:Предприятие 8 невозможно получить более одной записи из виртуальной таблицы СрезПоследних при условии равенства всех имеющихся измерений конкретным значениям. Система всегда однозначно идентифицирует последнюю запись, используя цепочку приоритетов: Период -> Ссылка регистратора -> Номер строки.