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

10.02.11

Разработка - Универсальные функции

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

 

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

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

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

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

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

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

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

    КонецЦикла;

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

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

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

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

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

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

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

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

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

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


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

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

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

 Пример

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

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

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

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

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

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

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

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

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

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

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

    КонецЦикла;

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

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

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

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

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

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

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

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

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

 

См. также

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    10720    dimanich70    80    

120

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    3296    3    John_d    11    

57

Универсальные функции Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    7462    atdonya    22    

55

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    4654    ke.92@mail.ru    16    

64

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    11054    YA_418728146    7    

149

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2717    40    progmaster    8    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    17085    152    sapervodichka    112    

133
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. boggonzikov 341 10.02.11 16:14 Сейчас в теме
как раскрасить код. Раньше красил через html, сейчас я не нашел :cry: ?
3. boggonzikov 341 10.02.11 16:28 Сейчас в теме
(2) как красить я знаю, куда это вставлять чтобы получился раскрашенный код
6. alexk-is 6539 10.02.11 16:40 Сейчас в теме
(3) В окошечко "Описание"
4. tango 543 10.02.11 16:32 Сейчас в теме
это, (0), делается по-другому, через Соответствие. но минус не дам :)
5. boggonzikov 341 10.02.11 16:34 Сейчас в теме
(4) Как через Соответствие?
что-то не понял
7. alexk-is 6539 10.02.11 16:49 Сейчас в теме
Я бы сделал так

Перем ЦветКрасный;
Перем
Запрос;

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

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

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

    Для каждого
ОформлениеСтроки Из ОформленияСтрок Цикл Если МассивСсылокОформления.Найти(ОформлениеСтроки.Данныестроки.Ссылка) <> Неопределено Тогда ОформлениеСтроки.ЦветФона = ЦветКрасный; КонецЕсли; КонецЦикла;

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

ЦветКрасный = Новый Цвет(255,130,124);
Запрос = Новый Запрос(
"ВЫБРАТЬ
|   ПриходнаяНакладнаяБезнал.Ссылка
|ИЗ
|   Документ.ПриходнаяНакладнаяБезнал КАК ПриходнаяНакладнаяБезнал
|ГДЕ
|   ПриходнаяНакладнаяБезнал.Ссылка В(&МассивСсылокОформления)
|   И ПриходнаяНакладнаяБезнал.НеПолученТовар"
);
Realyzer; SlavaKron; MyNameIs; e.kogan; +4 Ответить
8. boggonzikov 341 10.02.11 16:58 Сейчас в теме
(7) спб, нашел, просто моя опера глючила или резала и при редактировании в html, не было кнопки update.
9. boggonzikov 341 10.02.11 17:03 Сейчас в теме
(7) Кстати спб за разукрашку :)
10. Поручик 4683 10.02.11 17:45 Сейчас в теме
Угу, очередная статья из серии "Как я дошёл своим ум до (..нужное вписать..) или Гугл - это для лошар"

Размещение колонки с остатками в списке справочника
http://www.kb.mista.ru/article.php?id=310
14. boggonzikov 341 11.02.11 16:08 Сейчас в теме
(10)(11)
Решил написать статью из-за того что захотелось сделать количество статей по 1С +1. Мне кажется инфы по 1С связанных с практикой мало, или приходится выуживать по крупицам. Я не спорю, что инфы в ней для гуру нет, но для 1С-ка выше подавана подойдет. Кстати читая коменты (10), желание на написание таких статей совсем отпадает.

По поводу соответсвие.
По мне так нет смысла его использовать, ведь количество строк в ТаблицаДанныхОформленияСтрок мало, а запись в соответсвие на много дольше чем в массив, здесь где-то тесты были.
16. пользователь 11.02.11 16:22
Сообщение было скрыто модератором.
...
17. boggonzikov 341 11.02.11 16:50 Сейчас в теме
(16)
>К тому же незачем обращаться ДанныеСтроки.Ссылка.Ляляреквизит.
Для примера из статьи согласен, но условие и может быть сложным, или использовать данные не из текущего документа.
По 8.2 и управляемые формы согласен, но толстый клиент отомрет очень, очень не скоро, так что будет актуально еще долго.

Короче во всем есть "палка о 2-ух концах" :)
rubezh; Eugeneer; +2 Ответить
18. пользователь 11.02.11 16:53
Сообщение было скрыто модератором.
...
11. Alias 176 11.02.11 00:30 Сейчас в теме
Можно и через Соответствие, как кто-то уже заметил.
Но вообще сейчас уже появилась возможность индексировать и таблицы значений. Так что не знаю самодельный это код или идея подсказана (уже приводимая статья на мисте http://www.kb.mista.ru/article.php?id=310 датирована 2009 годом), в любом случае -- сейчас, на 8.1-8.2, индексирование ТЗ (ТаблицаДанныхОформленияСтрок) в данном случае ОБЯЗАТЕЛЬНО.
13. boggonzikov 341 11.02.11 15:58 Сейчас в теме
(11) >ОБЯЗАТЕЛЬНО.
Не факт. На построение индекса может уйти больше времени чем на поиск каждый раз по всем таблице. Таблицы ведь маленькая. По мне так индексы стоит использовать когда большое количество данных.
СКЛ по-моему использует индекс если таблицы больше 2000 строк, а так скан.
19. Alias 176 14.02.11 11:54 Сейчас в теме
(13) я замерял производительность, поиск по ТЗ с индексированием при сотне строк уже опережает такой же поиск по ТЗ без индекса.
Конечно, на таких объёмах экономия времени незаметна, но "копейка рубль бережёт". К тому же сразу приучает к хорошему стилю программирования.
По мне так лучше всегда делать индексы для искомых данных уже только потому, что лучше потратить микросекунду на построение возможно ненужного индекса для маленькой таблицы, чем забыть построить его для большой таблицы. Стоимость ошибки в этом случае будет гораздо бОльшей.
Однако вынужден согласиться, что в данном примере, только для ОформленийСтрок (коих скорее всего будет не более 50-ти), создание индекса не является обязательным.
15. Ish_2 1105 11.02.11 16:12 Сейчас в теме
(11) Сравнение соответствия и индексированной таблицы значений подробно исследовано у ildarovich
http://infostart.ru/public/79285/
Индексированная таблица проигрывает.
Somebody1; +1 Ответить
12. WKBAPKA 214 11.02.11 10:38 Сейчас в теме
статья конешно полезная, но для ленивых... када сталкиваешся с дикими тормозами, уже умом начинаешь доходить, что не плохо бы через запросы работать... ;)
20. Модератор раздела 09.01.12 18:14 Сейчас в теме
Очередной баян на тему сабжа http://infostart.ru/public/101149/
Повторяются все ошибки начинающих :) Разбор ошибок в комментах http://forum.infostart.ru/forum24/topic48235/message547297 и следующие комменты.

Кстати, в каждом из представленных вариантов (сабж, миста, ссылка выше и т.п.) есть небольший методический недочет -
После запроса к данных везде юзается код по всем строкам (оформлениям строк), быстрее прямо в запросе выполнять ограничения и обходить цикл по выборке, а не по всем строкам.
Из личного опыта и опыта изучения чужого кода знаю, что чаще меняется только часть строк, а не все строки :)

ЗЫ случайно повторно наткнулся на статью :) и решил поднять тему.
Для начинающих будет полезно знать.
21. пользователь 23.10.12 14:39
Сообщение было скрыто модератором.
...
22. Danil.Potapov 518 28.03.13 09:35 Сейчас в теме
оптимизация:

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

ЦветКрасный = Новый Цвет(255,130,124);
Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
Данныестроки = ОформлениеСтроки.Данныестроки;
Если Данныестроки.НеПолученТовар Тогда
ОформлениеСтроки.ЦветФона = ЦветКрасный;
КонецЕсли;
КонецЦикла;

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

в модуле формы добавляешь строку:
СправочникСписок.Колонки.Добавить("НеПолученТовар", Истина);

Итого: раз данные хранятся в таблице реквизитов объекта, можно "скрытно" от пользователя сразу вытаскивать данные. Для этого и добавляем в модуле формы код для принудительного добавления поля в запрос при выборке очередной порции данных.
LeXXuS_ju; +1 Ответить
23. boggonzikov 341 28.03.13 10:00 Сейчас в теме
(22) Было уже такое предложение
>К тому же незачем обращаться ДанныеСтроки.Ссылка.Ляляреквизит.
Для примера из статьи согласен, но условие и может быть сложным, или использовать данные не из текущего документа.
24. Andryxa 29.03.13 17:54 Сейчас в теме
Спасибо, очень помог данный пример в разукрашивании журнала заказов в УТ 10.3
25. uri1978 137 05.01.15 18:08 Сейчас в теме
Статья хорошая и я так выводил и "оптимизировал", пока отладчиком не посмотрел как работает платформа.
Очень часто "ПриПолученииДанных" отрабатывает по-строчно, а не для всех строк сразу. Даже в типовых в отладчике посмотрите сколько строк возвращает "ОформлениеСтрок" :))) Заметил эту особенность еще в 2009 году, на платформе 8.1. На улице уже 2015 год, в 8.3 всё тоже самое.
Так что 1С как обычно пошутила.
27. Tapochki-tmn 43 20.06.23 09:25 Сейчас в теме
(25) Эмпирическим путем заметил, что при установке точки останова и проверке Отладчиком "ОформлениеСтрок" возвращает 1 строку.
Если точку останова убрать и посмотреть как работает заполнение поля в списке документов, то все работает как задумано. Т.е. сколько строк отображается на форме, столько и будет содержаться в "ОформлениеСтрок" и обрабатываться будут все строки. Особенность работы метода, однако !
26. abrafaks 31.07.20 15:03 Сейчас в теме
Самое смешное, что уже 2020 год, а единственное, что я бы изменил - это вместо "Найти" использовал бы "НайтиСтроки".
Оставьте свое сообщение