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