Имя: Пароль:
1C
1С v8
Помогите оптимизировать код
,
0 only82
 
17.09.11
19:37
Написал такую процедуру.

Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза)
   
   Если Строка(ТипЗнч(ЭлементДанных)) = "Справочник объект: Физические лица" Тогда
       
       ОтправкаЭлемента = Обмен.ПроверитьОтправку(Ссылка, ЭлементДанных, ЭлементДанных.НаселенныйПункт.Район);
       
   ИначеЕсли Строка(ТипЗнч(ЭлементДанных)) = "Справочник объект: Населенные пункты" Тогда
       
       ОтправкаЭлемента = Обмен.ПроверитьОтправку(Ссылка, ЭлементДанных, ЭлементДанных.Район);
       
   ИначеЕсли Строка(ТипЗнч(ЭлементДанных)) = "Справочник объект: Районы" Тогда
       
       ОтправкаЭлемента = Обмен.ПроверитьОтправку(Ссылка, ЭлементДанных, ЭлементДанных.Ссылка);
       
   ИначеЕсли Строка(ТипЗнч(ЭлементДанных)) = "Справочник объект: Сельсоветы" Тогда
       
       ОтправкаЭлемента = Обмен.ПроверитьОтправку(Ссылка, ЭлементДанных, ЭлементДанных.Район);
       
   ИначеЕсли Строка(ТипЗнч(ЭлементДанных)) = "Регистр сведений набор записей: Штрихкоды" Тогда
       
       ОтправкаЭлемента = Обмен.ПроверитьОтправку(Ссылка, ЭлементДанных, ЭлементДанных.Отбор.Владелец.Значение.НаселенныйПункт.Район);
       
   ИначеЕсли Строка(ТипЗнч(ЭлементДанных)) = "Регистр сведений набор записей: Фамилия, имя, отчество физического лица" Тогда
       
       ОтправкаЭлемента = Обмен.ПроверитьОтправку(Ссылка, ЭлементДанных, ЭлементДанных.Отбор.ФизЛицо.Значение.НаселенныйПункт.Район);
       
   ИначеЕсли Строка(ТипЗнч(ЭлементДанных)) = "Регистр сведений набор записей: Состояние" Тогда
       
       ОтправкаЭлемента = Обмен.ПроверитьОтправку(Ссылка, ЭлементДанных, ЭлементДанных.Отбор.ФИО.Значение.НаселенныйПункт.Район);
       
   КонецЕсли;
   
КонецПроцедуры


Думаю, что есть более простой вариант, чем 6 раз использовать ИначеЕсли. Причем объектов будет больше и условий соответственно тоже.
1 Grusswelle
 
17.09.11
19:39
(0) Нормально так ты на тонком клиенте херачишь...
2 poligraf
 
17.09.11
19:39
(0) ты в субботу вечером хочешь помощи или чтобы постебались?

Можно оптимизировать.
Смотреть в сторону массивов/таблиц значений/соответствий и т.д.
3 trambalda
 
17.09.11
19:39
А что с типом Тип нельзя сравнивать? Обязательно строки мучать?
4 Рэйв
 
17.09.11
19:39
>>Строка(ТипЗнч(ЭлементДанных)) = "Справочник объект: Физические лица"


уже пять:-)
Читай радчеко чтоли.
5 poligraf
 
17.09.11
19:40
(1) поделись мудростью: по такому коду как тип клиента определить?:)

(2) это более продвинутые уровни.
6 only82
 
17.09.11
19:42
(1) Тонкий
7 only82
 
17.09.11
19:43
(4) Какая разница что сравнивать. Вопрос совсем другой
8 Grusswelle
 
17.09.11
19:43
(5) -> (6) Вот видишь! :-))

ЗЫ: Не поделюсь! :-Р
9 Rie
 
17.09.11
19:43
(2) Построение массива/таблицы значений/соответствия - займёт не меньше времени, чем подобный перебор. IMHO.

(0) "Лучшее - враг хорошего". Детали разве что можешь подрихтовать.
10 only82
 
17.09.11
19:45
Если б был оператор типа case of
11 trambalda
 
17.09.11
19:45
(7) ИначеЕсли нормальное решение, надо оптимизировать выражения
12 Рэйв
 
17.09.11
19:45
(7)Действиельно..Какая разница? Ну и живи дураком.
13 popcorn
 
17.09.11
19:47
(0) используй соответствие которое создается независимо от процедуры ПриОтправкеДанныхПодчиненному один раз, и потом в процедуре используется сколько угодно.
14 only82
 
17.09.11
19:47
(12) Я думаю если сравнивать объекты метаданных а не строки - это на скорости никак не отразится
15 Рэйв
 
17.09.11
19:49
(12)Вопрос спорный. Сам не мерил..Так что.
16 poligraf
 
17.09.11
19:49
(9) т.е. предлагаешь при каждом вызове процедуры заново отстраивать...
Эх... Кто придумывал кэширование данных тебя не послушались. Дураки.

(11) В ассемблере по тактам не оптимизировал код:)
17 Рэйв
 
17.09.11
19:49
(15)->(14)
18 popcorn
 
17.09.11
19:49
(0) еще можно вынести расчет выражения Строка(ТипЗнч(ЭлементДанных)) за блок "Если", то будет оптимальнее.

Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза)
   ячячяч = Строка(ТипЗнч(ЭлементДанных))
   Если ячячяч = "Справочник объект: Физические лица" Тогда
       
       ОтправкаЭлемента = Обмен.ПроверитьОтправку(Ссылка, ЭлементДанных, ЭлементДанных.НаселенныйПункт.Район);
       
   ИначеЕсли ячячяч = "Справочник объект: Населенные пункты" Тогда
       
       ОтправкаЭлемента = Обмен.ПроверитьОтправку(Ссылка, ЭлементДанных, ЭлементДанных.Район);
...............
19 Рэйв
 
17.09.11
19:51
(18)много грибов съел перед этим?
20 popcorn
 
17.09.11
19:52
(19) ну съел немного шампиньонов, а что?
21 Рэйв
 
17.09.11
19:52
(20)Заметно
22 Rie
 
17.09.11
19:53
(16) Что именно "заново отстраивать"? Чем будешь это соответствие/таблицу заполнять - для данного случая? Когда у него то ЭлементДанных.НаселенныйПункт.Район, то ЭлементДанных.Отбор.ФизЛицо.Значение.НаселенныйПункт.Район?
23 popcorn
 
17.09.11
19:53
(21) чем?
24 poligraf
 
17.09.11
19:54
(18) думать не хочется, но еще на ступеньку оптимальней будет
Выполнить(НекаяКоллекция[ячячяч])
25 Rie
 
17.09.11
19:55
(24) Выполнить - разве что затормозит.
26 Рэйв
 
17.09.11
19:56
ну вы тут поспорьте, ребята, я пока за пивом схожу.  Чуется мне будут общие темы.
27 Рэйв
 
17.09.11
19:56
-20 минут
28 only82
 
17.09.11
20:00
Еще думал над вариантом перебирать все реквизиты для каждого объекта и искать среди них СправочникСсылка.Район, тогда для новых объектов не нужно будет ничего прописывать ПриОтправкеДанныхПодчиненному. Но думаю что это еще больше будет тормозить работу
29 popcorn
 
17.09.11
20:01
Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза)
   зщзщ = Строка(ТипЗнч(ЭлементДанных))
   ячячяч = Новый Соответствие();
   ячячяч["Справочник объект: Физические лица"] = ЭлементДанных.НаселенныйПункт.Район;
   ячячяч["Справочник объект: Населенные пункты"] = ЭлементДанных.Район;
   ячячяч["Справочник объект: Районы"] = ЭлементДанных.Ссылка;
   ячячяч["Справочник объект: Сельсоветы"] = ЭлементДанных.Район;
........................
........................      
   ОтправкаЭлемента = Обмен.ПроверитьОтправку(Ссылка, ЭлементДанных, ячячяч[зщзщ] );
   
КонецПроцедуры
30 Rie
 
17.09.11
20:02
(29) Всё это строится при каждом вызове процедуры и наружу его не вынесешь.
31 Rie
 
17.09.11
20:03
(28) Оптимизируй проверяемые выражения.
А Если ... Тогда - работает достаточно быстро. И уж явно побыстрее всяких Выполнить, и уж тем более циклов по метаданным.
32 popcorn
 
17.09.11
20:03
(30) ну и хрен с ним. Пусть будет. Зато красиво и без кучи ИначиЕсли
33 Rie
 
17.09.11
20:04
(32) И существенно тормознутее.
34 only82
 
17.09.11
20:04
(29) Сразу выдаст ошибку. Если объект ФизЛицо и я напишу
ячячяч["Справочник объект: Населенные пункты"] = ЭлементДанных.Район; оно ругнеться что нет реквизита Район
35 popcorn
 
17.09.11
20:06
(34) пропиши во все объекты реквизит .Район и присвой ему район который каждый раз в непонять где у тебя.
36 Rie
 
17.09.11
20:06
(34) У тебя в (0) - нормальный вариант. Только замени сравнение строк сравнением типов - и наступит счастье.
37 Rie
 
17.09.11
20:07
(35) Издеваешься?
38 popcorn
 
17.09.11
20:07
(36) тогда лучше как (18)
39 popcorn
 
17.09.11
20:08
(37) так не придется городить процедуру с перебором
40 Rie
 
17.09.11
20:08
(38) Тогда лучше ТипЗнч(...)=Тип(...) и не мучить строки.
41 Rie
 
17.09.11
20:09
(39) А что плохого в процедуре с перебором? В данном случае, IMHO, это как раз лучшее решение.
42 popcorn
 
17.09.11
20:09
(40) Тип(...) быстрее выполняется чем константа строка?
43 popcorn
 
17.09.11
20:11
(41) плохого в том что это перебор вместо прямого обращения к реквизиту.
44 Rie
 
17.09.11
20:12
(42) Не чем константа, а чем получение представления типа из типа и сравнение строк.
45 popcorn
 
17.09.11
20:13
(44) представление типа вынимается всего один раз, а затем только строки сравниваются. Ты тоже грибы ел?
46 Rie
 
17.09.11
20:14
(43) Дык нет реквизита-то. У него ведь и ЭлементДанных.Отбор.Владелец.Значение.НаселенныйПункт.Район имеется. А всобачивать реквизиты повсюду ради одной (вспомогательной) процедуры - это как-то не интеллигентно.

Перебор же - ничем не плох. Наоборот - поскольку перечень условий, если верить (0), будет пополняться, перебор окажется весьма гибким решением.
47 Fynjy
 
17.09.11
20:14
Метаданные.Документы.Содержит() ... Строки изврат ...
48 Rie
 
17.09.11
20:15
(45) Один раз. Но - таки выполняется?
Ну и сравнение строк - нисколько не быстрее сравнения типов.
49 popcorn
 
17.09.11
20:16
(46) почему не интеллигентно? Можно и всобачить если это поможет быстродействию.
50 popcorn
 
17.09.11
20:18
(48) Таки да, примерно одинаково получается.
Что, думаешь "Выполнить" один раз будет медленнее чем несколько повторных сравнений?
51 Rie
 
17.09.11
20:19
(49) Посмотри в (0) - куда этот Район всобачивать придётся. И это ведь неполный список. И ведь Район надо будет заполнять. Так что выигрыша в быстродействии что-то не видать.
52 only82
 
17.09.11
20:19
Изначально вопрос был совсем о другом, а все зациклились на том какие типы лучше сравнивать.
Решил оставить как есть.
53 Rie
 
17.09.11
20:19
(50) Выполнить - конечно медленнее. Ему ведь разобрать свой параметр надо (каждый раз!) - а это не самый лёгкий труд. Сравнения же - уже скомпилированы.
54 Rie
 
17.09.11
20:20
(52) И правильно сделал! Ибо это - лучшее, что можно придумать. IMHO.
55 popcorn
 
17.09.11
20:20
(51) Если ты не видишь выигрыша в быстродействии если всю процедуру заменить одним выражением, то спорить бесполезно.
56 popcorn
 
17.09.11
20:21
(53) И во сколько раз выполнить медленнее одного сравнения?
57 popcorn
 
17.09.11
20:22
(52) Воспользуйся хотябы советом (18) если оставляешь как есть
58 Rie
 
17.09.11
20:24
(56) А напиши хотя бы парсер хотя бы для простого арифметического выражения. И посмотри, во сколько раз медленнее.
59 orefkov
 
17.09.11
20:25
В языках с нормальным ООП вся бы эта конструкция записалась как:
ОтправкаЭлемента = Обмен.ПроверитьОтправку(Ссылка, ЭлементДанных, ЭлементДанных.ПолучитьРайон());

И соответственно, каждый бы тип имел свою реализацию метода "ПолучитьРайон()"
60 crazy_killer
 
17.09.11
20:25
(52) >> Решил оставить как есть.

рекомендацию из (18) все-таки лучше учесть
61 popcorn
 
17.09.11
20:29
(59) кстати, да. Можно же в модуле объекта или его менеджера прописать процедуру к которой потом обращаться таким образом?
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший