Оптимизация работы в списке ПриПолученииДанных
Оптимизация работы в списке "ПриПолученииДанных"
- Описание
- Подробнее
Описание
Статья Оптимизация работы в списке «ПриПолученииДанных»
Очень часта бухгалтера, хотят чтобы формы списка были раскрашены во все цвета радуги в зависимости от значений реквизитов документа. Пример: Если товар не получен то в форме списка строка документа должна быть красная, если товар … т.д., и так еще много много хотелок. Есть конечно отчеты, но не всегда выход. Приступим
Получаем код типа:
Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
ЦветКрасный = Новый Цвет(255,130,124);
Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
Данныестроки = ОформлениеСтроки.Данныестроки;
Если ДанныеСтроки.Ссылка.НеПолученТовар Тогда
ОформлениеСтроки.ЦветФона = ЦветКрасный;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Вроде все красиво. Разукрашиваем в «ПриПолученииДанных», а не в «ПриВыводеСтроки», Цвет вынесен из цикла.
Проходим отладчик и видим, узкое место
ДанныеСтроки.Ссылка.НеПолученТовар
т.е 1С-ка каждый раз запросом получает значение реквизита. Можно конечно добавить этот реквизит в форму списка и скрыть, но условие и может быть сложным.
Попробуем это ускорить.
Получаем массив ссылок
Функция ПолучитьМассивСсылокОформленияСтрок(ОформленияСтрок)
Массив = Новый Массив;
Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
Массив.Добавить(ОформлениеСтроки.Данныестроки.Ссылка);
КонецЦикла;
Возврат Массив;
КонецФункции // ПолучитьСписокСсылок(ОформленияСтрок)
Получаем одним запросом необходимые нам данные.
Пример
Функция ПолучитьТаблицаОформленияСтрок(МассивСсылокОформления)
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| ПриходнаяНакладнаяБезнал.Ссылка,
| ПриходнаяНакладнаяБезнал.НеПолученТовар
|ИЗ
| Документ.ПриходнаяНакладнаяБезнал КАК ПриходнаяНакладнаяБезнал
|ГДЕ
| ПриходнаяНакладнаяБезнал.Ссылка В(&МассивСсылокОформления)»;
Запрос.УстановитьПараметр(«МассивСсылокОформления», МассивСсылокОформления);
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции // ПолучитьСписокСсылок(ОформленияСтрок)()
В результате получаем код процедуры ДокументСписокПриПолученииДанных
Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
ЦветКрасный = Новый Цвет(255,130,124);
МассивСсылокОформления = ПолучитьМассивСсылокОформленияСтрок(ОформленияСтрок);
ТаблицаДанныхОформленияСтрок = ПолучитьТаблицаОформленияСтрок(МассивСсылокОформления);
Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
Данныестроки = ОформлениеСтроки.Данныестроки;
СтрокаОформленияСтрок = ТаблицаДанныхОформленияСтрок.Найти(ОформлениеСтроки.Данныестроки.Ссылка, «Ссылка»);
Если СтрокаОформленияСтрок.НеПолученТовар Тогда
ОформлениеСтроки.ЦветФона = ЦветКрасный;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Ну а теперь тесты, как же без них.
Первый вариант
Документ.ПриходнаяНакладнаяБезнал.Форма.ФормаВыбора.Форма 36 ДокументСписокПриПолученииДанных1(Элемент, ОформленияСтрок); 81 12,558905 96,65
Второй вариант после оптимизации
Документ.ПриходнаяНакладнаяБезнал.Форма.ФормаВыбора.Форма 37 ДокументСписокПриПолученииДанных2(Элемент, ОформленияСтрок); 81 0,426953 3,29 «
Результат, ускорение в 36 раз.
Вывод: Запрос для получения данных должен быть один.
Спасибо за внимание.