Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

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

Оптимизация работы в списке "ПриПолученииДанных"
Я
   AnisaL
 
23.01.13 - 14:57
Добрый денек! У меня такая проблемка возникла, есть форма списка документов, к ней привязана процедура "ПриВыводеСтроки". Но так список
достаточно долго открывается, т.к. каждый столбик в каждой строчке имеет свой цвет (как раскраска получается). Хотелось бы оптимизировать этот вывод, в инете нашла ссылку http://help1c.com/faq8/view/1162.html. Вместо ПриВыводеСтроки ПРиПолученииДанных. Вот код процедурки

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

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

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

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

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

    КонецЦикла;

КонецПроцедуры
 
 
   tdm
 
1 - 23.01.13 - 14:58
в чем вопрос ?
   AnisaL
 
2 - 23.01.13 - 14:58
В моем случае не находит строку 
СтрокаОформленияСтрок = ТаблицаДанныхОформленияСтрок.Найти(ОформлениеСтроки.Данныестроки.Ссылка, "Ссылка");
Через отладчик СтрокаОформленияСтрок = НЕОПРЕДЕЛЕНо
   Reset
 
3 - 23.01.13 - 15:00
Ответ сокрыт в ПолучитьТаблицаОформленияСтрок
   GROOVY
 
4 - 23.01.13 - 15:00
Используйте динамический список. Намного быстрее отрабатывать будет.
   tdm
 
5 - 23.01.13 - 15:01
(2) обработать этот вариант и всё)...в ПолучитьТаблицаОформленияСтрок нет такой строки значит
   AnisaL
 
6 - 23.01.13 - 15:01
Как я поняла, это из-за того , что у нас в этом списке док-тов
происходит отбор по нескольким параметрам: организация,интервал,видсметы и еще несколько. Как сделать чтоб эта процедура работала?
   Bober
 
7 - 23.01.13 - 15:02
добавить в ДокументСписок этот реквизит и скрыть его от пользователя
   Reset
 
8 - 23.01.13 - 15:03
(6) Наладить ПолучитьТаблицаОформленияСтрок
Или, если по логике может так быть, что для определенной ссылки нет условия оформления, добавить проверку найденной строки на неопределено
   AnisaL
 
9 - 23.01.13 - 15:03
(3) Напишу эту процедуру (как у меня)
Функция ПолучитьТаблицаОформленияСтрок(МассивСсылокОформления)

    Запрос = Новый Запрос;
    
    Запрос.УстановитьПараметр("МассивСсылокОформления", МассивСсылокОформления);
      
     
    запрос.Текст=
    "выбрать 
        |     Документ.Смета.Ссылка
        |ИЗ
        |    Документ.Смета КАК рег
        |ГДЕ
        |   рег.Ссылка В (&МассивСсылокОформления) и ";
 //    * из документ.Смета как рег где";
 
    первоеУсловиеЗапроса=истина;
    
    ОтборДляЗапроса = "";
    ЗначенияДляЗапроса = Новый("СписокЗначений");
    
    если элементыформы.Панель1.ТекущаяСтраница = элементыформы.Панель1.Страницы.ВРаботе тогда
        
        запрос.УстановитьПараметр("Статус", перечисления.СтатусСметы.ВРаботе);
        если первоеУсловиеЗапроса=ложь тогда
            запрос.Текст = запрос.Текст+" и";
        иначе
            первоеУсловиеЗапроса=Ложь;
        конецЕсли;
            
        запрос.Текст=запрос.Текст+" рег.СтатусСметы=&Статус";
    иначеЕсли элементыформы.Панель1.ТекущаяСтраница = элементыформы.Панель1.Страницы.ВПроекте тогда
                 запрос.УстановитьПараметр("Статус", перечисления.СтатусСметы.ВПроекте);
        если первоеУсловиеЗапроса=ложь тогда
            запрос.Текст = запрос.Текст+" и";
        иначе
            первоеУсловиеЗапроса=Ложь;
        конецЕсли;
            
        запрос.Текст=запрос.Текст+" рег.СтатусСметы=&Статус";
    иначе
                запрос.УстановитьПараметр("Статус", перечисления.СтатусСметы.Выполнена);
        если первоеУсловиеЗапроса=ложь тогда
            запрос.Текст = запрос.Текст+" и";
        иначе
            первоеУсловиеЗапроса=Ложь;
        конецЕсли;
            
        запрос.Текст=запрос.Текст+" рег.СтатусСметы=&Статус";
    конецЕсли;
    если не элементыформы.ПолеВвода1.Значение.Пустая() тогда
        запрос.УстановитьПараметр("ЗаказчикСметы", элементыформы.ПолеВвода1.Значение.Ссылка);
        запрос.Текст = запрос.Текст+" и рег.ЗаказчикСметы=&ЗаказчикСметы";
        ОтборДляЗапроса = ОтборДляЗапроса + " и рег.ЗаказчикСметы=&ЗаказчикСметы";
        ЗначенияДляЗапроса.Добавить(элементыформы.ПолеВвода1.Значение.Ссылка, "ЗаказчикСметы");
    конецЕсли;
    если не элементыформы.ПолеВвода2.Значение.Пустая() тогда
        запрос.УстановитьПараметр("ТипДоговора", элементыформы.ПолеВвода2.Значение.Ссылка);
        запрос.Текст= запрос.Текст+" и рег.ТипДоговора=&ТипДоговора";
        ОтборДляЗапроса = ОтборДляЗапроса + " и рег.ТипДоговора=&ТипДоговора";
        ЗначенияДляЗапроса.Добавить(элементыформы.ПолеВвода2.Значение.Ссылка, "ТипДоговора");
    конецЕсли;
        если не элементыформы.ПолеВвода3.Значение.Пустая() тогда
        запрос.УстановитьПараметр("ВидСметы", элементыформы.ПолеВвода3.Значение);
        запрос.Текст= запрос.Текст+" и рег.ВидСметы=&ВидСметы";
        ОтборДляЗапроса = ОтборДляЗапроса + " и рег.ВидСметы=&ВидСметы";
        ЗначенияДляЗапроса.Добавить(элементыформы.ПолеВвода3.Значение, "ВидСметы");
    конецЕсли;
    если не элементыформы.ОтбОрганизация.Значение.Пустая() тогда
        запрос.УстановитьПараметр("Организации", элементыформы.ОтбОрганизация.Значение.Ссылка);
        запрос.Текст= запрос.Текст+" и рег.Организации=&Организации";
        ОтборДляЗапроса = ОтборДляЗапроса + " и рег.Организации=&Организации";
        ЗначенияДляЗапроса.Добавить(элементыформы.ОтбОрганизация.Значение.Ссылка, "Организации");
    конецЕсли;
    если элементыформы.Флажок1.Значение=Истина и элементыформы.Флажок2.Значение=Истина тогда
        запрос.УстановитьПараметр("ДатаНачала", элементыформы.НачПериода.Значение);
        запрос.УстановитьПараметр("ДатаКонца", элементыформы.КонПериода.Значение);
        запрос.Текст = запрос.Текст+" и рег.дата>=&ДатаНачала и рег.дата<=&ДатаКонца";
    иначеЕсли элементыформы.Флажок1.Значение=Истина и элементыформы.Флажок2.Значение=Ложь тогда
        запрос.УстановитьПараметр("ДатаНачала", элементыформы.НачПериода.Значение);
        запрос.Текст = запрос.Текст+" и рег.дата>=&ДатаНачала";
    иначеЕсли элементыформы.Флажок1.Значение=Ложь и элементыформы.Флажок2.Значение=Истина тогда
        запрос.УстановитьПараметр("ДатаКонца", элементыформы.КонПериода.Значение);
        запрос.Текст=запрос.Текст+" и рег.дата<=&ДатаКонца";
    иначе
        если элементыформы.Флажок3.Значение=Истина тогда
        датаНачала = добавитьмесяц(текущаяДата(),-3);
        запрос.УстановитьПараметр("датаНачала", датаНачала);
        запрос.Текст = запрос.Текст+" и рег.дата>=&ДатаНачала";
        конецЕсли;
    конецЕсли;
    
    Возврат Запрос.Выполнить().Выгрузить();
КонецФункции// ПолучитьСписокСсылок(ОформленияСтрок)()
   Reset
 
10 - 23.01.13 - 15:05
(9) Ужас ;]
 
 Рекламное место пустует
   AnisaL
 
11 - 23.01.13 - 15:05
(10) Да, ужас, я не спорю
   AnisaL
 
12 - 23.01.13 - 15:06
Но вот хочется как-то оптимизировать этот список
   Bober
 
13 - 23.01.13 - 15:06
(9) не видно где получается значение в запросе НеПолученТовар
   tdm
 
14 - 23.01.13 - 15:06
(9) сдается мне не ускорите...
   tdm
 
15 - 23.01.13 - 15:07
(9) если у вас 8.2 прислушайтесь к (4)
   acsent
 
16 - 23.01.13 - 15:07
итоговый запрос каков?
   AnisaL
 
17 - 23.01.13 - 15:07
(13) аах,да, это я с сайта пример скопировала
   Bober
 
18 - 23.01.13 - 15:07
(11) документсписок - там какой тип данных?
   Bober
 
19 - 23.01.13 - 15:09
(17) как вариант:

Отбор = Новый Структура("Ссылка");
Для Каждого ...
...

Отбор.Ссылка = ОформлениеСтроки.Данныестроки.Ссылка;
СписокСтрок = ТаблицаДанныхОформленияСтрок.НайтиСтроки(Отбор);
Если ЗначениеЗаполнено(СписокСтрок) Тогда
   ...
иначе
  ...
конецЕсли;
   AnisaL
 
20 - 23.01.13 - 15:10
(18) ДокументСписок - табличное поле
   Bober
 
21 - 23.01.13 - 15:10
+

ТаблицаДанныхОформленияСтрок.Идексы.Добавить("Ссылка");
(перед циклом)
   Bober
 
22 - 23.01.13 - 15:11
(20) какой там тип документа показывается?
   AnisaL
 
23 - 23.01.13 - 15:11
(20) ДокументСписок.Смета - типзначения
   AnisaL
 
24 - 23.01.13 - 15:12
(16) "выбрать ¶    рег.СсылкබИЗ¶    Документ.Смета КАК рег¶ГДЕ¶   рег.Ссылка В (&МассивСсылокОформления) и  рег.СтатусСметы=&Статус и рег.дата>=&ДатаНачала"
   AnisaL
 
25 - 23.01.13 - 15:13
(24) Итоговый запрос -
"выбрать
рег.Ссылка
ИЗ    Документ.Смета КАК рег
ГДЕ  рег.Ссылка В (&МассивСсылокОформления) и  рег.СтатусСметы=&Статус и рег.дата>=&ДатаНачала"<
   Reset
 
26 - 23.01.13 - 15:13
Бегло просмотрев (9):
Все отборы лишние. Достаточно того отбора, что мы передаем массивом ссылок.
Зато нет главного - определения НеПолученТовар для каждой ссылки
   Bober
 
27 - 23.01.13 - 15:14
(23) тогда не понятно зачем второй раз делать запрос к базе.
Добавить колонки: статус, ЗаказчикСметы, Организации в динамический список и в ПриПолученииДанных в ДанныеСтроки получай и обрабатывай свойства.
   Reset
 
28 - 23.01.13 - 15:15
(25) Не нужно отбора по дате. Но нужно понимание, как определяется "НеПолученТовар "
   AnisaL
 
29 - 23.01.13 - 15:16
(26) На самом деле этот отбор не нужен - он из примера, щас напишу свою процедуру
Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
   // Вставить содержимое обработчика.
 
    
    ЦветКрасный = Новый Цвет(255,130,124);
 
    МассивСсылокОформления = ПолучитьМассивСсылокОформленияСтрок(ОформленияСтрок);
    ТаблицаДанныхОформленияСтрок = ПолучитьТаблицаОформленияСтрок(МассивСсылокОформления);
    Колво= ТаблицаДанныхОформленияСтрок.Количество();
        
    Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        Данныестроки = ОформлениеСтроки.Данныестроки;
        СтрокаОформленияСтрок = ТаблицаДанныхОформленияСтрок.Найти(ОформлениеСтроки.Данныестроки.Ссылка,"Ссылка");
       Сообщить(СтрокаОформленияСтрок); 
        
        Если СтрокаОформленияСтрок.Ссылка.СтатусСметы = перечисления.СтатусСметы.Выполнена Тогда
            ОформлениеСтроки.ЦветФона = ЦветКрасный;
        КонецЕсли;
        
    КонецЦикла;
    
 и еще будет много цветов, просто я пока начала и уже не работает сразу, а вообще по каждой колонке цвета
   AnisaL
 
30 - 23.01.13 - 15:17
(28) На самом все отборы нужны
   AnisaL
 
31 - 23.01.13 - 15:18
(27) Почему второй раз? это первый
   AnisaL
 
32 - 23.01.13 - 15:18
(27) Можно тогда поподробнее как это сделать?
   Reset
 
33 - 23.01.13 - 15:19
(29)
т.е если реквизит документа СтатусСметы равен определенному значению, нужно покарасить строку?
 
 
   AnisaL
 
34 - 23.01.13 - 15:20
(33) Да))
   AnisaL
 
35 - 23.01.13 - 15:20
(33) И так по каждому столбцу
   AnisaL
 
36 - 23.01.13 - 15:21
(15) У нас 8.1
   acsent
 
37 - 23.01.13 - 15:23
а не проще ли статус сразу брать из данных строк и по нему оформление строить?
   Reset
 
38 - 23.01.13 - 15:24
(35) Про другие столбцы не понял.
Для (33) достаточно написать 
Если ДанныеСтроки.СтатусСметы=МоеЗначение тогда
  ОформлениеСтроки.ЦветФона = ЦветКрасный;
КонецЕсли;

доп запросов не нужно
   Reset
 
39 - 23.01.13 - 15:24
Вот и коллега из (37) того же мнения ;)
   AnisaL
 
40 - 23.01.13 - 15:26
(38) Да, у нас так и было только в процедуре ДокументСписокПриВыводеСтроки, а сейчас нужно через пр-ру ПриПолученииДанных
   Reset
 
41 - 23.01.13 - 15:27
(40) Для кода (38) без разницы для быстродействия, где он.
   Reset
 
42 - 23.01.13 - 15:27
(40) Возможно, у вас было 
Если ДанныеСтроки.ССЫЛКА.СтатусСметы=МоеЗначение тогда

Вот это беда
   AnisaL
 
43 - 23.01.13 - 15:29
Ребят, скажите как картинку отправить?
   Reset
 
44 - 23.01.13 - 15:29
Картинка.Отправить()
   Reset
 
45 - 23.01.13 - 15:30
Куда отправить?
В строке отобразить, может?
ОформлениеСтроки.Ячейки.ИмяЯчейки.УстановитьКартинку(Картинка);
   AnisaL
 
46 - 23.01.13 - 15:30
(44) Я имею в виду сюда, хочу журнал смет скинуть
   AnisaL
 
47 - 23.01.13 - 15:31
(46) Как картинку прикрепить?
   Reset
 
48 - 23.01.13 - 15:34
(47) Выложи на файлообменнике. Я не знаю какой лучше, не пользуюсь почти. Ну radikal.ru например
   AnisaL
 
49 - 23.01.13 - 15:36
 
 Рекламное место пустует
   Reset
 
50 - 23.01.13 - 15:37
Значит
ОформлениеСтроки.ЯЧЕЙКИ.ИМЯ.ЦветФона = ЦветКрасный;
   acsent
 
51 - 23.01.13 - 15:38
(49) это что за вырви глаз?
   AnisaL
 
52 - 23.01.13 - 15:39
(49) Вот какая у нас раскраска ))
   AnisaL
 
53 - 23.01.13 - 15:40
(51) Я сама когда увидела первый раз - в шоке была:) сейчас привыкла)
   Reset
 
54 - 23.01.13 - 15:41
Раз условием в (33) не ограничивается, нужно опеределиться с логикой окраски для остальных ячеек.

Потом будет ясно, нужен ли запрос и какой.
   AnisaL
 
55 - 23.01.13 - 15:47
(50) А ЯчейкиИмя - это Имя колонки?
   hhhh
 
56 - 23.01.13 - 15:48
(53)

выбрать
рег.Ссылка,
рег.НеПолученТовар,
рег.СтатусСметы

.....
ИЗ    Документ.Смета КАК рег
 
все надо сюда в запрос

Вы должны понять, что 

рег.Ссылка.СтатусСметы выполняется в 60 раз медленнее, чем рег.СтатусСметы. Когда поймете, тогда у вас получится ускорить.
   Reset
 
57 - 23.01.13 - 15:49
(55) Да, как оно в табличном подле задано
   Reset
 
58 - 23.01.13 - 15:49
(57) Табличном поле* :)
   AnisaL
 
59 - 23.01.13 - 15:50
(58) А я и не заметила даже ;)
   AnisaL
 
60 - 23.01.13 - 15:53
(56) А сейчас в запрос добавляются параметры "СтатусСметы" (например), при выполнени условий (9). А нужно их сразу в запрос записывать без условий?
   AnisaL
 
61 - 23.01.13 - 15:54
(60) А если по ним не будет отбора, то они не нужны же
   Reset
 
62 - 23.01.13 - 16:00
(60) Во первых, НЕ НУЖНО в запрос доп условия - они ведь уже наложены на список (верно?) и заведомо не попадут в те строки, по которым производится окраска.
Во вторых, если СтатусСметы - это реквизит и он присутвует как колонка, запрос не нужен вообще.
Впрочем, я уже повторяюсь. Ладно.
   Bober
 
63 - 23.01.13 - 17:23
(31) в первый раз данные считывает объект ДокументСписок.
Второй раз запросом из фукнции.
Раз все данные для расчета в таблице Документ.ИмяДокумента (а судя по запросу в функции именно так и есть), то нужно в объект ДокументСписок добавить обязательные колонки.
Например в модуле формы после всех процедур и функции
пишем
ДокументСписок.Колонки.Добавить("Статус", Ложь);
Второй параметр отвечает за то чтобы при скрытии этой колонки из списка (через интерфейс или программно) система все равно получала эти данные и они были доступны в ОформлениеСтроки.ДанныеСтроки
   Bober
 
64 - 23.01.13 - 17:24
(63) далее всю логику раскраски переносишь из запроса в цикл
   Evrepid
 
65 - 23.01.13 - 18:03
Японский бог!
Запрос в цикле! Пипец! Это оптимизировать можно только одним способом все переписать!
   Bober
 
66 - 23.01.13 - 18:04
(65) это где?
   Evrepid
 
67 - 23.01.13 - 18:04
А да забыл добавить, что не плохо хотя бы на курсы программирования сходить в 1С... Ну так для начала хотя бы.
   Evrepid
 
68 - 23.01.13 - 18:08
2(66) Если Вы задаете вопрос где запрос в цикле, см. п. 9 этой ветки.
Процедура вызывается из ПриВыводеСтроки.
Собственно, аналогичный запрос в цикле при использовании ПриВыводеДанных...

Что можно оптимизировать? Все нафиг переписывать!
   Reset
 
69 - 23.01.13 - 18:09
(68) Внимательность - не твоя сильная сторона? :)
   Evrepid
 
70 - 23.01.13 - 18:10
2 (69) И где я не прав?
   Reset
 
71 - 23.01.13 - 18:11
(70) Во всех утверждениях (68), кроме последнего
   Evrepid
 
72 - 23.01.13 - 18:17
2 (71) А ну ну...
А процедура ПриВыводеСтроки это что? Не цикл для запроса?
А процедура ПриПолученииДанных Сколько раз выполняется при выводе списка?
Если ответишь на эти вопросы, может поймешь мои слова.

А что быстрее перебор по результату запроса или поиск по таблице значений?

А так да... я не прав... :)
   Reset
 
73 - 23.01.13 - 18:18
(72) Кроме (69), ничего не могу добавить.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует