Методы оптимизации запросов

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

Общие положения написания запросов

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

Как избежать лишних обращений к ИБ, и тем самым существенно уменьшить время формирования отчета проиллюстрируем на примере "Оптимизация Отчета".

Закладка 100% 

ТекстЗапроса = 

"//{{ЗАПРОС(Сформировать100) 

|Период с ВыбНачПериода по ВыбКонПериода; 

|Товар = Документ.РасхНакл.Товар; 

|Количество = Документ.РасхНакл.Количество; 

|Функция КоличествоСумма = Сумма(Количество); 

|Группировка Товар; 

|Условие(Товар в ВыбТовар); 

|Условие(Товар.ВидТовара = ВыбВидТовара); 

|"//}}ЗАПРОС; 

При написании текста запроса необходимо учитывать, что Запрос при формировании выборки сам отрабатывает только элементарные условия , не запуская при этом исполнительную среду встроенного языка, что значительно экономит время. Если есть возможность привести условие к элементарному - это необходимо сделать.


"//{{ЗАПРОС(Сформировать15) 

|Период с ВыбНачПериода по ВыбКонПериода; 

|Товар = Документ.РасхНакл.Товар; 

|ВидТовара = Документ.РасхНакл.Товар.ВидТовара; 

|Количество = Документ.РасхНакл.Количество; 

|Функция КоличествоСумма = Сумма(Количество); 

|Группировка Товар; 

|Условие(Товар в ВыбТовар); 

|Условие(ВидТовара=ВыбВидТовара); 

|"//}}ЗАПРОС;

Так как выборка формируется на компьютере пользователя, то все данные, которые необходимы пользователю для построения отчета, должны быть, по возможности, получены посредством запроса. В таблице выводится значение кода товара – для этого в запросе необходимо ввести переменную КодТовара . Тогда для формирования отчета, отпадет необходимость, каждый раз обращаться к ИБ. Следует не забывать про методы Запроса - ЗначениеУпорядочивания и ЭтоГруппа , которые опять же извлекают данные из выборки, минуя ИБ, что заметно уменьшает время формирования запроса.

"//{{ЗАПРОС(Сформировать3) 

|Период с ВыбНачПериода по ВыбКонПериода; 

|Товар = Документ.РасхНакл.Товар; 

|ВидТовара = Документ.РасхНакл.Товар.ВидТовара; 

|КодТовара = Документ.РасхНакл.Товар.Код; 

|Количество = Документ.РасхНакл.Количество; 

|Функция КоличествоСумма = Сумма(Количество); 

|Группировка Товар; 

|Условие(Товар в ВыбТовар); 

|Условие(ВидТовара=ВыбВидТовара); 

|"//}}ЗАПРОС; 

В отчете "Оптимизация Отчета" время выполнение самой медленной версии взято за 100%, остальные версии берутся как процент от нее. Следование правилам, дало возможность уменьшить время выполнения запроса почти на 2 порядка!

Особенности использования запросов для получения информации из справочников

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

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


Mista.Ru

Начать дискуссию