1. 1C / Говнокод #12383

    −119

    1. 001
    2. 002
    3. 003
    4. 004
    5. 005
    6. 006
    7. 007
    8. 008
    9. 009
    10. 010
    11. 011
    12. 012
    13. 013
    14. 014
    15. 015
    16. 016
    17. 017
    18. 018
    19. 019
    20. 020
    21. 021
    22. 022
    23. 023
    24. 024
    25. 025
    26. 026
    27. 027
    28. 028
    29. 029
    30. 030
    31. 031
    32. 032
    33. 033
    34. 034
    35. 035
    36. 036
    37. 037
    38. 038
    39. 039
    40. 040
    41. 041
    42. 042
    43. 043
    44. 044
    45. 045
    46. 046
    47. 047
    48. 048
    49. 049
    50. 050
    51. 051
    52. 052
    53. 053
    54. 054
    55. 055
    56. 056
    57. 057
    58. 058
    59. 059
    60. 060
    61. 061
    62. 062
    63. 063
    64. 064
    65. 065
    66. 066
    67. 067
    68. 068
    69. 069
    70. 070
    71. 071
    72. 072
    73. 073
    74. 074
    75. 075
    76. 076
    77. 077
    78. 078
    79. 079
    80. 080
    81. 081
    82. 082
    83. 083
    84. 084
    85. 085
    86. 086
    87. 087
    88. 088
    89. 089
    90. 090
    91. 091
    92. 092
    93. 093
    94. 094
    95. 095
    96. 096
    97. 097
    98. 098
    99. 099
    100. 100
    Функция РазобратьКодыНеисправностей(СтрокаКодов, ТипКода)
    	СпрКодов = СоздатьОбъект("Справочник.КодыГарантийныхНеисправностей");
    	ГруппаТ1 = СпрКодов.НайтиПоКоду("0",0);
    	ГруппаТ2 = СпрКодов.НайтиПоКоду("00",0);
    	ГруппаТ3 = СпрКодов.НайтиПоКоду("000",0);
    	Если СтрокаКодов <> "" Тогда
    		Разд1 = Найти(СтрокаКодов, ";");
    		Разд2 = Найти(Прав(СтрокаКодов,СтрДлина(СтрокаКодов) - Разд1), ";") + Разд1;
    		Разд3 = Найти(Прав(СтрокаКодов,СтрДлина(СтрокаКодов) - Разд2), ";") + Разд2;
    		Разд4 = Найти(Прав(СтрокаКодов,СтрДлина(СтрокаКодов) - Разд3), ";") + Разд3;
    		Разд5 = Найти(Прав(СтрокаКодов,СтрДлина(СтрокаКодов) - Разд4), ";") + Разд4;
    		Разд6 = Найти(Прав(СтрокаКодов,СтрДлина(СтрокаКодов) - Разд5), ";") + Разд5;
    		Разд7 = Найти(Прав(СтрокаКодов,СтрДлина(СтрокаКодов) - Разд6), ";") + Разд6;
    		Разд8 = Найти(Прав(СтрокаКодов,СтрДлина(СтрокаКодов) - Разд7), ";") + Разд7;
    		Разд9 = Найти(Прав(СтрокаКодов,СтрДлина(СтрокаКодов) - Разд8), ";") + Разд8;
    		Разд10 = Найти(Прав(СтрокаКодов,СтрДлина(СтрокаКодов) - Разд9), ";") + Разд9;
    		Разд11 = Найти(Прав(СтрокаКодов,СтрДлина(СтрокаКодов) - Разд10), ";") + Разд10;
    		Если ТипКода = "Т1" Тогда
    			Если Разд1 > 1 Тогда
    				СпрКодов.ИспользоватьРодителя(ГруппаТ1);
    				Если СпрКодов.НайтиПоКоду("0/" + Лев(СтрокаКодов,Разд1-1),2)  = 1 Тогда 
    					ПолучТ1 = СпрКодов.ТекущийЭлемент();
    					Возврат ПолучТ1;
    				КонецЕсли;
    			КонецЕсли;
    		ИначеЕсли ТипКода = "Т2" Тогда
    			Если Разд2-Разд1 > 1 Тогда
    				СпрКодов.ИспользоватьРодителя(ГруппаТ2);
    				Если СпрКодов.НайтиПоКоду("00/" + Лев(Прав(СтрокаКодов, СтрДлина(СтрокаКодов) - Разд1), Разд2 - Разд1 - 1), 2) = 1 Тогда
    					ПолучТ2 = СпрКодов.ТекущийЭлемент();
    					Возврат ПолучТ2;
    				КонецЕсли;
    			КонецЕсли;
    		ИначеЕсли ТипКода = "Т3_1" Тогда
    			Если Разд3-Разд2 > 1 Тогда
    				СпрКодов.ИспользоватьРодителя(ГруппаТ3);
    				Если СпрКодов.НайтиПоКоду("000/" + Лев(Прав(СтрокаКодов, СтрДлина(СтрокаКодов) - Разд2), Разд3 - Разд2 - 1), 2) = 1 Тогда
    					ПолучТ3_1 = СпрКодов.ТекущийЭлемент();
    					Возврат ПолучТ3_1;
    				КонецЕсли;
    			КонецЕсли;
    		ИначеЕсли ТипКода = "Т3_2" Тогда
    			Если Разд4-Разд3 > 1 Тогда
    				СпрКодов.ИспользоватьРодителя(ГруппаТ3);
    				Если СпрКодов.НайтиПоКоду("000/" + Лев(Прав(СтрокаКодов, СтрДлина(СтрокаКодов) - Разд3), Разд4 - Разд3 - 1), 2) = 1 Тогда
    					ПолучТ3_2 = СпрКодов.ТекущийЭлемент();
    					Возврат ПолучТ3_2;
    				КонецЕсли;
    			КонецЕсли;
    		ИначеЕсли ТипКода = "Т3_3" Тогда
    			Если Разд5-Разд4 > 1 Тогда
    				СпрКодов.ИспользоватьРодителя(ГруппаТ3);
    				Если СпрКодов.НайтиПоКоду("000/" + Лев(Прав(СтрокаКодов, СтрДлина(СтрокаКодов) - Разд4), Разд5 - Разд4 - 1), 2) = 1 Тогда
    					ПолучТ3_3 = СпрКодов.ТекущийЭлемент();
    					Возврат ПолучТ3_3;
    				КонецЕсли;
    			КонецЕсли;
    		ИначеЕсли ТипКода = "Т3_4" Тогда
    			Если Разд6-Разд5 > 1 Тогда
    				СпрКодов.ИспользоватьРодителя(ГруппаТ3);
    				Если СпрКодов.НайтиПоКоду("000/" + Лев(Прав(СтрокаКодов, СтрДлина(СтрокаКодов) - Разд5), Разд6 - Разд5 - 1), 2) = 1 Тогда
    					ПолучТ3_4 = СпрКодов.ТекущийЭлемент();
    					Возврат ПолучТ3_4; 
    				КонецЕсли;
    			КонецЕсли;
    		ИначеЕсли ТипКода = "Т3_5" Тогда
    			Если Разд7-Разд6 > 1 Тогда
    				СпрКодов.ИспользоватьРодителя(ГруппаТ3);
    				Если СпрКодов.НайтиПоКоду("000/" + Лев(Прав(СтрокаКодов, СтрДлина(СтрокаКодов) - Разд6), Разд7 - Разд6 - 1), 2) = 1 Тогда
    					ПолучТ3_5 = СпрКодов.ТекущийЭлемент();
    					Возврат ПолучТ3_5;
    				КонецЕсли;
    			КонецЕсли;
    		ИначеЕсли ТипКода = "Т3_6" Тогда
    			Если Разд8-Разд7 > 1 Тогда
    				СпрКодов.ИспользоватьРодителя(ГруппаТ3);
    				Если СпрКодов.НайтиПоКоду("000/" + Лев(Прав(СтрокаКодов, СтрДлина(СтрокаКодов) - Разд7), Разд8 - Разд7 - 1), 2) = 1 Тогда
    					ПолучТ3_6 = СпрКодов.ТекущийЭлемент();
    					Возврат ПолучТ3_6; 
    				КонецЕсли;
    			КонецЕсли;
    		ИначеЕсли ТипКода = "Т3_7" Тогда
    			Если Разд9-Разд8 > 1 Тогда
    				СпрКодов.ИспользоватьРодителя(ГруппаТ3);
    				Если СпрКодов.НайтиПоКоду("000/" + Лев(Прав(СтрокаКодов, СтрДлина(СтрокаКодов) - Разд8), Разд9 - Разд8 - 1), 2) = 1 Тогда
    					ПолучТ3_7 = СпрКодов.ТекущийЭлемент();
    					Возврат ПолучТ3_7; 
    				КонецЕсли;
    			КонецЕсли;
    		ИначеЕсли ТипКода = "Т3_8" Тогда
    			Если Разд10-Разд9 > 1 Тогда
    				СпрКодов.ИспользоватьРодителя(ГруппаТ3);
    				Если СпрКодов.НайтиПоКоду("000/" + Лев(Прав(СтрокаКодов, СтрДлина(СтрокаКодов) - Разд9), Разд10 - Разд9 - 1), 2) = 1 Тогда
    					ПолучТ3_8 = СпрКодов.ТекущийЭлемент();
    					Возврат ПолучТ3_8; 
    				КонецЕсли;
    			КонецЕсли;
    		ИначеЕсли ТипКода = "Т3_9" Тогда
    			Если Разд11-Разд10 > 1 Тогда
    				СпрКодов.ИспользоватьРодителя(ГруппаТ3);

    ещё один высер от автодилера.
    1. начнём сначала, там есть строки:
    ...
    ГруппаТ1 = СпрКодов.НайтиПоКоду("0",0);
    ..., обращаю внимание автора, что функция НайтиПоКоду не возвращает элемент справочника, она лишь говорит есть он или нет, для позиционирования на элементе не хватает строк типа ГруппаТ1 = СпрКодом.ТекущийЭлемент(); и т.д.
    2. дальше. в функцию передаётся параметр СтрокаКодов - это строка с запятыми в качестве разделителей. я конечно понимаю, что в 1С нет встроенной функции для получения массива частей строки типа split в java, но написать свою вообще не сложно, но видимо у автора не хватило мозг..., извините, времени.
    3. теперь смотрим на подобные (их несколько в функции) блоки кода типа:
    СпрКодов.ИспользоватьРодителя(ГруппаТ1);
    Если СпрКодов.НайтиПоКоду("0/" + Лев(СтрокаКодов,Разд1-1),2) = 1 Тогда
    ПолучТ1 = СпрКодов.ТекущийЭлемент();
    Возврат ПолучТ1;
    КонецЕсли;
    строка СпрКодов.ИспользоватьРодителя(ГруппаТ1); не имеет смысла, т.к. ГруппаТ1 содержит значение 1 (см. п.1), а не ссылку на элемент справочника, код работает только благодаря второму параметру - 2, т.к. он заставляет функцию НайтиПоКоду искать по всему справочнику, используя полный код.

    Запостил: VladC, 02 Января 2013

    Комментарии (41) RSS

    • Всё описание не осилил. Как и весь год. Обращаю внимание автора, что после куска с Т3_1, когда уже смысл и стиль понятен, можно было бы поставить //...и т.д., а не засирать несколько экранов этим поносом. :)
      Ответить
    • > Лев(Прав

      Лев всегда прав!
      Ответить
      • Лев(Прав(Львица(Не(Права()))).
        http://govnokod.ru/11293#comment144843
        Ответить
    • Инфернальненько. Циклы для недостаточно ленивых!! Как и множественный вызов СтрДлина(СтрокаКодов).
      Обычный вывод: проще переписать с нуля.

      Не так давно я видел генератор штрихкода EAN13 по коду товара. Хотел запостить отдельным, но не буду изменять своей традиции и занесу в комментарий, благо там поржать и не над чем особо. Комментарии мои.
      НК=Строка(Код); // Код товара
      сч=(12-2-СтрДлина(Код));
      НК2=Строка(Константа.ВнутреннийПрефикс); // Префикс кода, не должен совпадать с кодом стран, обычно - [20..29]
      Для j=1 по сч Цикл
      	НК2=НК2+"0";
      КонецЦикла;
      НК2=НК2+НК;
      НК2=СокрЛ(НК2);
      SumЧет=0;
      SumНеЧет=0;
      Для k=1 По 12 Цикл
      	Если (k/2)=Цел(k/2) Тогда
      		SumЧет=SumЧет+3*Число(Сред(НК2,k,1));
      	Иначе
      		SumНеЧет=SumНеЧет+Число(Сред(НК2,k,1));
      	КонецЕсли;
      КонецЦикла;
      Шаг4=SumЧет+SumНеЧет;
      КС=(10-((ШАГ4/10)-Цел(ШАГ4/10))*10);
      Если КС=10 Тогда
      	КС=0;
      КонецЕсли;
      НК2=НК2+Строка(Цел(КС));
      Если Константа.НеДополнятьШтрихКодНулями<>Перечисление.Булево.Да Тогда
      	КонЦ=(ДлинаШтрихКода-СтрДлина(НК2));
      	Для i=1 по КонЦ Цикл
      		НК2="0"+НК2;
      	КонецЦикла;
      КонецЕсли;

      Тем не менее, неведомый автор сделал все офигеннейшие вкусняшки: это и сложение чётной и нечётной компонент в разные переменные, которые всё равно складываются; также изобрёл дополнение нулями кода аж джва раза, строка вычисления дополнения до десяти - вообще шик, её явно писал человек, незнакомый с оператором остатка от деления %. Если я не ошибаюсь, вменяемый программист переписал чисто генераторную часть в шесть строк.
      Надо перестать давать мартышкам бананы, сделать отдел QA, и нещадно трахать без вазелина. Возможно, именно этим можно будет привнести в отрасль немного упорядоченности.
      Второй вариант - сделать независимый QA-центр, где за скромную плату специально обученные люди, которые знают всякие там алгоритмыимеют на плечах не пустое ведро, на правах аутсорсинга смогут подсказать, в какую сторону нужно копать. Бухгалтерию же на аутсорс выносят.
      Ответить
      • На счет аутсорса - поддерживаю, код ниасилил, ох уж этот 1С...
        Ответить
      • мне кажется так пишут либо случайные люди в профессии, либо те, кто начал с 1С и на ней же и остановился
        Ответить
        • Тоже как вариант вполне. Никто из наших не сознаётся, говорят, пришло издревле в какой-то конфигурации. И вот хрен их знает, может быть и так.
          Ответить
    • Это моё первое знакомство с кодом 1С .
      Я теперь понимаю почему крутые 1С кодеры так хорошо оплачиваются.

      Вероятность получения проекта с кучей говнокода стремиться к бесконечности. Да и нормальный редактор, чтобы всё это удобно было рефакторить, наверное, надо еще поискать.

      Труд здесь титанический.
      Ответить
      • ну всё не так уж плохо, редактор неплохой, особенно если использовать поделки сторонних разработчиков, облегчающие жизнь, но тем не менее даже в 8.2 до сих пор нет нормальных контекстных подсказок, таких как в Eclipse например или в VisualStudio, хотя платформа существует уже не первый год.
        Ответить
        • даже создатели смотрят на разработчиков как на говно: мол, ничего тут сложного, школьный бейсик, да еще на русском, обойдетесь.
          Ответить
          • есть такое.
            Ответить
          • Удобные среды для неудачников, а для коммунистов - только стоя кверху ногами в гамаке.
            Ответить
            • и никакой подсветки синтаксиса!
              Ответить
              • Ты еще пожалуйся, что в художественной литературе подсветки нет, читать неудобно.
                Ответить
                • да, не хватает красного, зеленого и голубого.
                  Ответить
                • Меня больше всего огорчает, что в бумажных книгах в оглавлении не работают ссылки на страницы.
                  Ответить
        • нет нормальных контекстных подсказок
          8.3 же. не скажу, что прям ВАХ, но тоже вполне удобно. по крайней мере перестал лезть в синтаксис-помощник с мыслями "какой, блять, там это параметр по счету"
          Ответить
          • Ну не знаю, по мне так и 8.3 удобствами вообще не блещет. Если сравнить, к примеру, даже с бесплатными вещами такими как Eclipse или Netbeans, в которых возможности того же рефакторинга широчайшие, а удобство работы с кодом высочайшее и учитывая то, что 1С существует уже не одно десятилетие, то лично у меня напрашивается вывод, что в 1С просто забили на удобство рядовых разработчиков, делая минимум того, что должно быть, покупают же и ладно.
            Ответить
            • в 8.3.5 или 8.3.6 добавят инструменты рефакторинга и расширенного умного поиска по объектам метаданных. рекомендую v8.1c.ru/o7 почитать, нас ждут неплохие фишки в новых релизах.
              Ответить
              • Я такие новости уже воспринимаю без оптимизма, потому что уже давно складывается ощущение, что 1С пофигу на нас, её кроме прибыли ничего не интересует. Когда кто-то стремится сделать что-то от души, то это стремление видно из далека, в отношении 1С я пока только наблюдаю стремление стричь бабло, выпуская продукты очень посредственного качества, особенно это касается отраслевых продуктов. Многие скажут "ну есть же сеть франей, которые могут допиливать на местах", да, есть конечно, но франя может именно только допилить, развить продукт в состоянии только разработчик, автор этого продукта, хотя бывают и исключения, но это именно исключения и о них даже говорить не стоит.
                Ответить
                • раз пишете на 1с, знаете, что отраслевка и платформа пишутся разными людьми.
                  Ответить
                  • Странно было бы думать, что одними и теми же.
                    Ответить
          • Кстати платность платформы, да ещё с такой плачевной производительностью тоже выглядит странновато, но им конечно виднее, процветают же.
            Ответить
            • может потому и процветают? :)
              после делфи часто не хватало возможности посмотреть исходники и реализации тех или иных процедур. пишешь что-то и не понять, то ли лыжи не едут, то ли я молодец.
              Ответить
              • Т.к. я работаю не только в 1С, то я не отвык от удобств других языков и IDE и всё что только можно делаю не на 1С, больше всего мне нравится связка javascript/php/java+mysql/pstgresql - очень быстро, надёжно, всё отработано, развивается и абсолютно бесплатно.
                Ответить
                • чего лично вам не хватает в конфигураторе как в ide?
                  Ответить
                  • Да много чего не хватает, зачем здесь распыляться и перечислять, всё равно это ничего не даст? Проще назвать удобства, но для этого тоже смысла не вижу, т.к. не хочу рекламировать продукт, который мне лично не нравится и пользуюсь им лишь под диктовку рынка.
                    Ответить
        • лололол

          вот и придумали иде, по сравнению с которых даже Eclipse обладает подсказками!
          Ответить
      • > Вероятность получения проекта с кучей говнокода стремиться к бесконечности
        К единице же. Хотя, в военное время и синусы по три-четыре бывают.

        На самом деле, очень част подход, когда к делу изначально приходят непрофессионально. Вот пример. Знакомая контора, изначально босс подходил к процессу написания не с той стороны. Под каждую задачу пилил базу из первой подходящей. В итоге, за каких-то пять-десять лет там образовался форменный зоопарк из ни с чем не совместимых версий.
        Ответить
        • Это смотря какая вероятность... полная вероятность не может быть больше единицы, а по Баесу - любое натуральное число...
          Ответить
          • Я думаю, что применительно к коду вероятность как в случае с динозавром - фифти-фифти.
            Ответить
          • В современном мире стоит таки отталкиваться от аксиоматики Колмогорова
            Ответить
        • >Хотя, в военное время и синусы по три-четыре бывают.

          π/2-2.064i
          Ответить
    • Шедевральный маразм!!!
      Ответить

    Добавить комментарий