Имя: Пароль:
1C
1С v8
Вопрос по оптимизации кода
,
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)
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.