|
Вопрос по оптимизации кода | ☑ | ||
---|---|---|---|---|
0
1IIh
29.03.13
✎
08:18
|
Всем доброго дня!
1с 8.2 УТ 10.3 Задача: в форме списка заказов покупателя выделить цветом те заказы, по которым нет реализации. Делаю так (пока, для простоты, выделяю те, по которым реализация есть): Процедура СписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Докты = КритерииОтбора.СвязанныеДокументы.Найти(ДанныеСтроки.Ссылка); Для каждого Док из Докты Цикл Если Док.Метаданные().Имя = "РеализацияТоваровУслуг" Тогда ОформлениеСтроки.ЦветФона = WebЦвета.Голубой; КонецЕсли; КонецЦикла; КонецПроцедуры Работает, но очень медленно. Список не то что прокручивать, даже листать затруднительно. Сам цикл на скорость заметно не влияет. С одной строкой в процедуре: Докты = КритерииОтбора.СвязанныеДокументы.Найти(ДанныеСтроки.Ссылка); список продолжает работать так же медленно. Собственно вопрос: существует ли другой способ поиска связанных документов, быстрый, или может быть вообще по другому можно сделать? |
|||
1
1C-band
29.03.13
✎
08:18
|
(0) Кури ПриПолученииДанных()
|
|||
2
MSII
29.03.13
✎
08:20
|
Во первых, при получении данных. Во вторых, под такую задачу можно и регистр сведений запилить.
|
|||
3
Рэйв
29.03.13
✎
08:23
|
Добавь таб часть "Реализации " в заказ и складывай туда.
Потом просто проверишь количество у таб части и все. Правда запаришься актуальность поддерживать, но зато будет летать |
|||
4
MSII
29.03.13
✎
08:23
|
+(2) Потому что сами документы тебе не нужны, а нужны только сведения о их наличии.
|
|||
5
Рэйв
29.03.13
✎
08:24
|
А вообще это все фигня..На такие вещи должен быть отчет.
|
|||
6
Рэйв
29.03.13
✎
08:25
|
захотели- посмотрели, а то может им и не надо а ты базу напрягаешь
|
|||
7
NWsFF
29.03.13
✎
08:26
|
Попробуй использовать кэш в виде соответвие[ссылка] = да/нет
|
|||
8
Fragster
гуру
29.03.13
✎
08:27
|
при получении данных все ссылки в массив, а также соответствие оформления ссылке (ключ - ссылка). 1 запросом получаем нужные данные и меняем оформление через соответствие
|
|||
9
Fragster
гуру
29.03.13
✎
08:27
|
ну и да - это нужно включать по кнопке
|
|||
10
NWsFF
29.03.13
✎
08:28
|
(+)Изначально заполни его за месяц, два, три, будут листать дальше пусть страдают
|
|||
11
1IIh
30.03.13
✎
19:41
|
(5) Я согласен, но девочкам нужен один большой, разноцветный и наглядный экран. У нас там уже всякие цветные галочки выросли, теперь раскрашиваем поля :)
(1) Курил ПриПолученииДанных(): процедура события принимает в параметрах все новые строки, входящих в отображение табличной части, позволяя обрабатывать их по мере поступления (прокрутке таблицы). Вместе с тем, снова принимает в параметрах и отображённые ранее строки при возвращении к ним (прокрутке в обр. направлении). (2) (3) Да, не понятно как поддерживать актуальность. Пробовал передавать через них данные, заполняя по ПриПолученииДанных(), но их заполнение в цикле работает слишком медленно. (7) Не понял где у 1с кэш и как им пользоваться, устал уже от всех мытарств, и забил. Сделал выборку запросом всех заказов со связанными реализациями по ПередОткрытием() в глобальную переменную, и всё залетало. Но так при создании реализации не обновляется раскраска таблицы. Поэтому сделал как в (8) (только не понял на счёт массива): Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок) КодыЗаказов = ""; Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл КодыЗаказов = КодыЗаказов + """" + ОформлениеСтроки.ДанныеСтроки.Номер + """, "; КонецЦикла; КодыЗаказов = Лев(КодыЗаказов, СтрДлина(КодыЗаказов)-2); ТекстЗапроса = "ВЫБРАТЬ | ЗаказПокупателя.Ссылка, | РеализацияТоваровУслуг.Сделка |ИЗ | Документ.ЗаказПокупателя КАК ЗаказПокупателя | ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг | ПО (РеализацияТоваровУслуг.Сделка = ЗаказПокупателя.Ссылка) |ГДЕ | ЗаказПокупателя.Ссылка.Номер | В (" + КодыЗаказов + ")"; Запрос = Новый Запрос; Запрос.Текст = ТекстЗапроса; Выгрузка = Запрос.Выполнить().Выгрузить(); Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл Найденное = Выгрузка.Найти(ОформлениеСтроки.ДанныеСтроки.Ссылка, "Ссылка"); Если Не (Найденное.Сделка <> Null) Тогда ОформлениеСтроки.ЦветФона = WebЦвета.Голубой; КонецЕсли; КонецЦикла; КонецПроцедуры Работает довольно шустро, хотя тоже не слишком кошерный код. Думаю, господа программисты, есть ещё куда оптимизировать :) Ну и раскраска обновляется не во всех случаях. |
|||
12
Reaper_1c
30.03.13
✎
19:54
|
(11) В твоем потоке сознания неоспоримы только первые семь буков. Остальное все от лукавого.
|
|||
13
Reaper_1c
30.03.13
✎
19:55
|
+(12) *первые семь слов"
|
|||
14
1IIh
30.03.13
✎
20:17
|
(12) Так почему ты здесь, король остроумия?
|
|||
15
Reaper_1c
30.03.13
✎
21:08
|
(14) Голод не тетка.
|
|||
16
H A D G E H O G s
30.03.13
✎
21:18
|
Автору рекомендую позвать программиста 1С, это его задача.
|
|||
17
1cVandal
30.03.13
✎
21:19
|
(16)может колено огенстрелом,не?
|
|||
18
Fragster
гуру
31.03.13
✎
10:37
|
МассивСсылок = Новый Массив;
СоответствиеСтрок = Новый Соответствие; Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл Сссылка = ОформлениеСтроки.ДанныеСтроки.Ссылка; МассивСсылок.Добавить(Ссылка); СоответствиеСтрок.Вставить(Ссылка, ОфомлениеСтроки); КонецЦикла; Запрос... Пока Выборка.Следующий() Цикл Соответствие[Выборка.Ссылка].ЦветФона... КонецЦикла; |
|||
19
1IIh
31.03.13
✎
15:21
|
Всё, понял! Ассоциативный массив!
Здорово :) Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок) МассивСсылок = Новый Массив; СоответствиеСтрок = Новый Соответствие; Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл Ссылка = ОформлениеСтроки.ДанныеСтроки.Ссылка; МассивСсылок.Добавить(Ссылка); СоответствиеСтрок.Вставить(Ссылка, ОформлениеСтроки); КонецЦикла; Запрос = Новый Запрос("ВЫБРАТЬ | ЗаказПокупателя.Ссылка, | РеализацияТоваровУслуг.Сделка |ИЗ | Документ.ЗаказПокупателя КАК ЗаказПокупателя | ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг | ПО (РеализацияТоваровУслуг.Сделка = ЗаказПокупателя.Ссылка) |ГДЕ | ЗаказПокупателя.Ссылка | В (&МассивСсылок)"); Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Если Выборка.Сделка = Null Тогда СоответствиеСтрок[Выборка.Ссылка].ЦветФона = WebЦвета.Голубой; КонецЕсли; КонецЦикла; КонецПроцедуры |
|||
20
GANR
31.03.13
✎
15:37
|
Как угодно нужно убрать получение данных из ПриВыводеСтроки. Например, один раз выгрузив их в соответствие, а потом в ПриВыводеСтроки работать не с запросами, а с этим соотвествием, "кэшем".
|
|||
21
GANR
31.03.13
✎
15:38
|
(20) делать в (1)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |