- 001
- 002
- 003
- 004
- 005
- 006
- 007
- 008
- 009
- 010
- 011
- 012
- 013
- 014
- 015
- 016
- 017
- 018
- 019
- 020
- 021
- 022
- 023
- 024
- 025
- 026
- 027
- 028
- 029
- 030
- 031
- 032
- 033
- 034
- 035
- 036
- 037
- 038
- 039
- 040
- 041
- 042
- 043
- 044
- 045
- 046
- 047
- 048
- 049
- 050
- 051
- 052
- 053
- 054
- 055
- 056
- 057
- 058
- 059
- 060
- 061
- 062
- 063
- 064
- 065
- 066
- 067
- 068
- 069
- 070
- 071
- 072
- 073
- 074
- 075
- 076
- 077
- 078
- 079
- 080
- 081
- 082
- 083
- 084
- 085
- 086
- 087
- 088
- 089
- 090
- 091
- 092
- 093
- 094
- 095
- 096
- 097
- 098
- 099
- 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, т.к. он заставляет функцию НайтиПоКоду искать по всему справочнику, используя полный код.
Лев всегда прав!
http://govnokod.ru/11293#comment144843
Обычный вывод: проще переписать с нуля.
Не так давно я видел генератор штрихкода EAN13 по коду товара. Хотел запостить отдельным, но не буду изменять своей традиции и занесу в комментарий, благо там поржать и не над чем особо. Комментарии мои.
Тем не менее, неведомый автор сделал все офигеннейшие вкусняшки: это и сложение чётной и нечётной компонент в разные переменные, которые всё равно складываются; также изобрёл дополнение нулями кода аж джва раза, строка вычисления дополнения до десяти - вообще шик, её явно писал человек, незнакомый с оператором остатка от деления %. Если я не ошибаюсь, вменяемый программист переписал чисто генераторную часть в шесть строк.
Надо перестать давать мартышкам бананы, сделать отдел QA, и нещадно трахать без вазелина. Возможно, именно этим можно будет привнести в отрасль немного упорядоченности.
Второй вариант - сделать независимый QA-центр, где за скромную плату специально обученные люди, которые знают всякие там алгоритмыимеют на плечах не пустое ведро, на правах аутсорсинга смогут подсказать, в какую сторону нужно копать. Бухгалтерию же на аутсорс выносят.
Я теперь понимаю почему крутые 1С кодеры так хорошо оплачиваются.
Вероятность получения проекта с кучей говнокода стремиться к бесконечности. Да и нормальный редактор, чтобы всё это удобно было рефакторить, наверное, надо еще поискать.
Труд здесь титанический.
8.3 же. не скажу, что прям ВАХ, но тоже вполне удобно. по крайней мере перестал лезть в синтаксис-помощник с мыслями "какой, блять, там это параметр по счету"
после делфи часто не хватало возможности посмотреть исходники и реализации тех или иных процедур. пишешь что-то и не понять, то ли лыжи не едут, то ли я молодец.
вот и придумали иде, по сравнению с которых даже Eclipse обладает подсказками!
К единице же. Хотя, в военное время и синусы по три-четыре бывают.
На самом деле, очень част подход, когда к делу изначально приходят непрофессионально. Вот пример. Знакомая контора, изначально босс подходил к процессу написания не с той стороны. Под каждую задачу пилил базу из первой подходящей. В итоге, за каких-то пять-десять лет там образовался форменный зоопарк из ни с чем не совместимых версий.
π/2-2.064i