Каталог решений - Оптимизация работы в списке ПриПолученииДанных

Оптимизация работы в списке ПриПолученииДанных

Оптимизация работы в списке ПриПолученииДанных

В наличии

Оптимизация работы в списке "ПриПолученииДанных"

Категория:

Описание

 

Статья Оптимизация работы в списке «ПриПолученииДанных»

Очень часта бухгалтера, хотят чтобы формы списка были раскрашены во все цвета радуги в зависимости от значений реквизитов документа. Пример: Если товар не получен то в форме списка строка документа должна быть красная, если товар … т.д., и так еще много много хотелок. Есть конечно отчеты, но не всегда выход. Приступим

Получаем код типа:

Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)

    ЦветКрасный = Новый Цвет(255,130,124);

    Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
       
Данныестроки = ОформлениеСтроки.Данныестроки;

        Если ДанныеСтроки.Ссылка.НеПолученТовар Тогда
           
ОформлениеСтроки.ЦветФона = ЦветКрасный;
        КонецЕсли;

    КонецЦикла;

КонецПроцедуры

Вроде все красиво. Разукрашиваем в «ПриПолученииДанных», а не в «ПриВыводеСтроки», Цвет вынесен из цикла.

Проходим отладчик и видим, узкое место

ДанныеСтроки.Ссылка.НеПолученТовар

т.е 1С-ка каждый раз запросом получает значение реквизита. Можно конечно добавить этот реквизит в форму списка и скрыть, но условие и может быть сложным.

Попробуем это ускорить.

Получаем массив ссылок

Функция ПолучитьМассивСсылокОформленияСтрок(ОформленияСтрок)

    Массив = Новый Массив;

    Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
       
Массив.Добавить(ОформлениеСтроки.Данныестроки.Ссылка);
    КонецЦикла;

    Возврат Массив;

КонецФункции // ПолучитьСписокСсылок(ОформленияСтрок)

Получаем одним запросом необходимые нам данные.

 Пример

Функция ПолучитьТаблицаОформленияСтрок(МассивСсылокОформления)

    Запрос = Новый Запрос;
   
Запрос.Текст =
       
«ВЫБРАТЬ
        |   ПриходнаяНакладнаяБезнал.Ссылка,
        |   ПриходнаяНакладнаяБезнал.НеПолученТовар
        |ИЗ
        |   Документ.ПриходнаяНакладнаяБезнал КАК ПриходнаяНакладнаяБезнал
        |ГДЕ
        |   ПриходнаяНакладнаяБезнал.Ссылка В(&МассивСсылокОформления)»
;

    Запрос.УстановитьПараметр(«МассивСсылокОформления», МассивСсылокОформления);

    Возврат Запрос.Выполнить().Выгрузить();

КонецФункции // ПолучитьСписокСсылок(ОформленияСтрок)()

В результате получаем код процедуры ДокументСписокПриПолученииДанных

 Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)

    ЦветКрасный = Новый Цвет(255,130,124);

    МассивСсылокОформления = ПолучитьМассивСсылокОформленияСтрок(ОформленияСтрок);
   
ТаблицаДанныхОформленияСтрок = ПолучитьТаблицаОформленияСтрок(МассивСсылокОформления);

    Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
       
Данныестроки = ОформлениеСтроки.Данныестроки;
       
СтрокаОформленияСтрок = ТаблицаДанныхОформленияСтрок.Найти(ОформлениеСтроки.Данныестроки.Ссылка, «Ссылка»);

        Если СтрокаОформленияСтрок.НеПолученТовар Тогда
           
ОформлениеСтроки.ЦветФона = ЦветКрасный;
        КонецЕсли;

    КонецЦикла;

КонецПроцедуры

Ну а теперь тесты, как же без них.

Первый вариант

Документ.ПриходнаяНакладнаяБезнал.Форма.ФормаВыбора.Форма    36 ДокументСписокПриПолученииДанных1(Элемент, ОформленияСтрок);          81        12,558905       96,65

Второй вариант после оптимизации

    Документ.ПриходнаяНакладнаяБезнал.Форма.ФормаВыбора.Форма   37  ДокументСписокПриПолученииДанных2(Элемент, ОформленияСтрок);    81  0,426953    3,29 «

Результат, ускорение в 36 раз.

Вывод: Запрос для получения данных должен быть один. 

Спасибо за внимание.

 

has been added to your cart:
Оформление заказа