Имя: Пароль:
1C
Как страшно жить
Плохой код, у кого есть более страшные примеры
🠗 (Волшебник 18.02.2015 15:25)
,
0 Spyke
 
18.02.15
13:59

Тов=СоздатьОбъект("Справочник.Номенклатура");
Док.ВыбратьДокументы(ВыбДата,ВыбДата);
Пока Док.ПолучитьДокумент()>0 Цикл
    Док.ВыбратьСтроки();
        Пока Док.ПолучитьСтроку()>0 Цикл
            Товар=Строка(Док.Товар);
            Тов.НайтиПоНаименованию(Товар,0,1);

Где
Док.Товар - рек табл части тип знпчения спр. номен
1 zak555
 
18.02.15
14:00
и ?
2 H A D G E H O G s
 
18.02.15
14:00
БСП
3 vis_tmp
 
18.02.15
14:00
(1)Это 7.7 + какой-то умелец
4 Karav
 
18.02.15
14:01
(1) Конца цикла нет наверно...в этом проблема :)
5 PLUT
 
18.02.15
14:01
(0) мой пофигуратор не знает что такое "СоздатьОбъект"
6 shuhard
 
18.02.15
14:01
(0) примеры кода на 7.7, древнем как гуано мамонта - к чему это ?
7 PLUT
 
18.02.15
14:01
+(5) *у меня пофигуратор
8 Spyke
 
18.02.15
14:01
(4) в точку
9 MMF
 
18.02.15
14:02
(0) ну немножко медленный и бессмысленный код. Но разве он плохой? Плохой - это когда вперемешку русский и англ синтаксис и идентификаторы А0, А11, А111, А11111
10 Spyke
 
18.02.15
14:03
А это не смущает?

Товар=Строка(Док.Товар);
Тов.НайтиПоНаименованию(Товар,0,1);
11 Гёдза
 
18.02.15
14:04
в 77 и нельзя было найти док в котором есть товар более хорошим способом
12 DimG
 
18.02.15
14:05
(10) Смешные вы, гуру :)
13 ДенисЧ
 
18.02.15
14:05
(11) ЛПП!
14 Рэйв
 
18.02.15
14:06
(0)Типичная ошибка студента новичка, не понимающего еще что такое ссылка. Часто такое встречал в поделках франчей.
15 Гёдза
 
18.02.15
14:06
(10) Да и это не особо хуже чем по ссылке найти
16 Гёдза
 
18.02.15
14:06
Ибо в 7 нет Ссылка.ПолучитьОбъект()
17 pav007
 
18.02.15
14:07
(16) Есть НайтиЭлемент()
18 MMF
 
18.02.15
14:07
(13) ээ стесняюсь спросить, что такое ЛПП?
19 kobzon2
 
18.02.15
14:07
В документе используется справочник не Номенклатура что-ли?
20 Builder
 
18.02.15
14:09
(10) Но ведь работает! :) Правда не всегда найдет то что надо.
Плохой код - это когда в одной конфе список касс был сделан Перечислением! И что бы добавить новую кассу нужно было перелопатить конфу в поисках строчек типа
Если Касса = Перечисление.Кассы.Касса1 Тогда ....
Вот это была жесть.
21 MMF
 
18.02.15
14:10
(15) в курсе, что могут существовать дубли номенклатуры? Не говоря о тупости искать по наименованию, имея готовую ссылку
22 Гёдза
 
18.02.15
14:10
(17) Это и есть поиск по ссылке, про что я говорил
НайтиЭлемент()
НайтиПоНаименованию()

по скорости не особая разница
23 Stim
 
18.02.15
14:11
Для каждого СтрокаТЧ Из МояТЧ.НайтиСтроки(Новый Структура("реквизит1", ЗначениеРеквизита1)) Цикл
            МояТЧ.Удалить(СтрокаТЧ)
        КонецЦикла;
24 Гёдза
 
18.02.15
14:11
(21) Этот код конечно ужас, но не ужас-ужас-ужас как в (0)
25 silent person
 
18.02.15
14:11
(0) ниче, мне вот в наследство досталась конфа. предыдущий прог не знал как в константу запихнуть группу из справочника, поэтому он запихнул в константу код группы и потом искал ее по коду.

а тут видимо чел не знал как НайтиЭлемент()
26 Kvant1C
 
18.02.15
14:11
27 Spyke
 
18.02.15
14:12
(17) Это хорошо, но это тоже не самое страшное, было бы оправдано, если бы с элемент потом записывался, а так там просто обращение к реквизиту.
и опять же какое

    Если СтрДлина(СокрЛП(Тов.Г))>0 Тогда
                Г=Тов.Г;
            Иначе
                Г="ДРУГОЕ";
            КонецЕсли;
28 Builder
 
18.02.15
14:13
(22) Разница в том что НайтиПоНаименованию() может найти не тот элемент, а элемент с таким же наименованием.
29 DimG
 
18.02.15
14:14
(28) А мож ему пофиг какой там элемент?
30 Karav
 
18.02.15
14:16
Меня вообще смущает такая конструкция:

Тов=СоздатьОбъект("Справочник.Номенклатура");
Товар=Строка(Док.Товар);
Тов.НайтиПоНаименованию(Товар,0,1);

Надо так делать:
Товар=Док.Товар.ПолучитьОбъект();
а все остальное - от Лукавого.
31 Builder
 
18.02.15
14:16
(29) А мне тем более :)
Ховнокода встречал немерянно.
Хотя, я думаю, по первости все такой писали :)
32 silent person
 
18.02.15
14:17
(30) нету такого метода ПолучитьОбъект();
33 Builder
 
18.02.15
14:17
(30) На 7.7 - Товар=Док.Товар.ПолучитьОбъект();
Это сильно!
34 Spyke
 
18.02.15
14:17
(28) Да разница в том что и его искать не надо

//было
Тов=СоздатьОбъект("Справочник.Номенклатура");
Док.ВыбратьДокументы(ВыбДата,ВыбДата);
Пока Док.ПолучитьДокумент()>0 Цикл
    Док.ВыбратьСтроки();
        Пока Док.ПолучитьСтроку()>0 Цикл
            Товар=Строка(Док.Товар);
            Тов.НайтиПоНаименованию(Товар,0,1);

  Если СтрДлина(СокрЛП(Тов.Г))>0 Тогда
                Г=Тов.Г;
            Иначе
                Г="ДРУГОЕ";
            КонецЕсли;
КОнецЦикла;


//Стало

Тов=СоздатьОбъект("Справочник.Номенклатура");

Док.ВыбратьДокументы(ВыбДата,ВыбДата);

Пока Док.ПолучитьДокумент()>0 Цикл
  
Док.ВыбратьСтроки();
    
    Пока Док.ПолучитьСтроку()>0 Цикл

        Док.Товар  
        


  Если Док.Товар.Г.Выбран() =1  Тогда
      
         Г=Тов.Г;
        
   Иначе
          
     Г="ДРУГОЕ";
        
   КонецЕсли;

КОнецЦикла;


КОнецЦикла;
35 Karav
 
18.02.15
14:18
(32) Ну и  выкинь свой конфигуратор.
36 DimG
 
18.02.15
14:18
(34) И что, работает?
37 Гёдза
 
18.02.15
14:19
а где прерывание цикла?
38 Karav
 
18.02.15
14:19
(33) Если у него молоток каменный, то я не виноват, что он крошится.
39 Mutniy2
 
18.02.15
14:19
(6) > примеры кода на 7.7, древнем как гуано мамонта - к чему это ?

Что-бы экспериментаторы новофилы понервничали.
40 Бовка
 
18.02.15
14:19
(0) неужели так накипело, что решил запостить?! Возьми БСП и пости сюда :)
41 Spyke
 
18.02.15
14:19
(36)
Если выкинуть
Док.Товар  
исправлял в блокноте
42 Бовка
 
18.02.15
14:20
+(40) а тем более 7.7. В ней столько этого добра было, особенно во франях с большой текучкой)
43 Адский плющ
 
18.02.15
14:21
Что не нравится в БСП? Примеры кода будут?
44 Бовка
 
18.02.15
14:21
(43) форум ляжет, примеры постить
45 Адский плющ
 
18.02.15
14:22
(44) Одного достаточно.
46 MaxS
 
18.02.15
14:23
Клиент серверная 1С. 1С сервер и SQL на разных компьютерах. 1С сервер спрашивает у гугля "где находится наш SQL?". А они физически стоят друг на друге. гугль отвечает "да вон там ищи...", 1С работает. Если интернета нет, 1С не видит SQL сервер, пользователи не могут войти в базу.
47 rsv
 
18.02.15
14:23
(0) А что в нем не так ?
48 Адский плющ
 
18.02.15
14:24
+(45) Ситуация с БСП скорее выглядит так:

Открыл -> Нихрена не понял -> "Гов*о!" -> Закрыл.
49 trad
 
18.02.15
14:24
откуда вы знаете, быть может там далее такой код

Док.Товар = Тов.ТекущийЭлемент();
КонецЦикла;
Док.Записать();
КонецЦикла;

Тогда в результате выполнения алгоритма, в документах ссылки на разные товары с одинаковым наименованием заменятся на одинаковую ссылку
50 rsv
 
18.02.15
14:24
+(47) Код написан в соответствии с ЖКК
51 rsv
 
18.02.15
14:25
Если этот код  плох - пусть вендор убираем методы обращения к объектам и курсоры и оставляет только Объект запрос.
52 Spyke
 
18.02.15
14:26
(49) Этот код для выгрузки в xls
53 rsv
 
18.02.15
14:27
(52) Пусть работает .... и читабельный и стабильный . Всегда и все могут разобраться в нем .
54 trad
 
18.02.15
14:29
(52) ну пусть и в ексел
Допустим, имеем товары с одинаковым наименованием, но с отличающимися другими реквизитами.
По условиям задачи необходимоЮ чтобы в екселе у товаров с одинаковым наименованием и другие реквизиты были гарантированно одинаковые
55 Гёдза
 
18.02.15
14:29
Рекомендую ТС начать принимать новопассит
56 Spyke
 
18.02.15
14:34
(53) А чем тебе этот не читабелен. И в чем была необходимость позиционировать объект?

Тов=СоздатьОбъект("Справочник.Номенклатура");
Док.ВыбратьДокументы(ВыбДата,ВыбДата);
Пока Док.ПолучитьДокумент()>0 Цикл
   Док.ВыбратьСтроки();
       Пока Док.ПолучитьСтроку()>0 Цикл  
          Если Док.Товар.Г.Выбран() =1  Тогда    
         Г=Док.Товар.Г;        
   Иначе        
     Г="ДРУГОЕ";      
КонецЕсли;
КОнецЦикла;
КОнецЦикла;
57 vhl
 
18.02.15
14:35
(0) работает - не трожь!
58 rsv
 
18.02.15
14:37
(56) Тоже хороший пример .  Все они похожи т.к. струтура одна . Проста и читабельна.
59 rsv
 
18.02.15
14:37
Я называю это Пока Выбрать Если :)
60 1Сергей
 
18.02.15
14:38
(58) это тот же код, но правильный
61 uno-group
 
18.02.15
14:39
(21) Вы уверены что автор хотел найти именно тот товар что забит в табличной части? Видел не раз когда бухи на создают куча товаров Товар1 по разным ценам пришел или еще с неведомой целью. а потом хотят гдето увидеть все товар1 собранные в 1 элемент. Данный код делает ссылку всех товаров с одинаковым наименование на 1 элемент справочника.
62 rsv
 
18.02.15
14:39
(60) Вот и я о том же . Чем проще код - быстрее ошибку найти .
63 uno-group
 
18.02.15
14:42
А может тупое копи пасте из обработки, что с оле базой работала и минимальное исправление для разовых вещей вполне допустимо
65 1Сергей
 
18.02.15
14:45
(62) нет, я не согласен с вами. Если элемент справочника ищется по наименованию, вместо того, чтобы обращаться к нему напрямую, то это не простой код. Это ошибка
66 Spyke
 
18.02.15
14:46
(61) Уверен
67 GreatOne
 
18.02.15
14:46
Самые страшные примеры кода - это наши собственные n времени назад
68 dmpl
 
18.02.15
14:47
(56) Как элегантно: Док - это выборка документов, и одновременно - сам документ. Нет, все-таки 1С деградирует: в 6-ке вообще можно было из пользовательского режима константы и прочие поля добавлять...
69 uno-group
 
18.02.15
14:55
(66)  Если Док.Товар.Г.Выбран() =1  Тогда  ели Г неопределенного вида, что скажет
70 Shamandafil
 
18.02.15
14:58
Процедура КнопкаСформироватьНажатие(Кнопка)
    таб=новый ТабличныйДокумент;
    Макет=ПолучитьМакет("МакетОтчета");
    Область=Макет.ПолучитьОбласть("Заголовок");
    таб.Вывести(Область);
    Работники=ПроцедурыУправленияПерсоналом.РаботникиОрганизацииНаДату(ДатаОтчета,Организация);
    для каждого Работник из Работники цикл
        Если Работник.Сотрудник.Актуальность Тогда
        Сотрудник=Работник.Сотрудник;
        ФизЛицо=Сотрудник.ФизЛицо;
        ВывестиСотрудника=истина;
        ДатаПриема=ПроцедурыУправленияПерсоналом.НайтиДатуПриема(Сотрудник,ДатаОтчета,Организация);
        если ДатаПриема<>Неопределено тогда
            если ДатаОтчета>=ДобавитьМесяц(ДатаПриема,6) тогда
                НачалоРабочегоГода=НачалоДня(ДатаПриема);
                пока истина цикл
                    отпуск=ПроцедурыУправленияПерсоналом.РасчетныйОтпускПоРабочемуГоду(НачалоРабочегоГода,Сотрудник,ДатаОтчета);
                    если отпуск.ДниОтпуска>1 тогда
                        ИспользованныйОтпуск=ПроцедурыУправленияПерсоналом.НайтиИспользованныйОтпускПоРабочемуГоду(НачалоРабочегоГода,Сотрудник);
                        если ИспользованныйОтпуск<>отпуск.ДниОтпуска тогда
                            ВывестиСтрокуОтпуска(Сотрудник,отпуск.НачалоРабочегоГода,отпуск.КонецРабочегоГода,отпуск.ДниОтпуска,ИспользованныйОтпуск);
                        конецесли;
                    иначе
                        если отпуск.Конец тогда
                            Прервать;
                        конецесли;
                    конецесли;
                    НачалоРабочегоГода=ДобавитьМесяц(НачалоРабочегоГода,12);
                    если НачалоРабочегоГода>ДатаОтчета тогда
                        Прервать;
                    конецесли;                    
                конеццикла;
                конецесли;    
            конецесли;                    
        конецесли;                    
    конеццикла;
    таб.Показать();
КонецПроцедуры
71 uno-group
 
18.02.15
14:58
Тогда уж ПустоеЗначение() юзать и  проверять что товар выбран. кстати товар точно справочник определенного вида сейчас и так ли это было когда этот код писался. В итоге может потребоваться еще 10 проверек на выдран тип значение вид значения и читабельность и скорость будет в разы хуже
72 rsv
 
18.02.15
14:59
(70) В отладчике хорошо ходить . читабельно и быстросопровождаемо .
73 kosts
 
18.02.15
15:02
(70) Могу придраться только к строке
если ДатаПриема<>Неопределено тогда

так как возможно надо сравнивать с пустой датой, а не с неопределено
74 Spyke
 
18.02.15
15:05
(69) Г - это рек спр Номенклатура с типом Справочник Г
75 Shamandafil
 
18.02.15
15:05
А к запросам в двойном цикле?
76 Spyke
 
18.02.15
15:09
(75) В двойном????
77 ilyavorobyev
 
18.02.15
15:10
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА КАК ЗначениеИстина
|ИЗ
| РегистрСведений.ДатыЗапретаИзменения КАК ДатыЗапретаИзменения";
НеИспользуется = Запрос.Выполнить().Пустой();

Возврат НеИспользуется;


может кто объяснит смысл этого кода?в erp функция
78 dmpl
 
18.02.15
15:12
(77) Дык все же понятно - если нет ни 1 строки в регистре - значит не используется.
79 ilyavorobyev
 
18.02.15
15:13
(78) блин, точно
80 ilyavorobyev
 
18.02.15
15:13
с этим ERP сознание расширять надо
81 Shamandafil
 
18.02.15
15:13
(76) 1. для каждого Работник из Работники цикл
2. пока истина цикл
И  внутри:
функция НайтиИспользованныйОтпускПоРабочемуГоду(ДатаНачалаРабочегоГода,Cотрудник,ВидОтпуска,ТаблицаОтпусков) Экспорт
    ИспользованныйОтпускПоРабочемуГоду=0;
    // Использованный отпуск по другим документам
    Запрос = Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
                 |    ОтпускаОрганизацийРаботникиОрганизации.ДатаНачала,
                 |    ОтпускаОрганизацийРаботникиОрганизации.ДатаОкончания
                 |ИЗ
                 |    Документ.ОтпускаОрганизаций.РаботникиОрганизации КАК ОтпускаОрганизацийРаботникиОрганизации
                 |ГДЕ
                 |    ОтпускаОрганизацийРаботникиОрганизации.Ссылка.Проведен
                 |    И ОтпускаОрганизацийРаботникиОрганизации.Сотрудник = &Сотрудник
                 |    И ОтпускаОрганизацийРаботникиОрганизации.РабочийГодС = &РабочийГодС
                 |    И ОтпускаОрганизацийРаботникиОрганизации.ПричинаОтсутствия = &ВидОтпуска";
...
82 rsv
 
18.02.15
15:25
(77) Использую всегда  Количество() .
83 rsv
 
18.02.15
15:25
+(82) При Топах 1
84 tridog
 
18.02.15
15:28
(0) Открываем БП3 -> Делаем Ctrl+Shift+F -> вводим "ПараметрыРаботыКлиентаПриЗапуске" -> Enter

Смотреть все, откуда это вызывается, и все, что вызывается из него.
85 IVT_2009
 
18.02.15
15:38
Пришлось перерабатывать свои поделки примерно 10летней давности. Там и не такое было. Но ... нужно было быстро и вчера - а как твои проблемы. Улыбало , когда после модернизации кода скорость расчета отчета возрастала в десятки раз.
Немного ставит на путь истинный программирование на языке отличном от 1с , например JAVA, когда недоработки просто не прокатывали.
86 Тюря
 
19.02.15
16:27
(0)Вроде в счет фактуре храниться наименования товара тип  текст
87 Тюря
 
19.02.15
16:29
88 Salimbek
 
24.02.15
12:17
(56) Порекомендую лишь заменить
"Если Док.Товар.Г.Выбран() =1"
на
"Если ПустоеЗначение(Док.Товар.Г) =0"
(источник)
V7 выбран() или пустоеЗначение()
Программист всегда исправляет последнюю ошибку.