Имя: Пароль:
1C
1С v8
Ограничение списка видимыми объектами
0 SMakcik
 
21.09.11
16:11
Привет Всем!

Есть запрос вида:

ВЫБРАТЬ РАЗРЕШЕННЫЕ
   ТоварыКПередачеСоСкладовОстатки.ДокументПередачи КАК Документ,
   СУММА(ТоварыКПередачеСоСкладовОстатки.КоличествоОстаток) КАК КоличествоОстаток
ИЗ
   РегистрНакопления.ТоварыКПередачеСоСкладов.Остатки(, ) КАК ТоварыКПередачеСоСкладовОстатки

СГРУППИРОВАТЬ ПО
   ТоварыКПередачеСоСкладовОстатки.ДокументПередачи

ИМЕЮЩИЕ
   МАКСИМУМ(ТоварыКПередачеСоСкладовОстатки.КоличествоОстаток) <> 0

Который получает документы еще не отгруженные.

Для показа статуса исползуеться такой вид



Функция ВернутьСтатусРеализацииТоваровУслуг()
   
   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
                  |    ТоварыКПередачеСоСкладовОстатки.ДокументПередачи КАК Документ,
                  |    СУММА(ТоварыКПередачеСоСкладовОстатки.КоличествоОстаток) КАК КоличествоОстаток
                  |ИЗ
                  |    РегистрНакопления.ТоварыКПередачеСоСкладов.Остатки(, ) КАК ТоварыКПередачеСоСкладовОстатки
                  |
                  |СГРУППИРОВАТЬ ПО
                  |    ТоварыКПередачеСоСкладовОстатки.ДокументПередачи
                  |
                  |ИМЕЮЩИЕ
                  |    МАКСИМУМ(ТоварыКПередачеСоСкладовОстатки.КоличествоОстаток) <> 0";
           
   //Запрос.УстановитьПараметр("СписокДокументов", СписокДокументов);
   
   Возврат Запрос.Выполнить().Выбрать();
   
КонецФункции

Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
   
   ЕстьЯчейкаСтатуса = ЭлементыФормы.Список.Колонки.Статус.Видимость;
   Если ЕстьЯчейкаСтатуса Тогда
Массив.Добавить(ОформлениеСтроки.ДанныеСтроки.Ссылка);
       //КонецЦикла;
       Для Каждого ОформлениеСтроки ИЗ ОформленияСтрок Цикл
           ДанныеСтроки = ОформлениеСтроки.ДанныеСтроки;
           Статус = "";
           Если ДанныеСтроки.Проведен Тогда
               Результат.Сбросить();
               Если Результат.НайтиСледующий(ДанныеСтроки.Ссылка, "Документ") Тогда
                   Если ДанныеСтроки.Ссылка.Товары.Итог("Количество") <> Результат.КоличествоОстаток Тогда
                       ОформлениеСтроки.Ячейки["Статус"].ЦветТекста = СинийЦвет;
                   Иначе
                       ОформлениеСтроки.Ячейки["Статус"].ЦветТекста = КрасныйЦвет;
                   КонецЕсли;
                   Статус = "НЕ ОТГРУЖЕНА";
               Иначе
                   ОформлениеСтроки.Ячейки["Статус"].ЦветТекста = ЗеленыйЦвет;
                   Статус = "ОТГРУЖЕНА";
               КонецЕсли;
               
               РезультатПоДолгам.Сбросить();
               Если РезультатПоДолгам.НайтиСледующий(ДанныеСтроки.Ссылка) Тогда
                   ОформлениеСтроки.Ячейки["СуществуютДолги"].УстановитьКартинку(БиблиотекаКартинок.Важно);
ОформлениеСтроки.Ячейки["СуществуютДолги"].УстановитьКартинку(БиблиотекаКартинок.Утвердить);
               КонецЕсли;    
           КонецЕсли;    
           
           ОформлениеСтроки.Ячейки["Статус"].УстановитьТекст(Статус);
           
       КонецЦикла;
   КонецЕсли;    
   
КонецПроцедуры


Вопрос: Как повысить производительность данной кострукции.

Первое это ограничить запрос списком видимых документов, но для этого его надо как-то получить.

Можно из Оформления строк, но там нужно всегда перебирать строки, что еще дольше работает.
1 Axel2009
 
21.09.11
16:12
ДанныеСтроки.Ссылка.Товары.Итог("Количество")
перекинуть на запрос
2 SMakcik
 
21.09.11
16:14
(1) Так было но тоже работает очень долго
3 SMakcik
 
21.09.11
16:15
Еще дольше даже
4 Axel2009
 
21.09.11
16:17
и как же это выглядело?
5 SMakcik
 
21.09.11
16:19
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
                  |    ТоварыКПередачеСоСкладовОстатки.ДокументПередачи КАК Документ,
                  //|    СУММА(РеализацияТоваровУслугТовары.Количество) КАК Количество,
                  |    СУММА(ТоварыКПередачеСоСкладовОстатки.КоличествоОстаток) КАК КоличествоОстаток
                  |ИЗ
                  |    РегистрНакопления.ТоварыКПередачеСоСкладов.Остатки(, ) КАК ТоварыКПередачеСоСкладовОстатки
                  //|        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
                  //|        ПО ТоварыКПередачеСоСкладовОстатки.ДокументПередачи = РеализацияТоваровУслугТовары.Ссылка
                  |
                  |СГРУППИРОВАТЬ ПО
                  |    ТоварыКПередачеСоСкладовОстатки.ДокументПередачи
                  |
                  |ИМЕЮЩИЕ
                  |    МАКСИМУМ(ТоварыКПередачеСоСкладовОстатки.КоличествоОстаток) <> 0";
6 Axel2009
 
21.09.11
16:21
(5) ниче что там перемножение данных идет? и тупняк поэтому?
7 SMakcik
 
21.09.11
16:23
А как ты собираешься по другому сделать
8 SMakcik
 
21.09.11
16:24
Да дело даже не в этой строке а в запросе, который 85% времени занимает
9 aple313
 
21.09.11
16:25
В типовых обычно делается двумя запросами. Первый запрос собирает массив ссылок по которым накладывается условие в запросе. Второй цикл это вывод статусов.
Обычно не занимает много времени.
10 Axel2009
 
21.09.11
16:25
(8) какой запрос? и где вызов этого запроса?
11 aple313
 
21.09.11
16:25
*двумя циклами
12 SMakcik
 
21.09.11
16:26
(9) и так было но что-то не понравилось
13 SMakcik
 
21.09.11
16:26
Который показан уже в трех постах, который берет остатки
14 SMakcik
 
21.09.11
16:28
(9) тут дело в том, что процедура обновления вызываеться один раз, а при получении данных (откуда можно вытащить ОформленияСтрок) нет. Поэтому Запрос получения остатков вызываеться несколько раз, хоть и с ограничением
15 SMakcik
 
21.09.11
16:54
больше ни у кого нет мыслей
16 Axel2009
 
21.09.11
16:58
(15) запрос нужно переписать правильно, а не так как в (5) с учетом комментариев
17 SMakcik
 
21.09.11
16:59
А что такм не правильно, не считая запятых не нужных которые я не убрал
18 SMakcik
 
21.09.11
16:59
я спрашиваю идеи а не то что правильно или не правильно, если не знаешь так и молчи
19 Axel2009
 
21.09.11
17:05
сколько записей возвращает запрос из (0) по документам передачи?
20 SMakcik
 
21.09.11
17:05
ну 50 или 10 может, это то причем
21 SMakcik
 
21.09.11
17:06
Тут самый смысл чтобы ограничить количество раз выполнения, а не извращаться над запросом. Запрос самый простой и легкий
22 SMakcik
 
21.09.11
17:06
+(20) 100