Имя: Пароль:
1C
 
Чем опасны (вредны) метки?
0 Kiber
 
10.07.08
22:14
Все до единого программисты говорят что метки вредны.
Кто-нибудь мог-бы точно объяснить чем вредны метки в 77 (кроме непристойности кода)?
И в догонку тому, кто использовал метки: можно-ли в переходе по метке использовать переменные?
1 France
 
10.07.08
22:17
это стереотип, который вбили в голову в эпоху перехода к структурном программирования в 60-х годах прошлого века.
Но, тем не менее, использовать метки не стоит - усложняеться восприятие кода. Это, пожалуй, все: в итоге любой код компилируется в машинный код, где целая куча меток (безусловных переходов)
2 Mikeware
 
10.07.08
22:18
уж не 1986-87 ли ты года рождения?
3 H A D G E H O G s
 
10.07.08
22:19
(0) Ничем не вредны. Скажу вам по секрету - ваш процессор только ими и оперирует. Все это предрассудки..
P.S. Видел код, еще семерочный, активно метками заполненный; чтоб тот прог всю жизнь на стипендию жил...
4 H A D G E H O G s
 
10.07.08
22:20
(1) надо же, как совпали, я вас не видел, честно...
5 Doomer
 
10.07.08
22:21
(0) Я использовал метки, когда программировал на ассемблере. В языках высокого уровня можно обойтись без меток. По моему они усложняют чтение кода.

"И в догонку тому, кто использовал метки: можно-ли в переходе по метке использовать переменные?"
Я когда то писал программку для какого-то устойства на ассемблере, так у меня адрес перехода вычислялся.
6 FreeFin
 
10.07.08
22:23
Когда писАли в машинных кодах, то никаких процедур иль фУкций в принципе не было. Переходы оформляли метками. Жисть шла, придумкали языки, жисть шла, придумали языки ооп, жисть шла, придумали 1цы, но директивы безусловного перехода оставили, не для дебилов, а для тех, кто понимает, что такое помнить, с чего начиналось )))
7 vde69
 
10.07.08
22:26
использование меток - плохой тон (стиль) программирования,

бывают РЕДКО когда нужно... за посление 5 лет 1 раз использовал.

Главное по чему не имеет смысл использовать их - отсутствие сплошного длинного кода (сейчас бьют на процедуры и т.д.)
8 France
 
10.07.08
22:26
(6) самые лучше метки - метки в ООП, и, безусловно, самые лучшие программисты - программисты, которые в ООП сумели их использовать))
9 France
 
10.07.08
22:28
(7) "бьют на процедуры" по другому "структурное программирование"))
10 Serjant
 
10.07.08
22:29
Опасны. Переменные сохраняются.
P.S. Опасны если пишешь "Если Нет=1 Тогда Перейти Маша", однако если в первом условии подразумевается жена и переход на Машу точный и своевременный то жена сохраняется, но возможно появятся новые данные от перехода на ~Маша.
11 Serjant
 
10.07.08
22:30
(10) к (0)
12 Kiber
 
10.07.08
22:35
Всем огромное спасибо.
Serjant, а если метка расположена в рамках одной процедуры, то при завершении процедуры локальные переменные убьются?
13 quest
 
10.07.08
22:36
(0) а на ночь читать здесь http://www.wasm.ru/article.php?article=1014002
14 France
 
10.07.08
22:36
не убьются, по погибнут естесственной смертью..
15 Kiber
 
10.07.08
22:38
(12) первое "метка" понимать как "метки и переходы"
16 Господин ПЖ
 
10.07.08
22:40
а я тут недавно использовал... 1 раз за 5 лет

Доктор, я буду ходить?!
17 Serjant
 
10.07.08
22:43
(12) Не убится не могут, могут согласоватся и убить процесс....
18 Медвед1Сник
 
10.07.08
22:47
От частого употребления меток может развиться диабет и сердечная недостаточность. Не стоит злоупотреблять.
19 Мохнатые ладошки
 
10.07.08
23:02
не опасны, всегда их использую. ага...
20 France
 
10.07.08
23:05
потому и проблемы с ладошками
21 Мохнатые ладошки
 
10.07.08
23:09
(20) хе-хе... никаких проблем.
ЗЫ. смайлик забыл поставить... :)
22 Дядя Васька
 
10.07.08
23:30
(0) На тебе шедевр программерского искусства:
// просуммируем одинаковые строки (по договору и контрагенту
Если ТЗ_Банка.КоличествоСтрок()>0 Тогда
  х = 1;
  НомерТекСтроки = 1;
  ~М:
  Если НомерТекСтроки=ТЗ_Банка.КоличествоСтрок() Тогда
      Перейти ~ВСЁ;
  КонецЕсли;
  ТекущийДоговор = ТЗ_Банка.ПолучитьЗначение(х,1);
  ТекущийКонтрагент = ТЗ_Банка.ПолучитьЗначение(х,2);
   
  СледующийДоговор =ТЗ_Банка.ПолучитьЗначение(х+1,1);
  СледующийКонтрагент=ТЗ_Банка.ПолучитьЗначение(х+1,2);
   
  ДатаТекПлатежки =   ТЗ_Банка.ПолучитьЗначение(х,4);  
  ДатаСлеПлатежки =   ТЗ_Банка.ПолучитьЗначение(х+1,4);  
   
  Если (ТекущийДоговор=СледующийДоговор) и (ТекущийКонтрагент=СледующийКонтрагент)
  и (ДатаТекПлатежки = ДатаСлеПлатежки) Тогда
      ТЗ_Банка.УстановитьЗначение(х,5,"");
      ТЗ_Банка.УстановитьЗначение(х,6,ТЗ_Банка.ПолучитьЗначение(х,6)+ТЗ_Банка.ПолучитьЗначение(х+1,6));
      ТЗ_Банка.УдалитьСтроку(х+1);
      Перейти ~м;
  КонецЕсли;
  х=х+1;  
  НомерТекСтроки =НомерТекСтроки +1;
  Перейти ~м;
КонецЕсли;  
~ВСЁ:

еще вопросы есть? :)
23 syktyk
 
11.07.08
00:03
(22)Тут метки невнятно названы.
В Фортране был вычисляемый goto. Класная вещь. И понятная.
24 Kiber
 
11.07.08
00:25
(22) спс)
На самом деле, есть))
Можно-ли в конструкции "Перейти ~(....);" использовать переменные для определения метки на которую мы хотим перейти?
25 Kenny Live
 
11.07.08
03:52
Ниразу не пользовался метками, всегда недоумевал зачем их оставили в 1цы
26 чупа
 
11.07.08
04:33
Объясняю попу лярно.
Программный код он одновременно и набор инструкций некоему "процессору", он же документация этого действа.
И ставить метки это делать некачественную документацию.
Использование меток общепризнано как явление ухудшающее восприятие кода.
Аналогично некачественном уназванию переменных, процедур и функций, и т.д.
Чем грозит такая такая "некачественная документация"?
Естественно, увеличивает накладные расходы - понадобится гораздо больше времени и трудозатрат.

Код должен быть такой чтобы ты его мог по телефону рассказать и на том конце поняли (с).
Например, расскажите (22). "Вот тут мы переходим на м, а что такое м я тебе потом расскажу".
27 у лю 427
 
11.07.08
05:47
идиоты... метки крайне опасны...
28 ЛНТ
 
11.07.08
05:56
использовать метки - всё равно, что в русскую рулетку играть

при совпадении частоты следования в метке битов установленных в 1 с частотой процессора, может наступить резонанс и кристалл разрушится
29 у лю 427
 
11.07.08
06:00
а еще метки плохо уплотняются при вращении диска и на диск входит мало данных...
30 ЛНТ
 
11.07.08
06:19
да, это потому, что однажды попав на диск хрен эту метку потом сотрешь,
хотя говорят, что в сервисных центрах диски разбирают и метки специальным растворителем стирают
31 Зеленый Кот
 
11.07.08
06:32
(30) +1
32 FanatToNight
 
11.07.08
07:52
Как это ни позорно, создал я один документ году так в 2003-м, в коде, каюсь, использовал метку в количестве 1 (одна штука)..
простите, если можете!!.. век помнить буду вашу доброту!! :-))
33 FanatToNight
 
11.07.08
07:58
образец эквивалента метки, довольно часто встречающийся в коде 7-ки:
Пока 1=1 Цикл //тута место метки
.....
Ежели там что-то сложилось Тогда
  Прервать;
Иначе
  // а здеся для меточного варианта - посылка на метку
КонецЕжели;
КонецПокаПока; //для метки - лишнее
ре-мю-зе: А с меткой-то код короче..
34 Яндекс
 
11.07.08
08:03
(33)это что такое ты сотворил?
35 ado
 
11.07.08
08:06
Последний раз использовал метки когда писал на Бейсике для Ямахи в 3-м классе.
36 ado
 
11.07.08
08:07
(34) А это частенько встречается в типовых :(
37 ЛНТ
 
11.07.08
08:07
(33) это что за бред?
38 FanatToNight
 
11.07.08
08:10
(34) шюточный код.. думал, вы поймете :)) если-бы кто-то просил совета, я-бы написал нормально, без шутовства :))
(37) не надо грубить.. мы сами грубияны (с) :))
39 Зеленый Кот
 
11.07.08
08:10
так типовые тоже студенты пишут
40 ado
 
11.07.08
08:13
(39) Студенты ... мну от этого еще в школе отучили.
41 ado
 
11.07.08
08:15
Хотя, грешен, "прервать" по доп. условию изредка использую ...
42 Зеленый Кот
 
11.07.08
08:16
прервать не является грехом
грехом являются метки
43 Зеленый Кот
 
11.07.08
08:17
(с) Великий Эдгар Дийкстра
44 Яндекс
 
11.07.08
08:17
(42)прервать тоже не есть гуд с точки зрения читабельности кода
45 FanatToNight
 
11.07.08
08:17
(34) (37) блин..

Вариант без метки

Пока 1=1 Цикл
.....
Если [уловие завершения] Тогда
  Прервать;
КонецЕсли;
КонецЦикла;

Эквивалент с меткой

~М:
Если [условие НЕ завершения] Тогда
Перейти ~М;
КонецЕсли;  

Так устраивает? - тогда порядок
Не устраивает?  тогда (37) - пиши сам.
46 ado
 
11.07.08
08:19
(44) Не гуд, особенно если это как в (33).
47 Gepard
 
11.07.08
08:22
(22) спасибо, хоть увидел, как их объявлять :))
48 ЛНТ
 
11.07.08
08:24
(45) так сразу бы и сказал, что ты студент
49 FanatToNight
 
11.07.08
08:25
(44) если прогер фикси, и пишет в основном под себя, то о читабельности может и не заботиться. Кто кроме него читать будет? последыш? - так фикси меньше всего о последствиях думает :))
а вот если код во всеувиденье - тут надо позавботиться о читабельности и о бантиках с рушечками..
короче, красиво надо писАть :))
50 FanatToNight
 
11.07.08
08:26
(48) так что, можно тащить зачетку? :))
51 ado
 
11.07.08
08:27
(49) Дурно написанный код сам через пару месяцев прочитать не сможешь.
(47) Кстати да, я тоже не знал ;-)
52 FanatToNight
 
11.07.08
08:29
(51) это точно. уловил сей момент году так в 2001-м, когда пришлось переписывать кусок заново.
Теперь подробно комментирую, научен горьким опытом :))
53 ДенисЧ
 
11.07.08
08:48
Так... Увидел ветку, вставлю свой дайм
Метки НЕ ОПАСНЫ, когда программист знает, что делает.
Не надо воспринимать Дийкстру как догму. Его надо воспринимать как рекомендации.
Существуют случаи, когда метки и гоуты позволяют писать существенно (sic!) более читаемый код, чем без них.
54 Яндекс
 
11.07.08
08:50
(53)пример
55 ДенисЧ
 
11.07.08
08:54
(54) позже. Часа через 2. А пока упражнение на самостоятельное раздумывание. Ключевые слова: вложенные циклы, функции из 2-х строк, неоправданная рекурсия.
56 CoolCat
 
11.07.08
09:03
(22) - просто отпад :)))...... гниздить таких прогеров нужно..
57 Kiber
 
11.07.08
19:28
В этом коде мне метки существенно упростили и читаемость кода и сам код.

[code]    Если флПроверятьКод = 1 Тогда
       Если СпрСоответствие.НайтиПоКоду(ТЗ.Код) = 1 Тогда
           ТЗ.Соответствие = СпрСоответствие.ТекущийЭлемент();
           КоличествоСовпадений = КоличествоСовпадений + 1;
           Перейти ~A1;
       КонецЕсли;
   КонецЕсли;
   
   Если флПроверятьНаименование = 1 Тогда
       Если СпрСоответствие.НайтиПоНаименованию(ТЗ.Элемент,0) = 1 Тогда
           ТЗ.Соответствие = СпрСоответствие.ТекущийЭлемент();
           КоличествоСовпадений = КоличествоСовпадений + 1;
           Перейти ~A2;
       КонецЕсли;
   КонецЕсли;
       
   Если (ТЗ.Вид = "Контрагенты") Тогда
       Если (флКонтрагентыПроверятьИНН = 1) Тогда
           Если СпрСоответствие.НайтиПоРеквизиту("ИНН",ТЗ.Доп1,1) = 1 Тогда
               ТЗ.Соответствие = СпрСоответствие.ТекущийЭлемент();
               КоличествоСовпадений = КоличествоСовпадений + 1;
               КоличествоПроверок = флПроверятьКод + флПроверятьНаименование + флПроверятьГруппа + флКонтрагентыПроверятьИНН;
               Перейти ~A3;
           КонецЕсли;
       КонецЕсли;
   КонецЕсли;

   ТЗ.Соответствие = "";
   ТЗ.ТипДействия = "!!! Не найден";
   ТЗ.v = 0;
   Возврат;
   
~A1:
   Если флПроверятьНаименование = 1 Тогда
       Если ТЗ.Соответствие.Наименование = ТЗ.Элемент Тогда
           КоличествоСовпадений = КоличествоСовпадений + 1;
       КонецЕсли;
   КонецЕсли;

~A2:
   Если ТЗ.Вид = "Контрагенты" Тогда
       Если флКонтрагентыПроверятьИНН = 1 Тогда
           Если СокрЛП(Строка(ТЗ.Соответствие.ИНН)) = ТЗ.Доп1 Тогда
               КоличествоСовпадений = КоличествоСовпадений + 1;
           КонецЕсли;
       КонецЕсли;
       КоличествоПроверок = флПроверятьКод + флПроверятьНаименование + флПроверятьГруппа + флКонтрагентыПроверятьИНН;
   Иначе
       КоличествоПроверок = флПроверятьКод + флПроверятьНаименование + флПроверятьГруппа;
   КонецЕсли;

~A3:
   Если флПроверятьГруппа = 1 Тогда
       Если Строка(ТЗ.Соответствие.ЭтоГруппа()) = ТЗ.ЭтоГруппа Тогда
           КоличествоСовпадений = КоличествоСовпадений + 1;
       КонецЕсли;
   КонецЕсли;

   Если КоличествоСовпадений = 0 Тогда
       ТЗ.ТипДействия = "!!! Не найден";
       ТЗ.v = 0;
   ИначеЕсли КоличествоСовпадений < КоличествоПроверок Тогда
       ТЗ.ТипДействия = "!!! Вопрос Соответствия";
       ТЗ.v = 0;
   Иначе
       ТЗ.ТипДействия = "Найден";
       ТЗ.v = 1;
   КонецЕсли;[/code]
58 чупа
 
11.07.08
19:32
(57) БУГАГА вот вам и пример!
дебильнейшего кода
59 Kiber
 
11.07.08
19:33
да, кстати, сразу розрешаю использовать данный код для шаблона под программный поиск загружаемых элементов )).
60 Kiber
 
11.07.08
19:35
(58) показать как выглядело-бы без меток?
Или может предложишь более оптимизированный вариант?
А потом еще сделаем замер производительности.
А результаты обязательно в эту ветку запостим. Как развеивание мифов.
61 чупа
 
11.07.08
19:43
сам наверное код написал, и говорит "как мне метки упростили восприятие кода"
цырк уехал клоуны осталисъ

вот как можно сделать ГОРАЗДО понятней такой код, затратив минимум усилий

   СоответствиеПоКоду = ложь;
   Если СпрСоответствие.НайтиПоКоду(ТЗ.Код) = 1 Тогда
           ТЗ.Соответствие = СпрСоответствие.ТекущийЭлемент();
           КоличествоСовпадений = КоличествоСовпадений + 1;
           СоответствиеПоКоду = истина;
       КонецЕсли;
   КонецЕсли;
   
   СоответствиеПоНаименованию = ложь;
   Если (флПроверятьНаименование = 1) и не СоответствиеПоКоду Тогда
       Если СпрСоответствие.НайтиПоНаименованию(ТЗ.Элемент,0) = 1 Тогда
           ТЗ.Соответствие = СпрСоответствие.ТекущийЭлемент();
           КоличествоСовпадений = КоличествоСовпадений + 1;
           СоответствиеПоНаименованию = истина;
       КонецЕсли;
   КонецЕсли;
       
   СоответствиеПоИНН = ложь;
   Если (ТЗ.Вид = "Контрагенты") и не СоответствиеПоНаименованию Тогда
       Если (флКонтрагентыПроверятьИНН = 1) Тогда
           Если СпрСоответствие.НайтиПоРеквизиту("ИНН",ТЗ.Доп1,1) = 1 Тогда
               ТЗ.Соответствие = СпрСоответствие.ТекущийЭлемент();
               КоличествоСовпадений = КоличествоСовпадений + 1;
               КоличествоПроверок = флПроверятьКод + флПроверятьНаименование + флПроверятьГруппа + флКонтрагентыПроверятьИНН;
               СоответствиеПоИНН = истина;
           КонецЕсли;
       КонецЕсли;
   КонецЕсли;

   Если не СоответствиеПоИНН Тогда
   ТЗ.Соответствие = "";
   ТЗ.ТипДействия = "!!! Не найден";
   ТЗ.v = 0;
   Возврат;
   
   Если СоответствиеПоКоду Тогда
   Если флПроверятьНаименование = 1 Тогда
       Если ТЗ.Соответствие.Наименование = ТЗ.Элемент Тогда
           КоличествоСовпадений = КоличествоСовпадений + 1;
       КонецЕсли;
   КонецЕсли;
   КонецЕсли;

   Если СоответствиеПоНаименованию Тогда
   Если ТЗ.Вид = "Контрагенты" Тогда
       Если флКонтрагентыПроверятьИНН = 1 Тогда
           Если СокрЛП(Строка(ТЗ.Соответствие.ИНН)) = ТЗ.Доп1 Тогда
               КоличествоСовпадений = КоличествоСовпадений + 1;
           КонецЕсли;
       КонецЕсли;
       КоличествоПроверок = флПроверятьКод + флПроверятьНаименование + флПроверятьГруппа + флКонтрагентыПроверятьИНН;
   Иначе
       КоличествоПроверок = флПроверятьКод + флПроверятьНаименование + флПроверятьГруппа;
   КонецЕсли;
   КонецЕсли;


   Если СоответствиеПоИнн Тогда
   Если флПроверятьГруппа = 1 Тогда
       Если Строка(ТЗ.Соответствие.ЭтоГруппа()) = ТЗ.ЭтоГруппа Тогда
           КоличествоСовпадений = КоличествоСовпадений + 1;
       КонецЕсли;
   КонецЕсли;
   КонецЕсли;

   Если КоличествоСовпадений = 0 Тогда
       ТЗ.ТипДействия = "!!! Не найден";
       ТЗ.v = 0;
   ИначеЕсли КоличествоСовпадений < КоличествоПроверок Тогда
       ТЗ.ТипДействия = "!!! Вопрос Соответствия";
       ТЗ.v = 0;
   Иначе
       ТЗ.ТипДействия = "Найден";
       ТЗ.v = 1;
   КонецЕсли;


п.с.
конечно мож где-то мелочь упустил, не суть важно, принцип ясен

>> А потом еще сделаем замер производительности.
гыгы дурень ты пустоголовый
ты еще скажи что ради производительсности ты переменные укорачиваешь потому что интерпритатор их быстрее обработает.
62 FanatToNight
 
11.07.08
19:56
Интерпритатор не абрабатываит пирименные, при тронслядции модуля он их заминяит в ОП на кароткий код :)
63 Kiber
 
11.07.08
20:03
эээ, нет, не ради кроткости кода, а ради минимального количества проверок.
и не дурень я пустоголовый.
Элемент ищется по реквизиту если данный флаг выставлен, и если он еще не был найден. Поэтому, твой код должен выглядеть как минимум так (без оптимизации):


   СоответствиеПоКоду = ложь;
   Если флПроверятьКод = 1 Тогда
       Если СпрСоответствие.НайтиПоКоду(ТЗ.Код) = 1 Тогда
               ТЗ.Соответствие = СпрСоответствие.ТекущийЭлемент();
               КоличествоСовпадений = КоличествоСовпадений + 1;
               СоответствиеПоКоду = истина;
           КонецЕсли;
       КонецЕсли;
   КонецЕсли;
   
   
   СоответствиеПоНаименованию = ложь;
   Если (флПроверятьНаименование = 1) и не СоответствиеПоКоду Тогда
       Если СпрСоответствие.НайтиПоНаименованию(ТЗ.Элемент,0) = 1 Тогда
           ТЗ.Соответствие = СпрСоответствие.ТекущийЭлемент();
           КоличествоСовпадений = КоличествоСовпадений + 1;
           СоответствиеПоНаименованию = истина;
       КонецЕсли;
   КонецЕсли;
       
   СоответствиеПоИНН = ложь;
   Если (ТЗ.Вид = "Контрагенты") и не СоответствиеПоНаименованию Тогда
       Если (флКонтрагентыПроверятьИНН = 1) Тогда
           Если СпрСоответствие.НайтиПоРеквизиту("ИНН",ТЗ.Доп1,1) = 1 Тогда
               ТЗ.Соответствие = СпрСоответствие.ТекущийЭлемент();
               КоличествоСовпадений = КоличествоСовпадений + 1;
               КоличествоПроверок = флПроверятьКод + флПроверятьНаименование + флПроверятьГруппа + флКонтрагентыПроверятьИНН;
               СоответствиеПоИНН = истина;
           КонецЕсли;
       КонецЕсли;
   КонецЕсли;

   Если не (СоответствиеПоИНН ИЛИ СоответствиеПоНаименованию ИЛИ СоответствиеПоКоду) Тогда
       ТЗ.Соответствие = "";
       ТЗ.ТипДействия = "!!! Не найден";
       ТЗ.v = 0;
       Возврат;
   КонецЕсли;
   
       
   Если СоответствиеПоКоду и НЕ СоответствиеПоНаименованию Тогда
       Если флПроверятьНаименование = 1 Тогда
           Если ТЗ.Соответствие.Наименование = ТЗ.Элемент Тогда
               КоличествоСовпадений = КоличествоСовпадений + 1;
           КонецЕсли;
       КонецЕсли;
   КонецЕсли;

   Если (СоответствиеПоНаименованию ИЛИ СоответствиеПоКоду) и НЕ СоответствиеПоИНН Тогда
       Если ТЗ.Вид = "Контрагенты" Тогда
           Если флКонтрагентыПроверятьИНН = 1 Тогда
               Если СокрЛП(Строка(ТЗ.Соответствие.ИНН)) = ТЗ.Доп1 Тогда
                   КоличествоСовпадений = КоличествоСовпадений + 1;
               КонецЕсли;
           КонецЕсли;
           КоличествоПроверок = флПроверятьКод + флПроверятьНаименование + флПроверятьГруппа + флКонтрагентыПроверятьИНН;
       Иначе
           КоличествоПроверок = флПроверятьКод + флПроверятьНаименование + флПроверятьГруппа;
       КонецЕсли;
   КонецЕсли;


   Если флПроверятьГруппа = 1 Тогда
       Если Строка(ТЗ.Соответствие.ЭтоГруппа()) = ТЗ.ЭтоГруппа Тогда
           КоличествоСовпадений = КоличествоСовпадений + 1;
       КонецЕсли;
   КонецЕсли;

   Если КоличествоСовпадений = 0 Тогда
       ТЗ.ТипДействия = "!!! Не найден";
       ТЗ.v = 0;
   ИначеЕсли КоличествоСовпадений < КоличествоПроверок Тогда
       ТЗ.ТипДействия = "!!! Вопрос Соответствия";
       ТЗ.v = 0;
   Иначе
       ТЗ.ТипДействия = "Найден";
       ТЗ.v = 1;
   КонецЕсли;

Вручную сравнишь количество проверок, или все-таки замерить производительность?
64 чупа
 
11.07.08
20:07
замерь, дурень, замерь
и результаты опубликуй

из-за таких олухов, одинцэшники никогда не станут программистами
а код (57) будут преподавать как пример ярчайшего случая дебилизма
65 smaharbA
 
11.07.08
20:09
(64) можно поинтересоваться сколько Вам годиков ?
66 чупа
 
11.07.08
20:13
программный код как исполнитель инструкций так и документация, "блок-схема" этих инструкций.
без этого код становится не читаемый, соответственно не масштабируемый.

код в (61) и (63) будет жить и развиваться дальше при необходимости
то гавно которое в (57) - сдохнет своей смертью. но повонять успеет.
67 чупа
 
11.07.08
20:13
(65) тебе нельзя, прости
а так конечно, без проблем
68 FanatToNight
 
11.07.08
20:16
(65) не дождешься ответа :) имхо..
в правилах вроде сказано "не переходить на личности". Проблемка-то не стОит выеденного яйца, чтоб так лезть в кучувонючу! Однако-ж..
Я бы на месте Кибер"а проосто не ответил :)
69 smaharbA
 
11.07.08
20:16
(67) почему нельзя мне ?
кстати с метками твой код упростится и усвояется раза в 3 минимум, хотя и без меток конечно тоже ))
70 smaharbA
 
11.07.08
20:19
умолкаю, а то опять потребуют какието доказательства состоятельности, запросят размер сапог и противогаза...
71 Дядя Васька
 
11.07.08
20:23
Н-дя... А может все-таки без меток, ась? :)
   РезультатПоиска = "";
   Если (флПроверятьКод = 1) и (СпрСоответствие.НайтиПоКоду(ТЗ.Код) = 1) Тогда
       РезультатПоиска = "Код";
   ИначеЕсли (флПроверятьНаименование = 1) и (СпрСоответствие.НайтиПоНаименованию(ТЗ.Элемент,0) = 1) Тогда
       РезультатПоиска = "Наименование";
   ИначеЕсли (ТЗ.Вид = "Контрагенты") и (флКонтрагентыПроверятьИНН = 1) и
             (СпрСоответствие.НайтиПоРеквизиту("ИНН",ТЗ.Доп1,1) = 1) Тогда
       РезультатПоиска = "ИНН";
       КоличествоПроверок = флПроверятьКод + флПроверятьНаименование + флПроверятьГруппа + флКонтрагентыПроверятьИНН;
   КонецЕсли;
   
   Если ПустоеЗначение(РезультатПоиска) = 0 Тогда
       ТЗ.Соответствие = СпрСоответствие.ТекущийЭлемент();
       КоличествоСовпадений = КоличествоСовпадений + 1;
   Иначе
       ТЗ.Соответствие = "";
       ТЗ.ТипДействия = "!!! Не найден";
       ТЗ.v = 0;
       Возврат;
   КонецЕсли;
   
   Если (РезультатПоиска = "Наименование") и (флПроверятьНаименование = 1) Тогда
       Если ТЗ.Соответствие.Наименование = ТЗ.Элемент Тогда
           КоличествоСовпадений = КоличествоСовпадений + 1;
       КонецЕсли;
   КонецЕсли;

   Если РезультатПоиска <> "ИНН" Тогда
       Если ТЗ.Вид = "Контрагенты" Тогда
           Если флКонтрагентыПроверятьИНН = 1 Тогда
               Если СокрЛП(Строка(ТЗ.Соответствие.ИНН)) = ТЗ.Доп1 Тогда
                   КоличествоСовпадений = КоличествоСовпадений + 1;
               КонецЕсли;
           КонецЕсли;
           КоличествоПроверок = флПроверятьКод + флПроверятьНаименование + флПроверятьГруппа + флКонтрагентыПроверятьИНН;
       Иначе
           КоличествоПроверок = флПроверятьКод + флПроверятьНаименование + флПроверятьГруппа;
       КонецЕсли;
   КонецЕсли;

   Если (флПроверятьГруппа = 1) и (Строка(ТЗ.Соответствие.ЭтоГруппа()) = ТЗ.ЭтоГруппа) Тогда
       КоличествоСовпадений = КоличествоСовпадений + 1;
   КонецЕсли;

   Если КоличествоСовпадений = 0 Тогда
       ТЗ.ТипДействия = "!!! Не найден";
       ТЗ.v = 0;
   ИначеЕсли КоличествоСовпадений < КоличествоПроверок Тогда
       ТЗ.ТипДействия = "!!! Вопрос Соответствия";
       ТЗ.v = 0;
   Иначе
       ТЗ.ТипДействия = "Найден";
       ТЗ.v = 1;
   КонецЕсли;    
72 Kiber
 
11.07.08
20:33
Измеритель в 77 не очень удобный, поэтому я сильно увеличил загружаемый файл (эта проверка проводится при загрузке), и включил в начало и конец загрузки строки вида
   ВремНач = _getPerformanceCounter();
   Сообщить("Загрузка начата в "+ВремНач);
   ВремКон = _getPerformanceCounter();
   Дельта = ВремКон-ВремНач;
   Сообщить("Загрузка окончена в "+ВремКон);
   Сообщить("Дельта: "+Дельта);

Результаты загрузок с твоим кодом:

Загрузка начата в 354679010
Загрузка окончена в 354689743
Дельта: 10733
Загрузка начата в 354690901
Загрузка окончена в 354701651
Дельта: 10750
Загрузка начата в 354702554
Загрузка окончена в 354712785
Дельта: 10231
Загрузка начата в 354713792
Загрузка окончена в 354724289
Дельта: 10497
Загрузка начата в 354725353
Загрузка окончена в 354735936
Дельта: 10583

Результаты загрузок с исходным кодом:

Загрузка начата в 354807030
Загрузка окончена в 354816957
Дельта: 9927
Загрузка начата в 354818861
Загрузка окончена в 354828774
Дельта: 9913
Загрузка начата в 354829916
Загрузка окончена в 354839561
Дельта: 9645
Загрузка начата в 354840821
Загрузка окончена в 354850700
Дельта: 9879
Загрузка начата в 354861472
Загрузка окончена в 354871427
Дельта: 9955

Разница, я полагаю, очевидна.
73 Kiber
 
11.07.08
20:35
Да, конечный вариант кода выглядел так:

   КоличествоСовпадений = 0;
   СоответствиеПоКоду = 0;
   Если флПроверятьКод = 1 Тогда
       Если СпрСоответствие.НайтиПоКоду(ТЗ.Код) = 1 Тогда
           ТЗ.Соответствие = СпрСоответствие.ТекущийЭлемент();
           КоличествоСовпадений = КоличествоСовпадений + 1;
           СоответствиеПоКоду = 1;
       КонецЕсли;
   КонецЕсли;
   
   
   СоответствиеПоНаименованию = 0;
   Если (флПроверятьНаименование = 1) и (СоответствиеПоКоду = 0) Тогда
       Если СпрСоответствие.НайтиПоНаименованию(ТЗ.Элемент,0) = 1 Тогда
           ТЗ.Соответствие = СпрСоответствие.ТекущийЭлемент();
           КоличествоСовпадений = КоличествоСовпадений + 1;
           СоответствиеПоНаименованию = 1;
       КонецЕсли;
   КонецЕсли;
       
   СоответствиеПоИНН = 0;
   Если (ТЗ.Вид = "Контрагенты") и (СоответствиеПоКоду + СоответствиеПоНаименованию = 0) Тогда
       Если (флКонтрагентыПроверятьИНН = 1) Тогда
           Если СпрСоответствие.НайтиПоРеквизиту("ИНН",ТЗ.Доп1,1) = 1 Тогда
               ТЗ.Соответствие = СпрСоответствие.ТекущийЭлемент();
               КоличествоСовпадений = КоличествоСовпадений + 1;
               КоличествоПроверок = флПроверятьКод + флПроверятьНаименование + флПроверятьГруппа + флКонтрагентыПроверятьИНН;
               СоответствиеПоИНН = 1;
           КонецЕсли;
       КонецЕсли;
   КонецЕсли;

   Если СоответствиеПоИНН + СоответствиеПоНаименованию + СоответствиеПоКоду = 0 Тогда
       ТЗ.Соответствие = "";
       ТЗ.ТипДействия = "!!! Не найден";
       ТЗ.v = 0;
       Возврат;
   КонецЕсли;
   
       
   Если (СоответствиеПоКоду = 1) и (СоответствиеПоНаименованию = 0) Тогда
       Если флПроверятьНаименование = 1 Тогда
           Если ТЗ.Соответствие.Наименование = ТЗ.Элемент Тогда
               КоличествоСовпадений = КоличествоСовпадений + 1;
           КонецЕсли;
       КонецЕсли;
   КонецЕсли;

   Если (СоответствиеПоКоду+СоответствиеПоНаименованию > 0) и (СоответствиеПоИНН = 0) Тогда
       Если ТЗ.Вид = "Контрагенты" Тогда
           Если флКонтрагентыПроверятьИНН = 1 Тогда
               Если СокрЛП(Строка(ТЗ.Соответствие.ИНН)) = ТЗ.Доп1 Тогда
                   КоличествоСовпадений = КоличествоСовпадений + 1;
               КонецЕсли;
           КонецЕсли;
           КоличествоПроверок = флПроверятьКод + флПроверятьНаименование + флПроверятьГруппа + флКонтрагентыПроверятьИНН;
       Иначе
           КоличествоПроверок = флПроверятьКод + флПроверятьНаименование + флПроверятьГруппа;
       КонецЕсли;
   КонецЕсли;


   Если флПроверятьГруппа = 1 Тогда
       Если Строка(ТЗ.Соответствие.ЭтоГруппа()) = ТЗ.ЭтоГруппа Тогда
           КоличествоСовпадений = КоличествоСовпадений + 1;
       КонецЕсли;
   КонецЕсли;

   Если КоличествоСовпадений = 0 Тогда
       ТЗ.ТипДействия = "!!! Не найден";
       ТЗ.v = 0;
   ИначеЕсли КоличествоСовпадений < КоличествоПроверок Тогда
       ТЗ.ТипДействия = "!!! Вопрос Соответствия";
       ТЗ.v = 0;
   Иначе
       ТЗ.ТипДействия = "Найден";
       ТЗ.v = 1;
   КонецЕсли;
74 Kiber
 
11.07.08
20:38
(71) Хороший пример. Сейчас мы его замерим... )))
75 Дядя Васька
 
11.07.08
20:47
Не, непрально ты Дядя Федор бутерброд ешь... Не на условиях надо оптимизировать, а на количестве проходов. Всего кода не вижу, но подозреваю что там можно было свертками извратиться, и ускорить его раз в 10...
76 Kiber
 
11.07.08
20:53
(71) ээээ, выдает ошибку

ИначеЕсли (ТЗ.Вид = "Контрагенты")
{F:\BASE77\TEPLOENERGO\ТИС_БУХ\ДОКУМЕНТЫВБУХ.ERT(295)}: Неверное имя реквизита!

При проверке 651 строки из ТЗ.
Данные проверил - все корректно, в ТЗ они есть, получаются нормально.
Связываю это с ошибкой платформы 77.
Удалил 651 строку из файла загрузки - всеравно ошибку на 651 строке, теперь на другой элемент.
77 Kiber
 
11.07.08
20:59
(75) что делает код:
в строке ТЗ содержатся ключевые поля загружаемого элемента (код, наименование, ИНН для контрагентов), при загрузке он пытается найти эти элементы в существующих справочниках.
А что можно сделать сверткой?
В любом случае, для каждого контретного элемента надо искать свое соответствие..
Можно конечно заранее сделать запрос по каждому виду справочнику, но в 77 я очень не люблю исопльзовать запросы. Капризные очень. Да и выгода эфемерна.
78 Дядя Васька
 
11.07.08
21:05
(76) Так попробуй что ли:
   
   РезультатПоиска = "";
   Если (флПроверятьКод = 1) и (СпрСоответствие.НайтиПоКоду(ТЗ.Код) = 1) Тогда
       РезультатПоиска = "Код";
   ИначеЕсли (флПроверятьНаименование = 1) и (СпрСоответствие.НайтиПоНаименованию(ТЗ.Элемент,0) = 1) Тогда
       РезультатПоиска = "Наименование";
   ИначеЕсли флКонтрагентыПроверятьИНН = 1 Тогда
       Если (ТЗ.Вид = "Контрагенты") и (СпрСоответствие.НайтиПоРеквизиту("ИНН",ТЗ.Доп1,1) = 1) Тогда
           РезультатПоиска = "ИНН";
           КоличествоПроверок = флПроверятьКод + флПроверятьНаименование + флПроверятьГруппа + флКонтрагентыПроверятьИНН;
       КонецЕсли;
   КонецЕсли;
   
   Если ПустоеЗначение(РезультатПоиска) = 0 Тогда
       ТЗ.Соответствие = СпрСоответствие.ТекущийЭлемент();
       КоличествоСовпадений = КоличествоСовпадений + 1;
   Иначе
       ТЗ.Соответствие = "";
       ТЗ.ТипДействия = "!!! Не найден";
       ТЗ.v = 0;
       Возврат;
   КонецЕсли;
   
   Если (РезультатПоиска = "Наименование") и (флПроверятьНаименование = 1) Тогда
       Если ТЗ.Соответствие.Наименование = ТЗ.Элемент Тогда
           КоличествоСовпадений = КоличествоСовпадений + 1;
       КонецЕсли;
   КонецЕсли;

   Если РезультатПоиска <> "ИНН" Тогда
       Если ТЗ.Вид = "Контрагенты" Тогда
           Если флКонтрагентыПроверятьИНН = 1 Тогда
               Если СокрЛП(Строка(ТЗ.Соответствие.ИНН)) = ТЗ.Доп1 Тогда
                   КоличествоСовпадений = КоличествоСовпадений + 1;
               КонецЕсли;
           КонецЕсли;
           КоличествоПроверок = флПроверятьКод + флПроверятьНаименование + флПроверятьГруппа + флКонтрагентыПроверятьИНН;
       Иначе
           КоличествоПроверок = флПроверятьКод + флПроверятьНаименование + флПроверятьГруппа;
       КонецЕсли;
   КонецЕсли;

   Если (флПроверятьГруппа = 1) и (Строка(ТЗ.Соответствие.ЭтоГруппа()) = ТЗ.ЭтоГруппа) Тогда
       КоличествоСовпадений = КоличествоСовпадений + 1;
   КонецЕсли;

   Если КоличествоСовпадений = 0 Тогда
       ТЗ.ТипДействия = "!!! Не найден";
       ТЗ.v = 0;
   ИначеЕсли КоличествоСовпадений < КоличествоПроверок Тогда
       ТЗ.ТипДействия = "!!! Вопрос Соответствия";
       ТЗ.v = 0;
   Иначе
       ТЗ.ТипДействия = "Найден";
       ТЗ.v = 1;
   КонецЕсли;    

возможно у тебя при флКонтрагентыПроверятьИНН = 0 может не быть колонки "Вид", а я в одно условие запихнул..
79 Дядя Васька
 
11.07.08
21:08
(77) Ну а сверткой... Да просто сваливаешь что сравниваешь в одну ТЗ, добавляешь колонку "совпадения" и заполняешь ее единичками. Затем свернуть, и через долю секунды количество соответствий по каждой строке известно. А ты на каждую строку по столько же тратишь, так как сравниваешь их по отдельности.
80 Kiber
 
11.07.08
21:09
(78) я проверил все нужные реквизиты, программно при помощи "Сообщить()" они получаются.
сейчас попробую...
81 Kiber
 
11.07.08
21:10
(79) но чтобы заполнить колонку, надо провести проверку, верно? :-)))
82 Дядя Васька
 
11.07.08
21:13
(81) неверно
83 Kiber
 
11.07.08
21:14
Загрузка начата в 357396847
Загрузка окончена в 357405438
Дельта: 8591
Загрузка начата в 357407046
Загрузка окончена в 357415580
Дельта: 8534
Загрузка начата в 357416595
Загрузка окончена в 357425407
Дельта: 8812
Загрузка начата в 357426467
Загрузка окончена в 357435537
Дельта: 9070
Загрузка начата в 357437125
Загрузка окончена в 357445947
Дельта: 8822
Загрузка начата в 357447855
Загрузка окончена в 357456814
Дельта: 8959

Нет слов......
84 Kiber
 
11.07.08
21:17
(82) а вот с этого момента, пожалуйста, поподробнее))
85 Дядя Васька
 
11.07.08
21:21
Упрощенный пример, есть два справочника, нужно быстро найти количество совпадающих наименований, предположим что наименование уникально:
   СпрНом = СоздатьОбъект("Справочник.Номенклатура");
   СпрСоотв = СоздатьОбъект("Справочник.Аналоги");
   
   ТЗ = СоздатьОбъект("ТаблицаЗначений");
   ТЗ.НоваяКолонка("Наименование", "Строка");
   ТЗ.НоваяКолонка("КоличествоСоответствий", "Число");
   
   СпрНом.ВыбратьЭлементы();
   Пока СпрНом.ПолучитьЭлемент() = 1 Цикл
       ТЗ.НоваяСтрока();
       ТЗ.Наименование=СпрНом.Наименование;
   КонецЦикла;

   СпрСоотв.ВыбратьЭлементы();
   Пока СпрСоотв.ПолучитьЭлемент() = 1 Цикл
       ТЗ.НоваяСтрока();
       ТЗ.Наименование=СпрСоотв.Наименование;
   КонецЦикла;

   ТЗ.Заполнить(1,,,"КоличествоСовпадений");
   
   ТЗ.Свернуть("Наименование", "КоличествоСовпадений");

под реальную задачу доработать напильником...
86 syktyk
 
11.07.08
21:30
(85)Ты ратуешь за эту кривую работу с ТЗ? А вроде через запрос можно решить.
87 syktyk
 
11.07.08
21:33
88 vde69
 
11.07.08
21:33
(84) почитай вот этот алгоритм

Книга знаний: v8: Алгоритм синхронизации двух таблиц (по текстовому полю)

он будет СИЛЬНО быстрее твоего, особенно если размер исходных таблиц > 10 000

если нужно получить простое количество совпадений, то быстрее будет вариант со сверткой, а вот если надо сопоставить - то мой...

кстати у меня было поползновение метку в одном месте поставить, но обошлось )))
89 Дядя Васька
 
11.07.08
21:34
(86) Можно и через запрос, по ситуации... Я ратую против того чтобы по каждому элементу одного справочника гонять НайтиПо по другому ))
90 Дядя Васька
 
11.07.08
21:36
(87) Ну вот и к прямым подобрались :))
Ну крайностей-то не надо...
91 Kiber
 
11.07.08
21:36
(85) гениально! ))
В рамках решаемой задачи есть одно но: количество загружаемых элементов << таблицы существующего справочника.
Будет-ли эффективна такая проверка?
И еще один вопрос:
после свертки, сортируем по колонке "КоличествоСоответствий", и когда начинаются значения 1 - прерываем обработку?
И еще одно но:
а если в таблице справочника существует элемент, совпадающий наименованием и существует другой элемент, совпадающий кодом с загружаемым элементом?
Это разные элементы, соотв, расчитаное количество совпадений будет не совсем корректным.
92 syktyk
 
11.07.08
21:40
(89)Больше и длиньше всего я смеялся, когда увидел запросы 7.7 . С претензией на оригинальность.
93 Дядя Васька
 
11.07.08
21:47
(91) Не, ну пример-то простейший, под задачу доводить надо. Главное принцип понять, как можно сразу кучу сравнить. Эффективнее твоего способа в любом случае, может что и получше придумаешь. Про сортировку вон уже сообразил ))
Про еще одно но, где-то ты не прав... Синхронизируют по чему-то одному обычно, либо код, либо наименование, либо ИНН, либо еще что-то. Но не все вместе. Иначе неизбежны противоречия.
94 syktyk
 
11.07.08
21:49
(93)А тебе не кажется, что решая задачу в рамках классов 1С, мы себя немного кастрируем?
95 Дядя Васька
 
11.07.08
21:52
Простой пример опять же:
Код     Наименование
001     ААА
002     БББ
001     БББ
002     ААА

Чего ты будешь с этим делать? Выискивать которые из них наиболее равны? Это будет не просто, и что самое обидное не оценят. Так как для пользователя понять по какому принципу ты определил какие "равнее" он уж точно не поймет.
96 Дядя Васька
 
11.07.08
21:54
(94) Не думаю. Все от задачи зависит. Для того чтобы загрузить пару тысяч строк не нужен прямой запрос, так как за счет объемов скорость будет одна и та же, а возни с написанием кода значительно меньше в рамках типовых.
97 Дядя Васька
 
11.07.08
21:55
(95) -> +(93)
98 Злопчинский
 
11.07.08
21:56
метки юзать надо там, где они уместны.
уместная метка по своему имени позволяет получать вполне читабельный код.
все приведенные выше метки типа А1 и комментарии
Перейти ~M1; переход к М1 - пример тяжелейшего дебилизма.
...
написанный код должен быть "понятным"...
99 Дядя Васька
 
11.07.08
21:58
(98) Чет за последние 15 лет мне не попадался код где они уместны (ассемлер не в счет конечно) :))
100 Дядя Васька
 
11.07.08
22:07
100 сотыга чтоль...
101 syktyk
 
11.07.08
22:20
(99)Мне приходилось изучать профессионально сделанные проги на ассемблере. Поверь: они читаются, как бестселлер.
102 Дядя Васька
 
11.07.08
22:24
(101) Да верю.. Я ж говорю, ассемлер не в счет, а в языках высокого уровня ну не могу я представить ситуацию где с меткой читабельнее...
103 syktyk
 
11.07.08
22:31
(102)Дык, если метку обозвать, кка пременную - со смыслом, она и будет читабельней
104 Дядя Васька
 
11.07.08
22:34
(103) Дело не в том как ее обозвать, логика кода будет не очевидна, так как структуры не будет.
105 Злопчинский
 
11.07.08
22:37
ну не знаю...
5 вложений если с несколькими циклами - это читабельно..?
постоянное обращение к процедурам/функциям из 5 -10 строк - которые находятся в гм - или хз знает где - это читабельно...?
106 Дядя Васька
 
11.07.08
22:40
(105) Интересно взглянуть на примерчик, который метками заменяет 5 вложений и при этом более читабелен. А обращение к процедурам/функциям это как раз нормально, при условии что понятно что они делают. Раз отладил и забыл...
107 Злопчинский
 
11.07.08
22:53
а что непонятного во вменяемых метках...?
108 Дядя Васька
 
11.07.08
22:57
В (22) тебе пример, как их там не назови, а все равно бредятина.
109 Злопчинский
 
11.07.08
23:06
потому что сам код бредятина... а так даже с беглого взгляда ясно что образован цикл по ТЗ...
110 Дядя Васька
 
11.07.08
23:11
(109) Так он и будет бредятина, пока он с метками. Если ты ломаешь структуру, как он может другим-то быть?
111 vde69
 
11.07.08
23:13
(108) (109) ИХМО метки можно использовать как альтернативу для некотрых случаев рекурсии, по сколько и то, и другое не читаемо в любом случае )))
112 Злопчинский
 
11.07.08
23:16
Использование меток - это более низкий уровень абстракции кода - вот и все...
одно дело, когда их использовать "по делу" - и это не так уж часто нужно, и другое дело - пихать куда ни попадя...
113 Дядя Васька
 
11.07.08
23:17
(111) Да ладно нечитаемо... Когда ты из функции вызываешь ее же, ты все-таки вызываешь функцию, которая понятно что делает, а не отправляешь "в небо"..
114 Дядя Васька
 
11.07.08
23:19
(112) Ну так о том и речь. Приведи хоть один пример, где в языке высокого уровня их можно использовать по делу? Тогда я поверю что от них есть польза...
115 Злопчинский
 
11.07.08
23:25
(114) а смысл - если ты не веришь что ЯВУ есть польза от меток - то и не поверишь, я - верю... ;-)
116 Дядя Васька
 
11.07.08
23:26
(115) ну если это вопрос веры :))
117 Лефмихалыч
 
11.07.08
23:28
(0) всю ветку не читал, да и для того, чтобы свое мнение по сабжу сказать оно и не надо. метки вредны тем, что:
1. код становится нечитаемым (если кода 10 строчек, то похрену, есть там метки или нет).
2. в общем-о это следствие первого пункта - поддерживать код с метками - это... такое ... що яивороцтвенник...
118 Медвед1Сник
 
11.07.08
23:49
Метки просто не нужны. Это просто рудимент каменного века программирования. Метки не увеличивают мощность языка программирования, но только запутывают текст программы. Все делается элегантно и просто без меток - с помощью конструкций вевтления, циклов и блоков.
Никогда у меня еще не возникала потребность использовать метки. Только когда изучал бейсик в школьную пору. :)
119 vde69
 
11.07.08
23:55
(113) а если мне надо использовать 20-30 переменных из текущей процедуры! зачем мне их передавать в рекурсию?

можно их описать на весь модуль, или впихивать в массив или соответствие, но согласись - это то же не красиво и запутывает код)))
120 Дядя Васька
 
12.07.08
00:02
(119) Думается мне если из одной процедуры столько надо, скорее всего она перегружена. И должна была бы быть не одна...
121 rotting
 
12.07.08
01:11
(118) А как без меток написать процедуру которая перебирает таблицу значений и некоторые строки удаляет?
122 Дядя Васька
 
12.07.08
01:14
(121)
Для Сч=-ТЗ.КоличествоСтрок() По -1 Цикл
   Если ТвоеУсловие Тогда
       ТЗ.УдалитьСтроку(-Сч);
   КонецЕсли;
КонецЦикла;
123 rotting
 
12.07.08
01:28
(122) Спасибо, даже не подозревал!!!
124 France
 
12.07.08
02:06
(122) а давно перестало работать правило "сбита выборка"??
125 чупа
 
12.07.08
02:41
(72)
>> Дельта: 9955
>> Разница, я полагаю, очевидна.

во тупой попалсо персонаж :)

максимум что выиграешь что экономии 5 проверок в пользу меток это 0.01 секунды.
Пусть даже это будет 1000 проверок и выигранная секунда.
Ты выиграл секунду молодец!

Зато когда
- ты сядешь через длительное время за модернизацию этого кода - ты потеряешь час на понимание
- тебе понадобится изменить логику процесса в твоем примере тебе придется перелопачивать весь код. с нормальной логической структурой проверок тебе придется изменить пару условий.
- другому программисту понадобится модернизировать этот код, он потяреят час и сотрет его чтобы не терять его снова, и напишет нормальный код


итог - ты сделал НЕКАЧЕСТВЕННЫЙ код с выигранной секундой (и то не факт).
последствия некачественного кода гораздо более тяжкие, чем выигранная секунда.
126 чупа
 
12.07.08
02:42
(124) что значит сбита выборка?
прочитай его пример (122) внимательно
особенно строку Для
127 Дядя Васька
 
12.07.08
08:12
(124) Задом наперед же...
128 Kiber
 
12.07.08
09:13
Приведенный мною кусок кода куда более элегантный чем твой. Код максимально прост, все переходы расположеные выше слова возврат, а все метки ниже.
Конечно, спасибо Дяде Васе, я все-таки оценил нерациональность ипользования меток, и в рамках данной задачи попытаюсь использовать сложные условия. В тестировании я выиграл 7%, а если учесть, что в процедуре загрузки есть еще операция построчного чтения файла, то это раза в 3 больше чем 7%.
В предь, обещаю, не обращать внимания на посты глупых людей вроде тебя, которые мало того что ноуманнерят, но еще и пытаются доказать что белое это черное.
129 Kiber
 
12.07.08
09:13
(128) для (125)
130 Kiber
 
12.07.08
09:35
(121)
Есть еще кстати 1 вариант:

Пока н <= ТЗ.КоличествоСтрок() Цикл
   Если (ТвоеУсловие) Тогда
       ТЗ.УдалитьСтроку(н);
   Иначе
       н = н + 1;
   КонецЕсли;
КонецЦикла;
131 FreeFin
 
12.07.08
09:37
Моё личное мнение:
Никакого вреда в метках нет. Заявления о нечитабельности кода = пустые (и главное чужие) слова.
132 Kiber
 
12.07.08
10:00
(95)
Вроде придумал решение проблемы:
Запросом получаем из справочника значения всех 4х ключевых полей, и одно поле из единичек.
в получившуюся ТЗ добавляем загружаемую, сворачиваем по 4м группируемым полям и по 1 суммируемомму. Обрабатываем и удаляем все строки что сгруппировались (поле из единичек > 1), удаляем один из группируемых столбцов. Снова сворачиваем по 3м группируемым полям и по 1 суммируемомму. И т.д.. до 1 группируемого поля.
133 Kiber
 
12.07.08
10:04
+(132)
Даже, после несовпадения полной группировки можно сразу перейти к группировке по первому ключевому столбцу. Так как нам в принципе не важно сколько было совпадений, важно что совпадение не полное.
134 Злопчинский
 
12.07.08
11:52
глубокое имхо
в (130) код настолько нечитабелен, что про метки даже вспоминать не хочется. а когда подобных условий много и они вложенные - то ппц, можно вешаться...
я в таких еслях обычно юзаю
Пока н <= ТЗ.КоличествоСтрок() Цикл
   Если (ТвоеУсловие) Тогда
       ТЗ.УдалитьСтроку(н);
       Продолжить;
   КонецЕсли;
   н = н + 1;
КонецЦикла;
135 rotting
 
12.07.08
12:09
А тчто в этом плохого:
~МЕТКА:
Для Индекс = 0 По (ТЗ.Количество()-1) Цикл
   Если Условие Тогда
       ТЗ.Получить(Индекс).Удалить();
       Перейти ~МЕТКА;    
   КонецЕсли;
КонецЦикла;

Сильно плохо читаеться????????
136 Kiber
 
12.07.08
12:15
(134) те-же яйца только в профиль.
137 Kiber
 
12.07.08
12:21
(135) а зачем цикл если ты используешь метку?
Удаляешь цикл, Перейти ~МЕТКА выносишь за условие, в Иначе добавляешь Индекс = Индекс +1.
138 rotting
 
12.07.08
12:25
Вариантов до х...., и сильно ли мой вариант замедлит работу системы???? Или вы не поняли что я написал в (135)
139 Sadovnikov
 
12.07.08
12:35
(138) Извини, но в (135) ты написал нечитаемую хрень.
140 Лефмихалыч
 
12.07.08
13:45
"http://khpi-iip.mipk.kharkiv.edu/library/extent/dijkstra/pp/ewd215.html"
Эдсгер В. Дейкстра: Доводы против оператора goto
141 Лефмихалыч
 
12.07.08
13:59
+(140) Ключевой аргумент Дэйкстры в том, что goto ни чего не говорят о состоянии процесса. Например, если посмотреть на интерфейс какой-то процедуры, то можно делать какие-то выводы, исходя из ее имени, имен и типов ее параметров о том, что произошло до ее вызова и что будет сделано в ней, а вот с готами ни чего понятно не будет.
ЗЫ Которые тут приводят 5-10 строк текста программы с готами и спрашивают, чо и кому не понятно, те пусть идуть убиваться об бетонные препятствия, поскольку это не аргументы, а казуистика - готы вредны в настоящих (читай - "длинных", или "в которым офигенно много букв", или, если хотите, - "которые делают хоть что-то полезное") программах
142 Дядя Васька
 
12.07.08
19:38
(138) Во-первых чтобы въехать что ты сделал нужно раза три перечитать, хотя там и 7 строк всего, во вторых ты после каждого удаления начинаешь проход с первой строки и многократно проверяешь условие по одним и тем же строкам. Неужели не сильно замедлит?
143 Медвед1Сник
 
12.07.08
19:49
(141) Совершенно верно. Недостатки или достоинства отдельных программистских конструкций или целых парадигм можно "прочуствовать" лишь только участвуя в больших проектах а не клепая копеечные примеры. :)
144 Злопчинский
 
12.07.08
21:09
fuf/// иногда так код в тех же типовых написан - как будто у разработчиков 48дюймовые экраны..
145 The gray Cardinal
 
12.07.08
22:47
Метки можно использовать для выхода из глубоко вложенных циклов.
146 Дядя Васька
 
12.07.08
22:52
(145) Проще сунуть их в отдельную процедуру и выходить возвратом. Заодно и код не такой многоэтажный будет, под 48дюймовый монитор ))
147 dimoff
 
12.07.08
22:53
Метки как раз хороши в 1С, если ты хочешь чтобы не исполнялся большой кусок типового кода в середине функции - вместо того чтобы его комментировать лучше использовать метку и Перейти
148 Kiber
 
12.07.08
23:04
(141) Довольно познавательная статья.
Из профессионального кода, метки я видел в одном довольно известном коде выгрузки(тис-бух), причем использованы они были непотребно (без надлежащих комментариев и объяснений, без структуры).
off: (145) я тебя знаю...)))
149 Дядя Васька
 
12.07.08
23:12
(147) Хм.. А чем плохо его закомментировать? Не знаешь сочетания клавиш которое комментирует блок? :)
150 dimoff
 
12.07.08
23:18
(149) Эстетически некрасиво, при обновлении прийдется помнить.
151 Дядя Васька
 
12.07.08
23:20
(149) Напротив, зелень сразу бросится в глаза. А вот метки поймать сложнее, бо всего две строчки.
152 dimoff
 
12.07.08
23:30
(151) Обрамляй какой-нибудь своей меткой-комментом например //Дядя Васька
в начале и конце добавленного кода. Тогда делаешь поиск по конфигурации и все видишь
153 syktyk
 
12.07.08
23:34
(152)Апиридил! Только в 1с нет вставки времени, и это плохо.
154 Starhan
 
12.07.08
23:36
:) метки надо называть и коментировать нормально тогда вопрос о читабельности отпадает.
тоже не помню что бы как нибудь пригодились, даже в рекурсивных функцих создания родителей для элементов справочников.
155 Дядя Васька
 
12.07.08
23:37
(152) Да я как-то и так неплохо вижу... Делаю объединение с тем же релизом типовой, и всего делов. А так фигня какая-то, сначала делаем метки чтобы не делать комментариев, затем добавляем комментарии чтобы не потерять метки :) В принципе при сравнении их тоже без комментов видно, но по запаре одну измененную строчку легко пропустить, а блок фик пропустишь.
156 Starhan
 
12.07.08
23:38
есть вставка даты, если пользовтася шаблоном
157 syktyk
 
12.07.08
23:39
(156)Undocumented?
158 Дядя Васька
 
12.07.08
23:40
(154) Структура кода ломается. Вопрос не в том чтобы метку прочитать. Вон в (135) к примеру, если обозвать метку ~ВНачалоЦикла, вроде бы должно быть понятно что к чему, однако ж что делает этот кусок все равно поймешь только с третьей попытки, тогда как в (130) или (122) все просто и прозрачно.
159 Starhan
 
12.07.08
23:42
(157) в 8ке точно есть :)
160 Starhan
 
12.07.08
23:43
(158) кстати, если код не знакомый то все равно приходится залазить в каждый метод и смотреть чаво он там мутит :)
161 syktyk
 
12.07.08
23:43
(159)8-ка - мертворождена. :) В клюшках - точно не было.
Ошибка? Это не ошибка, это системная функция.