Почему в консоли запросов видны срезы регистров сведений, даже если итоги по ним отключены?

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

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

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

Логическая абстракция против физического хранения

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

  1. Логический слой (слой метаданных): На этом уровне платформа предоставляет разработчику удобную абстракцию. Если в конфигурации создан периодический регистр сведений, то с точки зрения языка запросов 1С он всегда обладает возможностью получения среза на определенную дату. Логическая структура запроса не меняется от того, включены итоги или нет. Именно поэтому срезы всегда «мозолят глаза» в консоли запросов — платформа декларирует их доступность для конструирования запросов в любом случае.
  2. Физический слой (уровень СУБД): На этом уровне платформа транслирует логический запрос в реальный SQL-код, который отправляется на исполнение в MS SQL Server, PostgreSQL, IBM DB2 или Oracle. И вот здесь наличие или отсутствие флага «Разрешить итоги» кардинально меняет структуру физических таблиц и выполняемых SQL-запросов.

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

Что происходит в СУБД, когда итоги выключены?

Если флаг «Разрешить итоги» в свойствах регистра сведений снят, то в базе данных под данный регистр создается всего одна основная таблица:

Когда мы пишем логический запрос к виртуальной таблице СрезПоследних без включенных итогов, платформа 1С вынуждена эмулировать этот срез «на лету». Она транслирует наш запрос в сложную SQL-конструкцию со вложенными подзапросами. На стороне СУБД это выглядит примерно так:


SELECT
    T1._Fld100_IDRRef AS Currency,
    T1._Fld101 AS Rate
FROM
    _InfoRg100 T1
WHERE
    T1._Period = (
        SELECT MAX(T2._Period)
        FROM _InfoRg100 T2
        WHERE T2._Fld100_IDRRef = T1._Fld100_IDRRef
          AND T2._Period <= @P1
    )

СУБД приходится выполнять сканирование или поиск по индексам основной таблицы, вычислять максимальную дату для каждой уникальной комбинации измерений, а затем соединять этот результат с исходной таблицей для получения значений ресурсов. На больших объемах данных (сотни тысяч и миллионы строк) такой запрос может выполняться крайне медленно.

Что происходит в СУБД, когда итоги включены?

При установке флага «Разрешить итоги» платформа создает в базе данных дополнительные физические таблицы:

В этих таблицах СУБД всегда хранит уже готовые, предрассчитанные актуальные записи на текущий момент времени. Теперь, когда мы обращаемся к СрезПоследних, платформе 1С больше не нужно строить тяжелые вложенные подзапросы с поиском максимума по дате. Она транслирует запрос в простейшее чтение напрямую из таблицы итогов:


SELECT
    T1._Fld100_IDRRef AS Currency,
    T1._Fld101 AS Rate
FROM
    _InfoRgSL100 T1

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

Четыре жестких условия для использования таблиц итогов

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

  1. В параметрах виртуальной таблицы не указан период. То есть мы получаем срез на текущий момент времени (актуальный срез). Если в параметрах передать конкретную дату (например, дату документа из прошлого), платформа проигнорирует таблицу готовых итогов и начнет рассчитывать срез по основной таблице _InfoRg через тяжелые подзапросы.
  2. Отборы накладываются исключительно на измерения регистра. Никаких отборов по ресурсам или реквизитам в параметрах виртуальной таблицы быть не должно.
  3. В условиях отбора нет обращений «через точку». Рассмотрим пример неоптимального отбора:
    
    // Этот запрос проигнорирует таблицу итогов и будет выполняться медленно!
    ВЫБРАТЬ
        КурсыВалютСрезПоследних.Валюта,
        КурсыВалютСрезПоследних.Курс
    ИЗ
        РегистрСведений.КурсыВалют.СрезПоследних(, Валюта.Код = "USD") КАК КурсыВалютСрезПоследних
    
    Чтобы платформа использовала таблицу итогов, необходимо передавать готовую ссылку на валюту напрямую, без обращения к ее реквизитам через точку:
    
    // Этот запрос отработает быстро напрямую из таблицы итогов
    ВЫБРАТЬ
        КурсыВалютСрезПоследних.Валюта,
        КурсыВалютСрезПоследних.Курс
    ИЗ
        РегистрСведений.КурсыВалют.СрезПоследних(, Валюта = &СсылкаНаВалюту) КАК КурсыВалютСрезПоследних
    
  4. Ограничения доступа к данным (RLS) не затрагивают реквизиты. Если в системе настроен RLS для этого регистра, и он накладывает ограничения по полям, не являющимся измерениями, физическая таблица итогов задействована не будет.

Если хотя бы одно из этих условий нарушается, платформа осуществляет «откат» к старому поведению и выполняет тяжелый SQL-запрос к основной таблице регистра.

Обратная сторона медали: замедление записи

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

При записи набора данных платформа обязана поддерживать согласованность и актуальность таблиц срезов. Это означает, что в рамках одной транзакции СУБД должна не только записать новые строки в основную таблицу _InfoRg, но и пересчитать актуальные значения, после чего обновить соответствующие записи в таблицах _InfoRgSL и _InfoRgSF. При пакетной записи миллионов строк (например, при загрузке прайс-листов поставщиков или больших объемов тарифов) включенные итоги могут замедлить процесс записи в несколько раз.

Рекомендации по использованию итогов (Стандарт №708)

Для того чтобы принимать взвешенные решения при проектировании конфигурации, рекомендуется придерживаться официальных стандартов разработки 1С:

Таким образом, убрать виртуальные таблицы срезов из консоли запросов невозможно — они являются неотъемлемой частью логической модели периодического регистра в 1С. Однако теперь мы точно знаем, как управлять их физическим поведением в СУБД для достижения максимальной производительности нашей системы.

← На главную