Имя: Пароль:
1C
1С v8
v8: Вот и мне заказали вывести подчиненный док в форму списка ..прям пошесть какая-то
, ,
0 palpetrovich
 
26.06.12
14:40
или мода... Общаются куроводители между собой, форум мо какой-то  или как вирус, ветром заносит

Короче, нарисовал через Соответствия в СписокПриПолученииДанных - замедление заметно даже на двух десятках строк.
Думаю в направлении кеширования, пара вопросов по этому поводу:
- ТЗкеша каждому своя или глобальная, для всех ?
- Когда (где) ее правильнее заполнять (дополнять)?
ну и вообще, стоит-ли заморачиваться? я их паредупреждал насчет тормозов, может пусть иучаются? ;)
1 palpetrovich
 
26.06.12
14:46
+0 вот никогда не задумывлся, как оно живется с глобальной ТЗ, вобще - реально?... может и не надо?
2 Дядя Вова
 
26.06.12
14:46
Почему не сделать доп. реквизит у дока владельца и при записи подчиненного вписывать инфу о нем в этот реквизит? А в форме списка потом просто выводить колонку со значением этого реквизита. И тормзов нема...
ну или в комментарий дока-владельца вписывать инфу о подчиненном
3 YF
 
26.06.12
14:47
(0) Произвольный запрос в динамическом списке?
4 palpetrovich
 
26.06.12
14:51
(2) ну это вообще не наш метод, дерать старые документы из-за этого - не айс
(3) это вы с кем сейчас разговаривали? :) ...у меня эти слова ассоциируются только с управлякмыми формами почему-то :)
5 Fragster
 
гуру
26.06.12
14:54
(0) сделай не через построчное получение, а запили в ТЗ, а потом запросом нужные данные к этой ТЗ подцепи
6 kosts
 
26.06.12
14:54
Сделай на управляемой форме через динамический список, если нет отводов от УФ.
7 Fragster
 
гуру
26.06.12
14:54
(6) а вдруг оно в 8.1
8 Дядя Вова
 
26.06.12
14:55
(4) Ну да, а так, 8-ка и так тормозная, так еще ее и "нашими" методами затормозим. Ну, как хотите, это моё ИМХО ))
9 unregistered
 
26.06.12
14:56
(0) И как ты видишь себе ТЗКеша? Что в ней должно быть?

Вообще странно. У нас есть парочка подобных списков, куда выводятся реквизиты подчиненных документов, но смертельных тормозов вроде как нет - так только иногда немного притормаживает при обычном построчном пролистывании (на клавиатуре стрелками вверх/вниз). Хотя и количество документов и размер самой БД немаленькие.
10 palpetrovich
 
26.06.12
15:00
(5)  "запили в ТЗ" - когда? ПриОткрытии?
(6) Отводы есть :)
(8) Дядя Вова, бросьте Вы эти мысли :)
(9) ТЗКеша - (Ссылка, ПодчиненныйДок) ...тормоза не смертельные, но заметные. Мо я не так что сделал, пожалуй выложу код:

Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
   
   ПоказыватьРеализациюВЗаказах = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"),
   "ПоказыватьРеализациюВЗаказах");
   Если НЕ ПоказыватьРеализациюВЗаказах Тогда
       Возврат;
   КонецЕсли;
   
   Соответствия = Новый Соответствие;
   СписокЗаказов.Очистить();
   Для Каждого ЭлементОформления Из ОформленияСтрок Цикл
       СписокЗаказов.Добавить(ЭлементОформления.ДанныеСтроки.Ссылка);
       Соответствия.Вставить(ЭлементОформления.ДанныеСтроки.Ссылка, ЭлементОформления.Ячейки.Реализация);
   КонецЦикла;    
   Запрос = Новый Запрос("ВЫБРАТЬ
                         |    РеализацияТоваровУслуг.Сделка,
                         |    РеализацияТоваровУслуг.Номер,
                         |    РеализацияТоваровУслуг.Дата
                         |ИЗ
                         |    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
                         |ГДЕ
                         |    РеализацияТоваровУслуг.Сделка В(&СписокЗаказов)");
   Запрос.УстановитьПараметр("СписокЗаказов", СписокЗаказов);
   Выборка = Запрос.Выполнить().Выбрать();
   Пока Выборка.Следующий() Цикл
       Ячейка = Соответствия.Получить(Выборка.Сделка);        
       Ячейка.Текст = "№ "+ Выборка.Номер + " от " + Формат(Выборка.Дата, "ДФ=dd.MM.yyyy");        
       Ячейка.ОтображатьТекст = Истина;    
   КонецЦикла;
   
КонецПроцедуры
11 kosts
 
26.06.12
15:04
(10) ТЗ для кэша не нужно использовать. Лучше соответствие.
12 Asirius
 
26.06.12
15:08
(0) Выводи не в колонку списока, а в окошко под списком - туда можно и все подчиненные запихнуть.
и выводи не сразу, а спустя 0.1 сек только при смете текущего документа (через обработку ожидания) - так скроллинг не будет тормозить
13 palpetrovich
 
26.06.12
15:08
(11) ну да, наверное будет быстрее. Я только не въезжаю где будет выигрыш. Если все-равно надо постоянно дергать сервер на предмет изменений ...хотя если предположить, что подчиненныйДок - вешь неизменная, то дергать сервер можно только для незаполненных
14 palpetrovich
 
26.06.12
15:09
(12) не хотят, я им предлагал и так и в список по кнопке "обновить". Хотят все и сразу :)
15 H A D G E H O G s
 
26.06.12
15:10
Бредятина какая-то.
16 H A D G E H O G s
 
26.06.12
15:11
Тут остатки то махом получаются, а тут - пару реквизитов запросить.
17 H A D G E H O G s
 
26.06.12
15:11
Настраивайте железо, sql, ищите узкие места везде, но только не здесь.
18 H A D G E H O G s
 
26.06.12
15:13
Я бы не стал в Соответствие ничего пихать, я бы 2 раза по ОформлениюСтрок прошел бы и через НайтиСледующий для 2 раза нашел бы Номер и Дату.
19 H A D G E H O G s
 
26.06.12
15:14
Особенно не стал бы в соответствие пихать Ячейку.
20 H A D G E H O G s
 
26.06.12
15:15
Соответствие - индексируемый объект, здесь оно не нужно.
21 palpetrovich
 
26.06.12
15:16
(18) не понял, я таки написал фигню?
22 palpetrovich
 
26.06.12
15:17
+21 мне что, в цикле  Для Каждого ЭлементОформления Из ОформленияСтрок Цикл
делатьт запрос по одному, текущему доку?
23 unregistered
 
26.06.12
15:18
(10) У нас примерно так же.

Только в запросе левое соединение вместо использования раздела ГДЕ.

И сам текст ячеек заполняем из запроса без использования всяких тормозных функций типа сложения строк и Формат().

То есть для вашего примера я бы добавил две колонки в список - отдельно ДатаРеализации и отдельно НомерРеализации, через соответствие получал бы не ячейку, а ОформлениеСтроки и уже для него выполлнял бы код типа

Пока Выборка.Следующий() Цикл
  ОформлениеСтроки = Соответствие.Получить(Выборка.Ссылка);
  ОформлениеСтроки.Ячейки.НомерРеализации.УстановитьТекст(Выборка.Номер);
  ОформлениеСтроки.Ячейки.ДатаРеализации.УстановитьТекст(Выборка.Дата);
КонецЦикла;


Только это всё мелочи. Тормоза может где-то в другом месте?
24 H A D G E H O G s
 
26.06.12
15:18
(21) Я не уверен. Я бы
-1) Переписал, уйдя от Соответствия.
-2) Посмотрел на что уходит время в процентах.
25 kosts
 
26.06.12
15:18
(13) Реквизит подчиненного документа по которому его ищешь в запросе должен быть индексированным.

Соответствие в (10) это промежуточный объект (он может быть хоть списком хоть массивом что ли), не путайте его с кэшем, который рекомендую сделать именно структурой.
26 H A D G E H O G s
 
26.06.12
15:19
(23) pffff, нашли где тормоза искать.
27 Fragster
 
гуру
26.06.12
15:19
(22) сначала получи все ссылки, потом один запрос по этим ссылкам
28 kosts
 
26.06.12
15:19
(25)

(13) Реквизит подчиненного документа по которому его ищешь в запросе должен быть индексированным.

Соответствие в (10) это промежуточный объект (он может быть хоть списком хоть массивом что ли), не путайте его с кэшем, который рекомендую сделать именно СООТВЕТСТВИЕМ.
29 H A D G E H O G s
 
26.06.12
15:20
30 palpetrovich
 
26.06.12
15:22
(24) Выборка = Запрос.Выполнить().Выбрать(); 97%
(22)сейчас попробую ...я так понимаю потом использовать  НайтиСледующий?
31 H A D G E H O G s
 
26.06.12
15:22
Да, индексировать бы его было бы правильно.
32 Fragster
 
гуру
26.06.12
15:23
(29) там, кстати, неоптимально
33 H A D G E H O G s
 
26.06.12
15:23
(30) Индексируй сначало реквизит "Сделка". В типовых он не индексирован.
34 orefkov
 
26.06.12
15:24
Пипец 8ка, закат солнца^w^w организация левого хэш джойна вручную...
35 H A D G E H O G s
 
26.06.12
15:24
(32) Дай угадаю.. Сброс выборки? Фигня.. Ищется также быстро, как и при НайтиСтроки() индексированной ТЗ без учета Индексирования ТЗ.
36 R41
 
26.06.12
15:25
(28) +1
Полностью поддерживаю
37 palpetrovich
 
26.06.12
15:27
(33) Сделка - ОЧЕНЬ сильно составной, может ну его, индексировать?
38 Fragster
 
гуру
26.06.12
15:27
(35) нет, надо в сам запрос пихнуть ТЗ со счетчиком и ссылкой, запрос по нему сортировать во втором обходе получать строки напрямую по индексу или прямо выборку обходить
39 Fragster
 
гуру
26.06.12
15:28
(37) а как это влияет НА ИНДЕКСИРОВАНИЕ?
40 orefkov
 
26.06.12
15:29
(37)
Конечно, ведь гораздо лучше каждый раз перебирать все РеализацияТоваровУслуг с начала времен в поисках парочки с нужными сделками.
41 H A D G E H O G s
 
26.06.12
15:30
(38) Нехрен пихать всякую хрень на сервер.
42 H A D G E H O G s
 
26.06.12
15:30
(37) Пофиг.
43 Fragster
 
гуру
26.06.12
15:32
(41) пара байт на строку, зато потом не надо дергать выборку туда сюда 50 раз
44 H A D G E H O G s
 
26.06.12
15:33
(43) Выборка сразу вся не ползет?
45 palpetrovich
 
26.06.12
15:34
(40) ну сначала-то времен зачем? начало выборки известно :)
46 Fragster
 
гуру
26.06.12
15:37
(44) зачем ей?
47 orefkov
 
26.06.12
15:37
(45)
В (10) я что-то этого не увидел.
Да и как может быть известна дата начала выборки?
Только если предполагать, что сделка всегда раньше заказа. А вдруг где-то не так, тупо косяк в базе например?
И все, ничего не покажет.
48 Fragster
 
гуру
26.06.12
15:37
(46)+ тем более что в ней только нужные данные, они и так придут
49 H A D G E H O G s
 
26.06.12
15:38
(48) Ладно, уговорил.
50 unregistered
 
26.06.12
15:43
Интересно, а есть принципиальная разница между методом в (29) и методом в (10)?

В первом случае обходится коллекция ОформленияСтрок и ищется нужная информация в Выборка.
Во втором - обходится Выборка и ищется нужный элемент коллекции ОформленияСтрок через Соответствие.

ИМХО, если Выборка может быть меньше чем количество строк (в случае с остатками - остатки могут быть далеко не по всей номенклатуре, а в случае с реквизитами подчиненных документов вполне нормально, когда подчиненные документы есть не у каждого заказа), то цикл будет работать пошустрее (меньше итераций).

Хотя если 97% времени - это выполнение запроса, то мой вопрос вообще не принципиален :)
51 palpetrovich
 
26.06.12
15:43
(47) ну это в (10) нету  :)
так малехо быстрее

   Для Каждого ЭлементОформления Из ОформленияСтрок Цикл
       СписокЗаказов.Добавить(ЭлементОформления.ДанныеСтроки.Ссылка);
   КонецЦикла;    
   Запрос = Новый Запрос("ВЫБРАТЬ
                         |    РеализацияТоваровУслуг.Сделка,
                         |    РеализацияТоваровУслуг.Ссылка
                         |ИЗ
                         |    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
                         |ГДЕ
                         |    РеализацияТоваровУслуг.Сделка В(&СписокЗаказов)");
   Запрос.УстановитьПараметр("СписокЗаказов", СписокЗаказов);
   
   РезультатЗапроса=Запрос.Выполнить();
   Если НЕ РезультатЗапроса.Пустой() Тогда
       Выборка=РезультатЗапроса.Выбрать();
       Для Каждого ЭлементОформления Из ОформленияСтрок Цикл
           Выборка.Сбросить();
           Если Выборка.НайтиСледующий(ЭлементОформления.ДанныеСтроки.Ссылка,"Сделка") Тогда
               ЭлементОформления.Ячейки.Реализация.ОтображатьТекст = Истина;
               ЭлементОформления.Ячейки.Реализация.Текст = Выборка.Ссылка;
           КонецЕсли;
       КонецЦикла;
   КонецЕсли;
52 unregistered
 
26.06.12
15:46
(51) Что-то я сомневаюсь, что можно заметить разницу в 3% по производительности визуально.

Ведь 97% по-прежнему уходит на выполнение запроса?
53 Fragster
 
гуру
26.06.12
15:58
кажися хэш таблицы медленнее простого обхода выборки работают, не?
54 anddro
 
26.06.12
16:03
(51) тут в любом случае скрытый запрос в цикле: ЭлементОформления.Ячейки.Реализация.Текст = Выборка.Ссылка; из ссылки формируется представление.

имхо лучше отдельный РС, измерения "ДокументОснование", "ПодчиненныйДокумент", реквизит "ПредставлениеПодчиненного" (в принципе можно несколько с разными вариантами представлений), тип строка. Заполнять по подписчику ПриЗаписи на все возможные подчиненные.
55 palpetrovich
 
26.06.12
16:03
(51) ну конечно не визуально, в отладчике  74%  ..я правда заменил Номер, Дата на Ссылку :)
56 H A D G E H O G s
 
26.06.12
16:04
Заменить
|    РеализацияТоваровУслуг.Ссылка
на
|    Представление(РеализацияТоваровУслуг.Ссылка) как Ссылка
57 H A D G E H O G s
 
26.06.12
16:05
Ну и индексировать Сделку.
58 palpetrovich
 
26.06.12
16:05
(54) сам думал об этом, еще в какой-то предыдущей ветке, когда советовал автору послать заказчика с его хотелками ;)
59 palpetrovich
 
26.06.12
16:06
(57) ну уговорил, ща проиндексирую
кста, я там дату добавил
   Для Каждого ЭлементОформления Из ОформленияСтрок Цикл
       Если ДатаНач = "" Тогда
           ДатаНач = ЭлементОформления.ДанныеСтроки.Ссылка.Дата;
       КонецЕсли;    
       СписокЗаказов.Добавить(ЭлементОформления.ДанныеСтроки.Ссылка);
   КонецЦикла;    
...
                         |    И РеализацияТоваровУслуг.Дата >= &ДатаНач");
дык, на ДатаНач = ЭлементОформления.ДанныеСтроки.Ссылка.Дата;  20% ушло :)
60 orefkov
 
26.06.12
16:07
(55)
Да попробуй уже на копии проиндексировать поле, сразу разницу ощутишь.
А то сейчас получается, решаешь, чем море лучше вычерпать - ковшиком или кастрюлькой.
61 rutony
 
26.06.12
16:08
можно еще запрос вынести за предела обработчика и регулировать только параметрами
62 H A D G E H O G s
 
26.06.12
16:08
(59) Хрень
63 Fragster
 
гуру
26.06.12
16:09
(59) конечно, он по количеству строк дергл базу
64 acsent
 
26.06.12
16:09
(56) бессмысленно. все равно ссылка никуда не выводится. А так да кося к в отсутствии индекса
65 H A D G E H O G s
 
26.06.12
16:10
(64) У автора - выводиться.
66 palpetrovich
 
26.06.12
16:12
(60) индексирую
(62) а че? ограничение периода ничего не даст?
(63) дык, выборка то по Реализации
(65) как строка
67 palpetrovich
 
26.06.12
16:13
поиндексировал. На двух десятках доков - разницы не заметил
68 H A D G E H O G s
 
26.06.12
16:13
(67) Сколько всего реализаций?
69 palpetrovich
 
26.06.12
16:14
(68) 23 :)
70 H A D G E H O G s
 
26.06.12
16:15
(69) Забей. Индекс будет работать от 600 и более доков. Примерно.
71 H A D G E H O G s
 
26.06.12
16:16
Немного непонятен смысл
И РеализацияТоваровУслуг.Дата >= &ДатаНач"

но если надо, замени
ДатаНач = ЭлементОформления.ДанныеСтроки.Ссылка.Дата;
на
ДатаНач = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ЭлементОформления.ДанныеСтроки.Ссылка,"Дата");
72 palpetrovich
 
26.06.12
16:17
(70) ясно. Так что, заморачиваться с датойНачала не стоит?
73 orefkov
 
26.06.12
16:17
(69)
Щито ?!
74 palpetrovich
 
26.06.12
16:18
(71) есть разница?
75 palpetrovich
 
26.06.12
16:19
(73) я-ж говорил, работаю почти в пустой копии, рабочая база на другом конце города :)
76 H A D G E H O G s
 
26.06.12
16:19
(74) Есть. Только я не понимаю, почему ты хочешь ограничить выборку реализаций датой первой сделки.
77 H A D G E H O G s
 
26.06.12
16:19
Поди еще и файловая.
78 H A D G E H O G s
 
26.06.12
16:20
Запрос с ПОДОБНО у меня выполняется пару минут на файловой и 8 секунд на SQL, к примеру.
79 palpetrovich
 
26.06.12
16:21
(76) Заказ всегда раньше реализации. Это УТ для Украины есчё :/
(77) угу
80 orefkov
 
26.06.12
16:21
(75)
Так тормозит то где? На рабочей? И сколько там реализаций?
Наколоти в копии хотя бы пару тысяч реализаций.
81 H A D G E H O G s
 
26.06.12
16:24
И РеализацияТоваровУслуг.Дата >= &ДатаНач"

имеет смысл, если Сделка не индексирована.
82 H A D G E H O G s
 
26.06.12
16:24
Если Сделку индексировал - убери это
83 H A D G E H O G s
 
26.06.12
16:24
(79)
Заказ всегда раньше реализации. Это УТ для Украины есчё :/

pfff.
84 palpetrovich
 
26.06.12
16:27
(81) спасибо, не знал ...кста ступил, так можно ДатаНач = ЭлементОформления.ДанныеСтроки.Дата;
(80) тормоза не смертельные, просто все-таки заметно, вот я и решил что на большой будет хуже  
(83) pfff. - эт что? ...типа я не прав? :)
85 orefkov
 
26.06.12
16:27
+(83)
У меня всегда было, как только пишешь прогу с расчетом, что "ЭТОГО не может быть никогда", как в первый же день запуска "ЭТО" случается :)
86 palpetrovich
 
26.06.12
16:30
(85) не, ну может конечно случиться, но кто им доктор?
кста, всегда мучил вопрос, но стеснялся спросить, а где в замере производительности посмотреть ОБЩЕЕ время выполнения?
87 palpetrovich
 
26.06.12
16:38
ап
по (86) есть ответ   ...и все :)
88 palpetrovich
 
26.06.12
16:42
+86, все, нашел, вопрос снят :)
Всем спасибо!