Имя: Пароль:
1C
1С v8
Оптимизация отчетов и обработок в 1С8
🠗 (Sammo 27.08.2013 14:23)
,
0 sasha_nik
 
27.08.13
13:34
Механизм ускорения отчетов/обработок в 1С8 (все нижеперечисленное протестирвоано с помощью замера производительности, такая оптимизиция дает прирост производительности до 3-х раз).

1.    В отчетах, где используется выборка из регистров накопления (Остатки, Обороты), при возможности задавать критерии отбора по измерениям,  а также нижнюю и верхнюю границу интервала (в случае извлечения оборотов)

Пример:

Медленно:
Запрос.Текст=»Выбрать
|* из
|ИЗ
|РегистрНакопления.Продажи.Обороты(,, Регистратор, )  как Продажи
|Где  ЗаказПокупателя в (&СписокЗаказовПокупателей) КАК Продажи

Быстро:
Запрос.Текст=»Выбрать
|* из
|ИЗ
|РегистрНакопления.Продажи.Обороты(&Дата1,&Дата2, Регистратор,ЗаказПокупателя в (&СписокЗаказовПокупателей)) КАК Продажи


Примечание: трудности при установке интервала дат могут возникать из-за того, что в базе зачастую Дата оплаты по заказу < Даты заказа покупателя. Поэтому перевести на интервал дат возможно только регистры, связанные с отгрузками (Продажи, Продажи себестоимость), т.к. дата накладной всегда должна быть > даты заказа покупателя (для этого сделана специальная защита). Регистры «Расчеты» и «Взаиморасчеты» в ряде случаев перевести на интервал дат невозможно.

2.    Если из запроса извлекаются ссылки (документы, справочники), постараться, чтобы при переборке запросов не извлекались реквизиты этих ссылок, а все необходимые реквизиты этих ссылок извлекались сразу в запросе

Пример:

Медленно:

Запрос=»Выбрать
|ДокЗак.Ссылка как ЗаказПокупателя
|Из Документ.ЗаказПокупателя
|»;

Выборка=Запрос.Выполнить().Выбрать();

Пока Выборка.СледующийПоЗначениюПоля(«ЗаказПокупателя») Цикл
    ЗаказПокупателя=Выборка.ЗаказПокупателя;
    Контрагент=ЗаказПокупателя.Контрагент;
    ДатаЗаказа=ЗаказПокупателя.Дата;
    ….
КонецЦикла

Быстро:

Запрос=»Выбрать
|ДокЗак.Ссылка как ЗаказПокупателя,
|ДокЗаказ.Контрагент, ДокЗаказ.Дата
|Из Документ.ЗаказПокупателя
|»;

Выборка=Запрос.Выполнить().Выбрать();

Пока Выборка.СледующийПоЗначениюПоля(«ЗаказПокупателя») Цикл
    ЗаказПокупателя=Выборка.ЗаказПокупателя;
    Контрагент=Выборка.Контрагент;
    ДатаЗаказа=Выборка.Дата;
    ….
КонецЦикла


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


3.    Перевод функция для выполнения  на  сервер (для клиент-серверного варианта).

Следует помнить, что передача с клиента на сервери обратно списка значений и объекта не допускается. Можно передавать ссылки, массивы, таблицы значений

Перевод осуществляется таким образом:

//В модуле общего назначения
Функция ПроцентОплатыПоЗаказуПокупателя()
    #Если Клиент тогда
    Возврат Функция ПроцентОплатыПоЗаказуПокупателя_НаКлиенте();
    #КонецЕсли
КонецФункции

//В служебном модуле, предназначенном для исполнения как на сервере, так и на клиенте
&НаКлиенте
Функция ПроцентОплатыПоЗаказуПокупателя_НаКлиенте()
    Возврат Функция ПроцентОплатыПоЗаказуПокупателя_НаСервере();
КонецФункции

&НаСервере
Функция ПроцентОплатыПоЗаказуПокупателя_НаКлиенте()
    //Определение процента оплаты заказа покупателя
    Возврат ПроцентОплаты;    
КонецФункции
1 sasha_nik
 
27.08.13
13:36
Вместо "Возврат Функция" читать "Возврат"
2 Fragster
 
модератор
27.08.13
13:36
продолжайте наблюдения
3 vyaz
 
27.08.13
13:37
а в чем вопрос?
4 sasha_nik
 
27.08.13
13:37
А почему обязательно должен быть вопрос. Я жду, может кто дополнит что-нибудь, а своим опытом мне не жалко поделиться.
5 vyaz
 
27.08.13
13:38
(0) а если это ликбез, то к 1 пункту тогда уж добавить про влияние порядка измерений в регистре и про индексацию
6 sasha_nik
 
27.08.13
13:39
Про индексацию сам не совсем понимаю.
7 Dmitry1c
 
27.08.13
13:39
А уж как влияет заполнение видов субконто в регистре бухгалтерии..
8 Starhan
 
27.08.13
13:39
(4)>>А почему обязательно должен быть вопрос.
Dот ты щас взял и сломал мое представление о мисте...
9 sasha_nik
 
27.08.13
13:40
А,понял, для такой выборки нужно, чтобы у измерения стоял признак "Индексировать". (в моем примере у измерения регистра "Заказ покупателя". Ну ладно, буду дальше оптимизировать.
10 vyaz
 
27.08.13
13:41
(6) говорят, что вроде как по индексированным полям отбор в запросе должен работать быстрей:) ну и важно в запросе порядок расположения условий после ГДЕ...
11 sasha_nik
 
27.08.13
13:41
Я на мисте недавно, а 1С-м занимаюсь (или маьсь с ним) уже 11 лет, 8-кой 7 лет, а вообще я самоучка.
12 sasha_nik
 
27.08.13
13:42
Всем большое спасибо, вечером зайду, посмотрю Ваши советы.
13 ptiz
 
27.08.13
13:42
Нам открыли глаза!
14 Dmitry1c
 
27.08.13
13:43
(12) зашел на мисту ты, спросить советов мудрых...
15 Starhan
 
27.08.13
13:44
(12) зачем ждать, нажми красную букву Я в правом-верхнем углу топика.
16 H A D G E H O G s
 
27.08.13
13:53
Что?
Это?
Было?
17 Vitamax3
 
27.08.13
14:08
С такими "достижениями" можно не только опытом делиться, а нужно уже книги писать.
18 Starhan
 
27.08.13
14:14
(16) атец, фитчами делился (БЕСПЛАТНО!!!)
19 Sammo
 
27.08.13
14:23
Читай профессиональную разработку
20 kiruha
 
27.08.13
14:35
Ну зачем ветку опустили - автор открыл глаза
Побежал переписывать