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

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

Очень часта бухгалтера, хотят чтобы формы списка были раскрашены во все цвета радуги в зависимости от значений реквизитов документа. Пример: Если товар не получен то в форме списка строка документа должна быть красная, если товар ... т.д., и так еще много много хотелок. Есть конечно отчеты, но не всегда выход. Приступим, получаем код типа:
Код 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 |  Дата:   Прочитано: 19629
 +3 
Распечатать
Возможно, вас также заинтересует
10060 (0x0000274C): Попытка установить соединение была безуспешной 24
Установили новый терминальный сервер, на нем подняли 1С, терминальные пользователе неописуемо довольны, все просто летает :) И вот же надо было такому случиться, главному бухгалтеру не понравилось работать через терминал, а еще у нее свой ноутбук и
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 50
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ
1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш
1Cv8.1CD - Файл данных достиг максимального размера! 9
1С выдает предупреждение " Файл данных достиг максимального размера" . Подскажите из - за чего это и как можно решить ? Превышен размер файла, обычно это сообщение возникает, когда размер файла 1Cv8.1CD приближается к 10 гигабайтам или размер ка
1С 8.x : Как убрать лидирующие нули в номере Документа (вариант2) 0
Скопировать строку с номером, с лидирующими нулями, в числовом поле (с форматом без групп, без группировки), и вернуть(скопировать) обратно в строковом поле с номером. Возвращает без нулей.
Посмотреть все результаты поиска похожих
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.