Имя: Пароль:
1C
 
Рефакторинг кода в 1С
,
0 НоваяВолна
 
12.01.22
11:34
Надоел робот, который не воспринимает код, вроде и простой и говорит ИСПРАВЬ! Хоть и часы по рефакторингу у нас оплачиваются как и обычные рабочие часы, но лезть в готовый код, переделывать и по новой тестировать уже сданную работу как то не комильфо. И ладно ещё были бы серьезные ошибки, а то ругается на такую мелочь, как //Комментарий - отствие пробела между // и Комментарий )))). А теперь к сути. как бы вы написали конструкцию вида:

        Если ВидНеисправности = Справочники.ВидНеисправности .НайтиПоКоду("10464")
            ИЛИ  ВидНеисправности = Справочники.ВидНеисправности .НайтиПоКоду("10998")
            ИЛИ  ВидНеисправности = Справочники.ВидНеисправности .НайтиПоКоду("10999")
            ИЛИ  ВидНеисправности = Справочники.ВидНеисправности .НайтиПоКоду("10929")
            ИЛИ  ВидНеисправности = Справочники.ВидНеисправности .НайтиПоКоду("10467") Тогда
                ......
       КонецЕсли;

ругается что слишком сложная конструкция из ИЛИ
1 dubolom
 
12.01.22
11:37
МассивВН = Новый Массив;
МассивВН.Добавить(Справочники.ВидыНеисправности.НайтиПоКоду("ХорошийКод"));
МассивВН.Добавить(Справочники.ВидыНеисправности.НайтиПоКоду("ОченьХорошийКод"));
МассивВН.Добавить(Справочники.ВидыНеисправности.НайтиПоКоду("ВащеОтстойныйКод"));
Если МассивВН.Найти(ВидНеисправности)<>Неопределено Тогда
    ...
КонецЕсли;
2 pechkin
 
12.01.22
11:38
(1) Лучше соотвествие
3 ДенисЧ
 
12.01.22
11:38
Справочники.ВидНеисправности.Поломка
и т.п.
4 pechkin
 
12.01.22
11:39
а правильно нужно галку какую поставить в справочник
5 arsik
 
гуру
12.01.22
11:40
(2) Массив быстрее
6 Василий Алибабаевич
 
12.01.22
11:40
(0)
МассивКодовНеисправностей = Новый Массив;
МассивКодовНеисправностей.Добавить("10464");
МассивКодовНеисправностей.Добавить("...");
МассивКодовНеисправностей.Добавить("...");
МассивКодовНеисправностей.Добавить("...");

Если МассивКодовНеисправностей.Найти(ВидНеисправности.Код) <> Неопределено Тогда
7 pechkin
 
12.01.22
11:41
(5) в массиве поиск - это перебор, а в соотвествии - хэшмап
8 RomaH
 
naïve
12.01.22
11:41
Справочники.ВидНеисправности.Поломка();

Функция Поломка() Экспорт
Возврат Справочники.ВидНеисправности.ПолучитьСсылку(новый УникальныйИдентификатор(""));
КонецФункции
9 dubolom
 
12.01.22
11:41
(7) Хосподя, у него пять элементов.
10 Василий Алибабаевич
 
12.01.22
11:41
+ (6) Или можно строку с разделителями. Но строка ИМХО не так наглядно. И будет тяжелее в сопровождении.
11 arsik
 
гуру
12.01.22
11:44
(7) На создание и заполнение соответствия время потеряешь. Если Соответствие заполнить 1 раз и вызывать поиск 100 тогда возможно будет быстрее.
12 pechkin
 
12.01.22
11:45
(11) все равно правильный вариант это (4)
13 mistеr
 
12.01.22
11:47
(0) Я бы заменил на функцию. А список кодов на массив ссылок с кэшированием.
14 dubolom
 
12.01.22
11:48
(13) Тогда уж запилить отдельный регистр сведений со списком требуемых видов неисправности, чтобы каждый раз в код не лезть.
15 Uberschall
 
12.01.22
11:52
(7) это так, но чтобы это знать, надо быть "одной ногой" в "нормальном" ЯП. т.е. по сути знать несколько ЯП и все -равно заниматься 1С)))
16 mistеr
 
12.01.22
11:52
(14) Возможно, если он часто меняется.
17 Garykom
 
гуру
12.01.22
11:53
(0)

Коды = Новый Структура("10464, 10998, ...");
Если Коды.Свойство(ВидНеисправности.Код) Тогда
// ...
КонецЕсли;
18 dubolom
 
12.01.22
11:55
(12) Смотря по размеру справочника.
Если он большой, а в коде, как сейчас, вариантов 5 - то правильнее (14)
19 Garykom
 
гуру
12.01.22
11:55
(0) У тебя ошибка не в сложном условии а в куче лишних дерганий БД через НайтиПоКоду
20 mistеr
 
12.01.22
11:55
(17) Хороший вариант, если вместо Коды будет говорящее имя.
21 RomanYS
 
12.01.22
11:55
(17) низзя такие ключи в структуре.
22 Garykom
 
гуру
12.01.22
11:55
(21) ну сделай массив или соответствие
23 НоваяВолна
 
12.01.22
11:58
(4) галку? интересно, но не понятно. выборка по справочнику потому и идет по нескольким кодам, потому как Виды Неисправностей, а точнее объекты ремонта разные. Грубо говоря если случились перечисленные неисправности, то сломался к примеру холодильник, а если другие, то радиоприемник, третьи - телевизор и т.д.
24 Garykom
 
гуру
12.01.22
11:59
(21) хотя влом
Коды = Новый Структура("К10464, К10998, ...");
Если Коды.Свойство("К"+ВидНеисправности.Код) Тогда
// ...
КонецЕсли;
25 Garykom
 
гуру
12.01.22
11:59
(24)+ или вместо "К" лучше|можно "_" ?
26 dubolom
 
12.01.22
12:00
(23) Тогда не галку, а перечисление "ПоломаннаяХрень". И соответствующий реквизит в справочнике/регистре сведений.
27 dubolom
 
12.01.22
12:01
(24) Если бы я был такой же злой, как средний мистянин, написал бы, что это - образец говнокода.
28 RomanYS
 
12.01.22
12:02
(24) имхо лучше так
Массив = СтрРазделить("10464, 10998, ...");

(25) а если код будет с пробелом или ещё каким символом запрещенным в ключах?
29 Garykom
 
гуру
12.01.22
12:02
(28) Согласен
30 Garykom
 
гуру
12.01.22
12:03
(27) Говнокод это в (0) У меня ближе к https://ru.wikipedia.org/wiki/Brainfuck - излишняя оптимизация
31 Garykom
 
гуру
12.01.22
12:05
Суть что если у ТС работа с кодами то нехрен дергать базу
Коды из строки в некую структуру и ищи в ней
32 VladZ
 
12.01.22
12:08
(0) А можно объединить эти Виды неисправностей общим признаком?
Тогда можно добавить реквизит в справочник и отбирать по этому признаку.

Плюсы: при добавлении нового элемента справочника с подобным признаком нет необходимости переписывать код.
Минусы: требуется дополнительный реквизит (если база на поддержке - нужно продумать варианты).
33 НоваяВолна
 
12.01.22
12:13
(32) в том то и дело что нет. По идее создается документ в котором группой является Неисправность, а подгруппы Виды неисправностей. При этом Объект ремонта для каждой подгруппы свой. Объекты - это отдельный справочник
34 VladZ
 
12.01.22
12:21
(33) Из личного опыта: кусок кода в сабже - это показатель неэффективной архитектуры.
А чтобы дать эффективный ответ на вопрос в сабже - нужно видеть архитектуру системы в целом.

Подвожу итог: если указанный код тебя не особо напрягает - оставь как есть. Да, он кривоват, но работает же.
Придет время - и поправишь. Либо оно само отомрет за ненадобностью.

Как говорят китайцы: "Живи, сохраняя покой. Придет весна и цветы распустятся сами"...
35 dubolom
 
12.01.22
12:21
(33) Ну соответствие же "многие к одному" типичное. (26) чем не устраивает?
36 ildary
 
12.01.22
12:25
(0) Для глупых проверок типа отсутствие пробела между // и Комментарий - лучше включить запрет их обнаружения - спецкомментарий в начале кода.
37 mikecool
 
12.01.22
13:00
(0) за такой код линейкой бить надо
38 mikecool
 
12.01.22
13:00
+37 чугунной
39 Asmody
 
12.01.22
13:02
(38)+ по голове
40 DrShad
 
12.01.22
13:02
(39) сначала по пальцам
41 ДенисЧ
 
12.01.22
13:03
(40) Лучше по яйцам.
42 DrShad
 
12.01.22
13:04
(41) +100500 чтобы не размножались
43 mikecool
 
12.01.22
13:04
перепись садистов ))
44 Asmody
 
12.01.22
13:05
(36) ну, вообще-то, ненужные проверки отключаются в настройках. (полагаю, что у ТС модный нынче сонаркуб с bsl-плагином). только такие настройки обсуждаются в команде, а не по принципу "я хочу, я не хочу".
порядок в коде должен быть
45 Asmody
 
12.01.22
13:06
(43) ты первый начал
46 DrShad
 
12.01.22
13:07
(43) садист в данном случае это ТС
прикинь тебе в наследство достанется такая БД?
47 mikecool
 
12.01.22
13:08
(45) ага ))
как то на проекте в тестовую(даже не в прод) проскочил аналог кода из (0), прог забыл убрать - так буча была поднята со стороны заказчика, что чуть ли не проект сворачиваем... )))
48 mikecool
 
12.01.22
13:09
(44) дык такие конструкции однозначно проверки не должны пропускать, ибо овнокод )
49 Asmody
 
12.01.22
13:11
(47) За НайтиПоКоду() и НайтиПоНаименованию() надо бить вот этой книжкой https://v8.1c.ru/metod/books/42696.htm
50 Dmitrii
 
гуру
12.01.22
13:14
Соглашусь с (34). Проблема не в коде, а в архитектуре.
Либо переделать по человечески. И тогда надо пересматривать архитектуру.
Либо оставить пока как есть, отложив до тех времён, когда будет возможность сделать нормально.

(47) >> в тестовую проскочил аналог кода из (0), прог забыл убрать - так буча была поднята со стороны заказчика.
Тут всё таки обратная ситуация. *авнокод уже в проде. Любая оптимизация поиска или проверки по коду в справочнике даст только лишь оптимизированный *авнокод. Надо подход пересматривать, а не менять один *авнокод на другой - более оптимальный. ИМХО.
51 DimVad
 
12.01.22
13:19
(17) Может вместо "Если Коды.Свойство(ВидНеисправности.Код) Тогда"
что-то типа :

Код_ = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ВидНеисправности, "Код");
Если Коды.Свойство(Код_) Тогда
52 ildary
 
12.01.22
13:37
(44) Да, но нет: в коде надежнее - завтра эту конфигурацию откроют удаленщики без сонаркуба, но с вручную подключенным BSL (Turboconf, phoenixbsl) - и им уже не надо заморачиваться.
53 Asmody
 
12.01.22
13:40
(52) Если практикуется сонаркуб, то код удаленщиков так же обязан через него проходить.
54 Гений 1С
 
гуру
12.01.22
13:47
(0) хороший робот, ободряю. А робот ободряет разработчиков.
55 ildary
 
12.01.22
13:50
(53) Да, но удаленщики проверяют свой код до сонаркуба.
56 novichok79
 
12.01.22
14:42
да, тяжко в 1С без нормальных линтеров.
ну шо, хешмап, можно даже фиксированный чтоб наверняка и инициализация его 1 раз.
57 Asmody
 
12.01.22
14:51
(55) это проблемы удаленщиков. ну или дайте им свой .bsl-language-server.json
58 mikecool
 
12.01.22
14:51
(50) "Либо оставить пока как есть, отложив до тех времён, когда будет возможность сделать нормально. " Такое время не наступает почти никогда