Имя: Пароль:
1C
1С v8
Оптимизация работы в списке "ПриПолученииДанных"
,
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), ничего не могу добавить.