Имя: Пароль:
1C
1C 7.7
v7: Загадочный код
,
0 ildary
 
12.07.11
15:19
Встретил такое, ковыряя чей-то самодельный отчет:

Покупатели.ДатаОплаты = Дата( '01.01.01' );

хочется узнать - это такой индусский код или в данной строчке есть скрытый смысл, не упомянутый в ЖКК?
1 ДенисЧ
 
12.07.11
15:20
индусский
2 Tatitutu
 
12.07.11
15:21
для таких покупателей, который что-то купили первого января в в начале года - автоматическия скидка 99% (см. правила Торговли)
3 Patrio_
O_Muerte
 
12.07.11
15:24
(1)неправильно, правильно говорить индуисцкий
4 ildary
 
12.07.11
15:25
(2) я про избыточную типизацию.Я молчу про общую некрасивость кода - мало кто этим заморачивается, но когда встречаю такое как (0) или вот примерно такое:

Если (Найти(Покупатели.Док.Вид(),"Реализация") <> 0) Тогда
   
  Отсрочка = Покупатели.Контрагент.Отсрочка;
   
  Если Найти(Покупатели.Док.Вид(),"Реализация") <> 0 Тогда
       
     ...
       
  КонецЕсли;
   
КонецЕсли;

я начинаю протирать глаза и думать, что что-то в жизни упустил.
5 Эльниньо
 
12.07.11
15:26
Это вообще индейский
6 Denp
 
12.07.11
15:26
(4) автора кода по жизни постоянно обманывали, вот он и перестраховывается
7 filh
 
12.07.11
15:26
а=а-а*2
8 Эльниньо
 
12.07.11
15:27
(4) Будешь протирать пока сам не напорешься на сюрпризы движка 7.7.
9 ildary
 
12.07.11
15:32
(8) например? Как может вид документа измениться в течении 2 строк? Я не спорю, что в 1С хватает неизведанного, но код, который я привел - тяжело сопровождать. Автор этого дела теперь недоступен и мне проще переписать отчет, чем пытаться понять все его завихрения.

p.s. Вот еще образец:
Покупатели.Отгрузка = (-1)*Покупатели.КонДолг;

думаю причина в том, что автор этого отчета - ваятель сайтов, выполнявший работу 1Сника по принципу "вчера полы мыл, сегодня за консоль посадили", возможно подобные кодобреды вызваны особенностью языков php и т.п.
10 dmpl
 
12.07.11
15:32
(4) За время проверки

Отсрочка = Покупатели.Контрагент.Отсрочка;

кто-то может изменить Покупатели ;)
11 andrewks
 
12.07.11
15:34
(0) ты код в ЗиК не изучал?
12 Ёпрст
 
12.07.11
15:37
(4) поешь чернички, есть еще РеализацияРозница и РеализацияПрочее , которое попадает под это условие и ты действительно "что-то в жизни упустил"
13 Эльниньо
 
12.07.11
15:37
(9) Не помню в каком релизе код:

   Болтов = 0;
   Для х = 1 По 10000 Цикл
       Если 1 = 1  Тогда
       Иначе
           Болтов = Болтов + 1;
       КонецЕсли;
   КонецЦикла;

Выдавал 6 болтов
14 Denp
 
12.07.11
15:39
(12) это подпадает только под одно условия из кода?) или все же под оба?
15 ildary
 
12.07.11
15:39
(11) всегда отказывался ковырять ЗиК, спасибо добрым людям из ru.1csoft, что в свое время успели рассказать, какая там унутре жуть.

(12) Уважаемый Ёпрст3, я не против проверки через Найти(Вид()), я против вложенной двойной проверки.
16 Ёпрст
 
12.07.11
15:40
(14) я ниже код не смотрел, речь в (0) же была про "излишнюю типизацию"..
да и, это же не весь код.
17 Ёпрст
 
12.07.11
15:40
(15) я думал, ты против Найти в коде
:))
18 dmpl
 
12.07.11
15:40
(0) Это просто значение по умолчанию. С тем же успехом он мог взять 4.07.1776, но 01.01.01 набирать проще. Скорее всего, автор отчета писал и на отличных от 1С языках программирования, в которых неинициализированная переменная может иметь любое случайное значение.
19 Жан Пердежон
 
12.07.11
15:43
8.2 во всех типовых:
20 Nordok
 
12.07.11
15:43
(4) И ты обязательно хочешь нам рассказать об этом, нечего, мы уже привыкли, по традиции каждый сезон приходят новички, которые удивляются всякой куйне и постят её с оттенками борьбы за чистоту кода.
21 Жан Пердежон
 
12.07.11
15:43
+(19)
Функция ОтделитьРазделителем(Стр, Знач Разделитель, Режим=0) Экспорт
   ПраваяЧасть         = "";
   ПозРазделителя      = Найти(Стр, Разделитель);
   ДлинаРазделителя    = СтрДлина(Разделитель);
   Если ПозРазделителя > 0 Тогда
       ПраваяЧасть     = Сред(Стр, ПозРазделителя + ?(Режим=2, 0, ДлинаРазделителя));
       Стр          = СокрЛП(Лев(Стр, ПозРазделителя - ?(Режим=1, -ДлинаРазделителя + 1, 1)));
   КонецЕсли;
   Возврат(ПраваяЧасть);
КонецФункции // ОтделитьРазделителем()


и код:

Пока Истина Цикл
   ТекущееПоле = ОтделитьРазделителем(СтрокаПоиска, ",");    
   Если ПустаяСтрока(ТекущееПоле) Тогда
       Прервать;
   КонецЕсли;
   СтрокаТаблицы.ПоляПоискаТЧ.Добавить(СокрЛП(ТекущееПоле));
КонецЦикла;
22 ildary
 
12.07.11
15:44
(20) эээ, а что, нельзя?
23 hhhh
 
12.07.11
15:45
а чего я тоже всегда перестраховывался, писал

Если КоличествоСтрок() <= 0
24 ildary
 
12.07.11
15:46
(18) что плох вариант в (0) сделать

Покупатели.ДатаОплаты = '01.01.01';

к чему лишняя типизация?
25 Nordok
 
12.07.11
15:46
(22) Да кто запрещает, просто первый раз было забавно, лет 8 назад, щас уже не то, нету радости :)
26 ildary
 
12.07.11
15:47
(25) мне не до забавы, я просил помощи зала :)
27 dmpl
 
12.07.11
15:48
(24) Найди на русской раскладке апостроф.
28 andrewks
 
12.07.11
15:49
(24) это не самая хренастая хрень, которую можно встретить в коде.
даже скажу так - это почти не хрень.
29 ildary
 
12.07.11
15:51
(27) зачем искать? за меня телепат ищет, хвала его создателям.
30 Jstunner
 
12.07.11
15:52
обычно, борцы за идеальный код за всю жизнь не написали и тысячи строк
31 dmpl
 
12.07.11
15:55
(29) Ну и где он нашел? ;)
32 ildary
 
12.07.11
15:57
(30) я борец за идеальный код, пишу длинючие обработки, которые даже работают. ЧЯДНТ?

(31) на клавише 'э', а где же еще? :)
33 _Atilla
 
12.07.11
15:58
(13) Еще один пример

Если СтрДлина(Строка(i)) = 1 Тогда
34 Jstunner
 
12.07.11
15:58
(32) выложи куда нибудь примерчик, глянем на твой идеальный код
35 Ткачев
 
12.07.11
16:01
Из новой Розницы, обработка для ТСД, они вообще проверяют то что делают ?
...
  Наименование = Строка(Номенклатура);
...
  ОбработатьКод(Наименование, ...);
...
Процедура ОбработатьКод(Номенклатура, ...);
...
  Наименование = СокрЛП(Номенклатура);
  Код = Номенклатура.Код
  Артикул = Номенклатура.Артикул;
...
КонецПроцедуры
36 dmpl
 
12.07.11
16:02
(32) На клавише э в русской раскладке находится буква э. И когда человек жмет на эту клавишу - он ожидает, что получит букву э.
37 ildary
 
12.07.11
16:03
(34) могу выложить только тому форумчанину, которого хорошо знаю, незнакомому - извини, не могу. Если очень хочется увидеть - вечером могу пустить через тимвьювер.

(36) мои слова про телепат не были услышаны?
38 Жан Пердежон
 
12.07.11
16:04
(35) тут всё очевидно,
в (21) уже загадочнее)
39 ZDenis
 
12.07.11
16:05
(33) так ведь не всегда будут 1 или в чем прикол?
40 ildary
 
12.07.11
16:07
(39) могли считать количество разрядов, не?
41 Nordok
 
12.07.11
16:08
(37) Правильно, код это как Имя, постоянно связано с душой программиста, через код могут порчу навести.
42 Jstunner
 
12.07.11
16:09
(37) мне, по большому счету, твой код не интересен. Но я уверен, что если бы ты написал более менее много кода, то строчка:

Покупатели.ДатаОплаты = Дата( '01.01.01' );


не вызвала бы у тебя хоть сколь нибудь негатива. Хотя бы потому, что она лучше читается.
43 ZDenis
 
12.07.11
16:09
(40) Каким образом?
44 ildary
 
12.07.11
16:18
(43)

до 10 = 1
до 100 = 2
и так далее, правда только для целых чисел.

(42) поздравляю с принятием индусской веры. чем меньше лишнего - тем читабельнее.
45 dmpl
 
12.07.11
16:18
(37) Правильные программисты не пользуются всякими тупыми программами. Это не она, случаем, заменила кавычки на апострофы?

(43) 1 будет только при целом положительном числе от 0 до 9 (если i имеет тип число).
46 ildary
 
12.07.11
16:19
(45) орефкову это в лицо скажи, умник.
47 ZDenis
 
12.07.11
16:20
(45) я это еще в (39) написал
(44) так чем плох код то?
48 ildary
 
12.07.11
16:22
(47) чем плох - понятия не имею, пост (33) не мой.
49 palpetrovich
 
12.07.11
16:24
(13) не верю! :)
50 ildary
 
12.07.11
16:24
(49) простите меня, но не могу удержаться, вот еще нашел в том же отчете:

СписДок = СоздатьОбъект("СписокЗначений");
СписДок.УдалитьВсе();

а че, работает ведь, ага?
51 wladimir90
 
12.07.11
16:25
(0) Индрусский.
52 dmpl
 
12.07.11
16:25
(44) Опыта вам не хватает. Хорошие программисты явно указывают тип для того, чтобы быть уверенными в типе и не искать его где-то далеко. А на C/C++ указывают не только тип, но и для всех константных (в данном контексте) переменных добавляют const.

(46) О, обиделся :) Так что там - точно в коде апострофы стоят, или кавычки, все же?
53 Jstunner
 
12.07.11
16:27
(50) мне вот одно не ясно. Отчет не работает? Или работает медленно? Или выводит ошибочные данные? Да и чего ты в него полез-то ковыряться?
54 ildary
 
12.07.11
16:32
(44) в С++ - согласен, не хватает, но мы вроде не на сях пишем. А обидно мне за авторов очень хорошей программы, которую ругает тот, кто ее даже не пробовал.

(53) все работает, только надо доделывать, а для этого сначала разобраться, как он работает.
55 ildary
 
12.07.11
16:35
(53) v8: Потестите помогалку
вот ветка про развитие программы, почитай как там народ ждет версию для восьмерки
56 dmpl
 
12.07.11
16:37
(54) А тот, кто пишет на нескольких языках программирования стремится унифицировать приемы написания кода. И это правильно - уже из одной этой строчки видно тип при беглом взгляде, тогда как без Дата() - только приглядевшись.
57 Сигизмунд Прокофьеви
 
12.07.11
16:40
а есть конвертер идеального кода в сантиметры?
58 palpetrovich
 
12.07.11
16:40
(50)
СписДок.УдалитьВсе(); - это, скорее всего, артефакт от того кода, с которого делался копи/паст, когда СписДок - был на форме
59 Jstunner
 
12.07.11
16:58
(57) на счет этого - не знаю. Но знаю, что конвертера идеального кода в бонусы и премии точно нет. Почему-то не волнует никого наличие/отсутствие явного приведения.
60 Torquader
 
12.07.11
17:27
Просто не все специалисты знают, что в 1С в одинарных кавычках пишется только константа даты.
Например, в JavaScript в одинарных кавычках пишется строка, также как и в двойных - автор кода просто мог об этом забыть.
Кроме того, изначально могло быть, что там писалась какая-то другая константа или переменная, а потом автозамена превратила её в "такую интересную конструкцию".
Применение автоматической замены к любому коду не только усложняет его читабельность, но и может приводить к нарушению его выполнения.
61 ZOMI
 
12.07.11
17:34
(0) Ошибками кода можно по существу считать  лишь приводящие к  существенному падению производительности или неверным результатам.А так это напоминает студентов на лекции ждущих
опечатки препода , чтоб его поправить и потешить свое сами знаете что .
62 Torquader
 
12.07.11
17:40
(61) Если такая "инициализация" в цикле отчёта по нескольким тысячам строк, то на производительности сказаться может - какими-то долями процента.
P.S. понятно, что параметры принято выносить в начальную часть процедуры.
63 Nordok
 
12.07.11
17:48
(62) А если бы у бабки *** был, то она была бы дедкой.
64 Hans
 
12.07.11
17:55
(0) что тут собственно не то?
65 andrewks
 
12.07.11
19:03
(63) окромя народного фольклора, сказать больше нечего? хватит флудить
67 Nordok
 
13.07.11
10:41
(65) Сказать "хватит флудить", при этом нафлудив, это зачёт. Да, кроме флуда, в ветке для флуда, мне нечего сказать кроме флуда, как и вам, все сходится.