|
Оптимизация работы в списке "ПриПолученииДанных" | ☑ | ||
---|---|---|---|---|
0
AnisaL
23.01.13
✎
14:57
|
Добрый денек! У меня такая проблемка возникла, есть форма списка документов, к ней привязана процедура "ПриВыводеСтроки". Но так список
достаточно долго открывается, т.к. каждый столбик в каждой строчке имеет свой цвет (как раскраска получается). Хотелось бы оптимизировать этот вывод, в инете нашла ссылку http://help1c.com/faq8/view/1162.html. Вместо ПриВыводеСтроки ПРиПолученииДанных. Вот код процедурки Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок) ЦветКрасный = Новый Цвет(255,130,124); МассивСсылокОформления = ПолучитьМассивСсылокОформленияСтрок(ОформленияСтрок); ТаблицаДанныхОформленияСтрок = ПолучитьТаблицаОформленияСтрок(МассивСсылокОформления); Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл Данныестроки = ОформлениеСтроки.Данныестроки; СтрокаОформленияСтрок = ТаблицаДанныхОформленияСтрок.Найти(ОформлениеСтроки.Данныестроки.Ссылка, "Ссылка"); Если СтрокаОформленияСтрок.НеПолученТовар Тогда ОформлениеСтроки.ЦветФона = ЦветКрасный; КонецЕсли; КонецЦикла; КонецПроцедуры |
|||
1
tdm
23.01.13
✎
14:58
|
в чем вопрос ?
|
|||
2
AnisaL
23.01.13
✎
14:58
|
В моем случае не находит строку
СтрокаОформленияСтрок = ТаблицаДанныхОформленияСтрок.Найти(ОформлениеСтроки.Данныестроки.Ссылка, "Ссылка"); Через отладчик СтрокаОформленияСтрок = НЕОПРЕДЕЛЕНо |
|||
3
Reset
23.01.13
✎
15:00
|
Ответ сокрыт в ПолучитьТаблицаОформленияСтрок
|
|||
4
GROOVY
23.01.13
✎
15:00
|
Используйте динамический список. Намного быстрее отрабатывать будет.
|
|||
5
tdm
23.01.13
✎
15:01
|
(2) обработать этот вариант и всё)...в ПолучитьТаблицаОформленияСтрок нет такой строки значит
|
|||
6
AnisaL
23.01.13
✎
15:01
|
Как я поняла, это из-за того , что у нас в этом списке док-тов
происходит отбор по нескольким параметрам: организация,интервал,видсметы и еще несколько. Как сделать чтоб эта процедура работала? |
|||
7
Bober
23.01.13
✎
15:02
|
добавить в ДокументСписок этот реквизит и скрыть его от пользователя
|
|||
8
Reset
23.01.13
✎
15:03
|
(6) Наладить ПолучитьТаблицаОформленияСтрок
Или, если по логике может так быть, что для определенной ссылки нет условия оформления, добавить проверку найденной строки на неопределено |
|||
9
AnisaL
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); запрос.УстановитьПараметр("датаНачала", датаНачала); запрос.Текст = запрос.Текст+" и рег.дата>=&ДатаНачала"; конецЕсли; конецЕсли; Возврат Запрос.Выполнить().Выгрузить(); КонецФункции // ПолучитьСписокСсылок(ОформленияСтрок)() |
|||
10
Reset
23.01.13
✎
15:05
|
(9) Ужас ;]
|
|||
11
AnisaL
23.01.13
✎
15:05
|
(10) Да, ужас, я не спорю
|
|||
12
AnisaL
23.01.13
✎
15:06
|
Но вот хочется как-то оптимизировать этот список
|
|||
13
Bober
23.01.13
✎
15:06
|
(9) не видно где получается значение в запросе НеПолученТовар
|
|||
14
tdm
23.01.13
✎
15:06
|
(9) сдается мне не ускорите...
|
|||
15
tdm
23.01.13
✎
15:07
|
(9) если у вас 8.2 прислушайтесь к (4)
|
|||
16
acsent
23.01.13
✎
15:07
|
итоговый запрос каков?
|
|||
17
AnisaL
23.01.13
✎
15:07
|
(13) аах,да, это я с сайта пример скопировала
|
|||
18
Bober
23.01.13
✎
15:07
|
(11) документсписок - там какой тип данных?
|
|||
19
Bober
23.01.13
✎
15:09
|
(17) как вариант:
Отбор = Новый Структура("Ссылка"); Для Каждого ... ... Отбор.Ссылка = ОформлениеСтроки.Данныестроки.Ссылка; СписокСтрок = ТаблицаДанныхОформленияСтрок.НайтиСтроки(Отбор); Если ЗначениеЗаполнено(СписокСтрок) Тогда ... иначе ... конецЕсли; |
|||
20
AnisaL
23.01.13
✎
15:10
|
(18) ДокументСписок - табличное поле
|
|||
21
Bober
23.01.13
✎
15:10
|
+
ТаблицаДанныхОформленияСтрок.Идексы.Добавить("Ссылка"); (перед циклом) |
|||
22
Bober
23.01.13
✎
15:11
|
(20) какой там тип документа показывается?
|
|||
23
AnisaL
23.01.13
✎
15:11
|
(20) ДокументСписок.Смета - типзначения
|
|||
24
AnisaL
23.01.13
✎
15:12
|
(16) "выбрать ¶ рег.СсылкබИЗ¶ Документ.Смета КАК рег¶ГДЕ¶ рег.Ссылка В (&МассивСсылокОформления) и рег.СтатусСметы=&Статус и рег.дата>=&ДатаНачала"
|
|||
25
AnisaL
23.01.13
✎
15:13
|
(24) Итоговый запрос -
"выбрать рег.Ссылка ИЗ Документ.Смета КАК рег ГДЕ рег.Ссылка В (&МассивСсылокОформления) и рег.СтатусСметы=&Статус и рег.дата>=&ДатаНачала" |
|||
26
Reset
23.01.13
✎
15:13
|
Бегло просмотрев (9):
Все отборы лишние. Достаточно того отбора, что мы передаем массивом ссылок. Зато нет главного - определения НеПолученТовар для каждой ссылки |
|||
27
Bober
23.01.13
✎
15:14
|
(23) тогда не понятно зачем второй раз делать запрос к базе.
Добавить колонки: статус, ЗаказчикСметы, Организации в динамический список и в ПриПолученииДанных в ДанныеСтроки получай и обрабатывай свойства. |
|||
28
Reset
23.01.13
✎
15:15
|
(25) Не нужно отбора по дате. Но нужно понимание, как определяется "НеПолученТовар "
|
|||
29
AnisaL
23.01.13
✎
15:16
|
(26) На самом деле этот отбор не нужен - он из примера, щас напишу свою процедуру
Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок) // Вставить содержимое обработчика. ЦветКрасный = Новый Цвет(255,130,124); МассивСсылокОформления = ПолучитьМассивСсылокОформленияСтрок(ОформленияСтрок); ТаблицаДанныхОформленияСтрок = ПолучитьТаблицаОформленияСтрок(МассивСсылокОформления); Колво= ТаблицаДанныхОформленияСтрок.Количество(); Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл Данныестроки = ОформлениеСтроки.Данныестроки; СтрокаОформленияСтрок = ТаблицаДанныхОформленияСтрок.Найти(ОформлениеСтроки.Данныестроки.Ссылка,"Ссылка"); Сообщить(СтрокаОформленияСтрок); Если СтрокаОформленияСтрок.Ссылка.СтатусСметы = перечисления.СтатусСметы.Выполнена Тогда ОформлениеСтроки.ЦветФона = ЦветКрасный; КонецЕсли; КонецЦикла; и еще будет много цветов, просто я пока начала и уже не работает сразу, а вообще по каждой колонке цвета |
|||
30
AnisaL
23.01.13
✎
15:17
|
(28) На самом все отборы нужны
|
|||
31
AnisaL
23.01.13
✎
15:18
|
(27) Почему второй раз? это первый
|
|||
32
AnisaL
23.01.13
✎
15:18
|
(27) Можно тогда поподробнее как это сделать?
|
|||
33
Reset
23.01.13
✎
15:19
|
(29)
т.е если реквизит документа СтатусСметы равен определенному значению, нужно покарасить строку? |
|||
34
AnisaL
23.01.13
✎
15:20
|
(33) Да))
|
|||
35
AnisaL
23.01.13
✎
15:20
|
(33) И так по каждому столбцу
|
|||
36
AnisaL
23.01.13
✎
15:21
|
(15) У нас 8.1
|
|||
37
acsent
23.01.13
✎
15:23
|
а не проще ли статус сразу брать из данных строк и по нему оформление строить?
|
|||
38
Reset
23.01.13
✎
15:24
|
(35) Про другие столбцы не понял.
Для (33) достаточно написать Если ДанныеСтроки.СтатусСметы=МоеЗначение тогда ОформлениеСтроки.ЦветФона = ЦветКрасный; КонецЕсли; доп запросов не нужно |
|||
39
Reset
23.01.13
✎
15:24
|
Вот и коллега из (37) того же мнения ;)
|
|||
40
AnisaL
23.01.13
✎
15:26
|
(38) Да, у нас так и было только в процедуре ДокументСписокПриВыводеСтроки, а сейчас нужно через пр-ру ПриПолученииДанных
|
|||
41
Reset
23.01.13
✎
15:27
|
(40) Для кода (38) без разницы для быстродействия, где он.
|
|||
42
Reset
23.01.13
✎
15:27
|
(40) Возможно, у вас было
Если ДанныеСтроки.ССЫЛКА.СтатусСметы=МоеЗначение тогда Вот это беда |
|||
43
AnisaL
23.01.13
✎
15:29
|
Ребят, скажите как картинку отправить?
|
|||
44
Reset
23.01.13
✎
15:29
|
Картинка.Отправить()
|
|||
45
Reset
23.01.13
✎
15:30
|
Куда отправить?
В строке отобразить, может? ОформлениеСтроки.Ячейки.ИмяЯчейки.УстановитьКартинку(Картинка); |
|||
46
AnisaL
23.01.13
✎
15:30
|
(44) Я имею в виду сюда, хочу журнал смет скинуть
|
|||
47
AnisaL
23.01.13
✎
15:31
|
(46) Как картинку прикрепить?
|
|||
48
Reset
23.01.13
✎
15:34
|
(47) Выложи на файлообменнике. Я не знаю какой лучше, не пользуюсь почти. Ну radikal.ru например
|
|||
49
AnisaL
23.01.13
✎
15:36
|
||||
50
Reset
23.01.13
✎
15:37
|
Значит
ОформлениеСтроки.ЯЧЕЙКИ.ИМЯ.ЦветФона = ЦветКрасный; |
|||
51
acsent
23.01.13
✎
15:38
|
(49) это что за вырви глаз?
|
|||
52
AnisaL
23.01.13
✎
15:39
|
(49) Вот какая у нас раскраска ))
|
|||
53
AnisaL
23.01.13
✎
15:40
|
(51) Я сама когда увидела первый раз - в шоке была:) сейчас привыкла)
|
|||
54
Reset
23.01.13
✎
15:41
|
Раз условием в (33) не ограничивается, нужно опеределиться с логикой окраски для остальных ячеек.
Потом будет ясно, нужен ли запрос и какой. |
|||
55
AnisaL
23.01.13
✎
15:47
|
(50) А ЯчейкиИмя - это Имя колонки?
|
|||
56
hhhh
23.01.13
✎
15:48
|
(53)
выбрать рег.Ссылка, рег.НеПолученТовар, рег.СтатусСметы ..... ИЗ Документ.Смета КАК рег все надо сюда в запрос Вы должны понять, что рег.Ссылка.СтатусСметы выполняется в 60 раз медленнее, чем рег.СтатусСметы. Когда поймете, тогда у вас получится ускорить. |
|||
57
Reset
23.01.13
✎
15:49
|
(55) Да, как оно в табличном подле задано
|
|||
58
Reset
23.01.13
✎
15:49
|
(57) Табличном поле* :)
|
|||
59
AnisaL
23.01.13
✎
15:50
|
(58) А я и не заметила даже ;)
|
|||
60
AnisaL
23.01.13
✎
15:53
|
(56) А сейчас в запрос добавляются параметры "СтатусСметы" (например), при выполнени условий (9). А нужно их сразу в запрос записывать без условий?
|
|||
61
AnisaL
23.01.13
✎
15:54
|
(60) А если по ним не будет отбора, то они не нужны же
|
|||
62
Reset
23.01.13
✎
16:00
|
(60) Во первых, НЕ НУЖНО в запрос доп условия - они ведь уже наложены на список (верно?) и заведомо не попадут в те строки, по которым производится окраска.
Во вторых, если СтатусСметы - это реквизит и он присутвует как колонка, запрос не нужен вообще. Впрочем, я уже повторяюсь. Ладно. |
|||
63
Bober
23.01.13
✎
17:23
|
(31) в первый раз данные считывает объект ДокументСписок.
Второй раз запросом из фукнции. Раз все данные для расчета в таблице Документ.ИмяДокумента (а судя по запросу в функции именно так и есть), то нужно в объект ДокументСписок добавить обязательные колонки. Например в модуле формы после всех процедур и функции пишем ДокументСписок.Колонки.Добавить("Статус", Ложь); Второй параметр отвечает за то чтобы при скрытии этой колонки из списка (через интерфейс или программно) система все равно получала эти данные и они были доступны в ОформлениеСтроки.ДанныеСтроки |
|||
64
Bober
23.01.13
✎
17:24
|
(63) далее всю логику раскраски переносишь из запроса в цикл
|
|||
65
Evrepid
23.01.13
✎
18:03
|
Японский бог!
Запрос в цикле! Пипец! Это оптимизировать можно только одним способом все переписать! |
|||
66
Bober
23.01.13
✎
18:04
|
(65) это где?
|
|||
67
Evrepid
23.01.13
✎
18:04
|
А да забыл добавить, что не плохо хотя бы на курсы программирования сходить в 1С... Ну так для начала хотя бы.
|
|||
68
Evrepid
23.01.13
✎
18:08
|
2(66) Если Вы задаете вопрос где запрос в цикле, см. п. 9 этой ветки.
Процедура вызывается из ПриВыводеСтроки. Собственно, аналогичный запрос в цикле при использовании ПриВыводеДанных... Что можно оптимизировать? Все нафиг переписывать! |
|||
69
Reset
23.01.13
✎
18:09
|
(68) Внимательность - не твоя сильная сторона? :)
|
|||
70
Evrepid
23.01.13
✎
18:10
|
2 (69) И где я не прав?
|
|||
71
Reset
23.01.13
✎
18:11
|
(70) Во всех утверждениях (68), кроме последнего
|
|||
72
Evrepid
23.01.13
✎
18:17
|
2 (71) А ну ну...
А процедура ПриВыводеСтроки это что? Не цикл для запроса? А процедура ПриПолученииДанных Сколько раз выполняется при выводе списка? Если ответишь на эти вопросы, может поймешь мои слова. А что быстрее перебор по результату запроса или поиск по таблице значений? А так да... я не прав... :) |
|||
73
Reset
23.01.13
✎
18:18
|
(72) Кроме (69), ничего не могу добавить.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |