helpf.pro
Регистрация
 +3 
Распечатать

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

Очень часта бухгалтера, хотят чтобы формы списка были раскрашены во все цвета радуги в зависимости от значений реквизитов документа. Пример: Если товар не получен то в форме списка строка документа должна быть красная, если товар ... т.д., и так еще много много хотелок. Есть конечно отчеты, но не всегда выход. Приступим, получаем код типа:
Код 1C v 8.х
 Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
ЦветКрасный = Новый Цвет(255,130,124);
Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
Данныестроки = ОформлениеСтроки.Данныестроки;

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


Вроде все красиво. Разукрашиваем в "ПриПолученииДанных", а не в "ПриВыводеСтроки", Цвет вынесен из цикла.
Проходим отладчик и видим, узкое место
Код 1C v 8.х
 ДанныеСтроки.Ссылка.НеПолученТовар   

т.е 1С-ка каждый раз запросом получает значение реквизита. Можно конечно добавить этот реквизит в форму списка и скрыть, но условие и может быть сложным. Попробуем это ускорить. Получаем массив ссылок:
Код 1C v 8.х
 Функция ПолучитьМассивСсылокОформленияСтрок(ОформленияСтрок)
Массив = Новый Массив;
Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
Массив.Добавить(ОформлениеСтроки.Данныестроки.Ссылка);
КонецЦикла;
Возврат Массив;
КонецФункции // ПолучитьСписокСсылок(ОформленияСтрок)

Получаем одним запросом необходимые нам данные. Пример:
Код 1C v 8.х
 Функция ПолучитьТаблицаОформленияСтрок(МассивСсылокОформления)

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

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

Возврат Запрос.Выполнить().Выгрузить();
КонецФункции // ПолучитьСписокСсылок(ОформленияСтрок)()

В результате получаем код процедуры ДокументСписокПриПолученииДанных
Код 1C v 8.х
  Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)

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

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

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

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

КонецЦикла;

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


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

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

Результат- ускорение в 36 раз.
Вывод: Запрос для получения данных должен быть один.
Спасибо за внимание.

Автор: Андрей (boggonzikov)
Разместил:   Версии: | 8.x |  Дата:   Прочитано: 19602
 +3 
Распечатать
Возможно, вас также заинтересует
Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П
10060 (0x0000274C): Попытка установить соединение была безуспешной 24
Установили новый терминальный сервер, на нем подняли 1С, терминальные пользователе неописуемо довольны, все просто летает :) И вот же надо было такому случиться, главному бухгалтеру не понравилось работать через терминал, а еще у нее свой ноутбук и
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 50
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ
1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш
1C: Enterprise Development Tools 52
И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools - это среда для разработки конфигурации в IDE Eclipse. С сайта 1С: « 1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений систем
Посмотреть все результаты поиска похожих
Комментарии
AnisaL
23.01.2013 13:52Комментарий: 2
AnisaL
Спасибо большое автору) но возникла проблема
СтрокаОформленияСтрок = ТаблицаДанныхОформленияСтрок.Найти(ОформлениеСтроки.Данныестроки.Ссылка, "Ссылка");
В этой строчке не находит значение, т.е. СтрокаОформленияСтрок - Неопределено. Помогите, пожалуйста)
Altair
11.01.2013 14:20Комментарий: 1
Altair
в Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
лишняя строка
Данныестроки = ОформлениеСтроки.Данныестроки;

Функция ПолучитьМассивСсылокОформленияСтрок(ОформленияСтрок)
Полезная, ее будет очень удобно вынести в общий модуль
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.