Условный оператор

  1. 3 г. назад
    21.04.2020 17:01:04 отредактировано КитайскийМуй

    Некоторое время назад обсуждали, так вот, ошибка возникла:

    {Документ.НалоговаяНакладная.МодульОбъекта(4351)}: Преобразование значения к типу Булево не может быть выполнено
    Если СообщатьОбОшибках Тогда

    При таком написании ошибка не возникает:

    Если СообщатьОбОшибках = Истина Тогда

    Ответы: (7) (8) (12) (15)
  2. В отладчике что кажет?

    Ответы: (2) (26)
  3. (1) Спор был о написании, я сказал, что опытный 1Сник обязательно напишет:

    "Если Фигня = Истина Тогда", а не "Если Фигня Тогда"...

    Ответы: (26)
  4. Я обычно так и стараюсь делать

  5. А маслаков со здой и циветой начали кричать, что я ничего не понимаю...

  6. Вот я как только наткнулся на такую ошибку - привёл пример как и просили. Конфа типовая.

  7. мне тоже один раз сказали, что это нелепо

  8. (0) Одинэсина не является строго типизированной. Так что либо явно приводи к булеву, либо делай это как то неявно

    Ответы: (13)
  9. 21.04.2020 17:19:18 отредактировано sda553

    Т.е. лучше пиши вариант

    КитайскийМуй Если СообщатьОбОшибках = Истина

    Чем
    Просто

    КитайскийМуй Если СообщатьОбОшибках Тогда

    Так код безопаснее

  10. Особо опытные пишут
    Если ДокументОбъект.Проведен = Истина

    Ответы: (10)
  11. (9) я плохо помню 1с, но вроде бы Проведн является полем строгого типа

    Ответы: (14)
  12. Вот, нашёл ту ветку:

    http://forum330.com/forum/6630/?search=опытный

  13. Ошибка в коде. Использование не инициализированной переменной скорее всего. Лучше получить явную и понятную ошибку как в (0) чем пустить дальше исполнение заведомо бажного кода и получить косяк где-нибудь дальше. Например, код должен был ругнуться на ошибку. При использовании конструкции

    Если СообщатьОбОшибках = Истина Тогда

    в нашем случае вывод сообщения об ошибке будет подавлен. Юзер не узнает, что произошла ошибка и будет считать неверный результат расчета правильным.

    Ответы: (16) (19) (21)
  14. sda553 Одинэсина не является строго типизированной

    Может, ты хотел сказать, что 1с не является языком со статической типизацией?

  15. (10) вот и я о том же

  16. (0) Кстати, озвучь релиз и место, в котором такое получилось. Страна должна знать своих героев.

  17. (12) юзер и не должен получить сообщение об ошибке, это при попытке открыть НН когда в её ТЧ нет ни одной строки.

    Ответы: (17) (18) (19)
  18. (16) так в чом косяк?

    Ответы: (22)
  19. (16) юзер не должен получить сообщение об ошибке при условии, что разработчик написал годный код, устойчивый к входным данным
    в данном случае мы видим, что это не так, поэтому юзер должен получить сообщение и пнуть им в разработчика

  20. (16) Что такое НН и какой все таки релиз?

    Даже если в данном случае юзер и не должен видеть ошибку, в общем случае такой стиль опасен. Почему написано в (12). Учетная программа вываливающая ошибки на ровном месте это плохо, но учетная программа прячущая ошибки еще хуже.

    Ответы: (20) (23)
  21. 21.04.2020 18:21:46 отредактировано jsmith82

    ТеньД Что такое НН

    Налоговая накладная
    Бухгалтерия для Украины по ходу

  22. (17) косяк в том. что документ не открывается

    Ответы: (25) (46)
  23. 21.04.2020 18:50:31 отредактировано КитайскийМуй

    (19) ошибки-то в документе нету, ошибкой является - сообщение об ошибке, оно не должно возникать в данной ситуации.

  24. Муй в своём репертуаре

  25. (22) чето я сомневаюсь что та конфигурация - полностью типовая

    Ответы: (46)
  26. 21.04.2020 21:28:02 отредактировано webdev

    КитайскийМуй (1) Спор был о написании, я сказал, что опытный 1Сник обязательно напишет:

    "Если Фигня = Истина Тогда", а не "Если Фигня Тогда"...

    Кроме случаев когда там точно булево:

    Пусть isФигня = Фигня == Истина;
    Если isФигня Тогда
  27. Остается вопрос, почему у тебя в булевой переменной "СообщатьОбОшибках" записано не булево значение. Это уже косяк где-то выше.

    Ответы: (28) (45)
  28. webdev почему у тебя в булевой переменной "СообщатьОбОшибках"

    в 1с нет понятия "булева переменная"
    может быть строго типизированный булев реквизит, но не переменная.
    одна и та же переменная может сейчас быть булева, а через секунду строкой. а за миг до этого быть Неопределено

    Ответы: (29) (30) (31)
  29. andrewks в 1с нет понятия "булева переменная"
    может быть строго типизированный булев реквизит, но не переменная.
    одна и та же переменная может сейчас быть булева, а через секунду строкой. а за миг до этого быть Неопределено

    Вообще-то есть. Если ты назвал переменную "СообщатьОбОшибках", то это точно должно быть булево, а не строковое значение или какой-то счетчик. Строковая переменная будет иметь такое имя: "СообщениеОбОшибках", а числовая: "КоличествоСообщенийОбОшибках".

    Ответы: (33)
  30. andrewks одна и та же переменная может сейчас быть булева, а через секунду строкой

    Ни в коем случае. Это дичайший говнокод.

    Ответы: (31) (32)
  31. (30) ты точно понимаешь суть словосочетания

    andrewks может быть

    ?

    Ответы: (32)
  32. andrewks (30) ты точно понимаешь суть словосочетания
    ?

    Ты наверное не понял о чем я тебе толкую. Ну ладно.

    Ответы: (34)
  33. webdev Если ты назвал переменную "СообщатьОбОшибках", то это точно должно быть булево

    схреналь? я вполне могу там разместить массив, состоящий из кодов ошибок, о которых надо сообщать

    Ответы: (35) (37) (52)
  34. webdev Ты наверное не понял о чем я тебе толкую.

    да куда уж мне. я ж не программист, а дворник. так, мимо проходил

  35. andrewks схреналь? я вполне могу там разместить массив, состоящий из кодов ошибок, о которых надо сообщать

    Тогда я бы тебя не взял в свою команду.

    Ответы: (36)
  36. (35) не набиваюсь

  37. 21.04.2020 21:40:20 отредактировано webdev

    andrewks разместить массив, состоящий из кодов ошибок

    Почувствуй разницу:

    СообщатьОбОшибках

    и

    КодыОшибок
    Ответы: (38)
  38. (37) я чувствую разницу. а вот ты не почувствовал разницу.
    ибо должен был назвать не КодыСообщенийОбОшибках , а КодыОшибокОКоторыхНадоСообщать

  39. Пытаешься выкрутиться. Ну хорошо что хоть понял свою ошибку.

    Ответы: (40)
  40. webdev Пытаешься выкрутиться.

    тебе показалось

    webdev Ну хорошо что хоть понял свою ошибку.

    ничего я не понял

    Ответы: (43)
  41. Что то в последнее время программисты стали частенько спорить о том, с какой стороны разбивать варёное яйцо

    Ответы: (42) (44)
  42. (41) скучно

  43. andrewks ничего я не понял

    :)))

  44. sda553 Что то в последнее время программисты стали частенько спорить о том, с какой стороны разбивать варёное яйцо

    Острым концом нужно бить об острый. А тупым об тупой. Если бить об голову andrewks, то тупым концом.

  45. (27) это не у меня, а у писателей типовой

    И Эндрю прав, а ты выглядишь глупо

    Ответы: (52)
  46. MIK (22) чето я сомневаюсь что та конфигурация - полностью типовая

    +1 Муй слишком старательно игнорирует вопрос про релиз. Конфигурасты на Дмитровке способны на многое, но чтобы в типовой тупо не открывалась форма нового документа, это уже слишком. Такого я не припомню.

    Ответы: (47)
  47. (46)

    ТеньД Конфигурасты на Дмитровке способны на многое, но чтобы в типовой тупо не открывалась форма нового документа, это уже слишком.

    Не нового, а сохранённого, у которого в ТЧ нет ни одной строчки.

    Ответы: (48)
  48. (47) Релиз напиши. Если забыл как сделать, напоминаю. Меню "Помощь" - "О программе".

  49. "Управление производственным предприятием для Украины", редакция 1.3
    Разработка конфигурации: "ABBYY Ukraine", 2005-2017
    1.3.50.1

  50. MIK можешь глянуть что там?

  51. Не могу я глянуть, какой-та древний релиз

    Ответы: (70)
  52. КитайскийМуй И Эндрю прав, а ты выглядишь глупо

    Ты считаешь что так правильно делать?

    andrewks я вполне могу там разместить массив, состоящий из кодов ошибок, о которых надо сообщать

    Ответы: (54)
  53. о чём спор?

    Ответы: (55)
  54. (52) Конечно правильно, почему нет.

  55. jsmith82 о чём спор?

    andrewks хочет в переменную "СообщатьОбОшибках" записать массив кодов. Я считаю что это говнокод, и ему нужно по рукам надавать линейкой.

  56. Типа, если переменная названа как Булево, то в ней и нужно хранить Булево, а не числа или массивы всякие.
    Хочешь сохранить массив кодов, так и назови свою переменную: "КодыЧеготоТам..."

    Ответы: (57) (58)
  57. (56) Это феерично... с чего ты решил что имя переменной определяет её собственный тип этой самой переменной??? Это в какой вселенной?...

    Ответы: (58) (61) (78)
  58. КитайскийМуй (56) Это феерично... с чего ты решил что имя переменной определяет её собственный тип этой самой переменной??? Это в какой вселенной?...

    Еще один говнокодер. Но с тобой и раньше было все понятно, тут нечему удивляться.

  59. ну йобушкин всемирный насос

  60. вообще, насколько я помню, ошибка преобразования к Булево довольно часто встречается в типовых

  61. (57) вообще то прнято, чтобы тип переменной определял название переменной. Соответственно по названию был бы очевиден тип.
    bool isValid;
    int headNum;
    int[] headNumArray;

    Ответы: (62) (78)
  62. sda553 вообще то прнято

    кем и где принято?

    sda553 isValid

    а почему не bIsValid?

    sda553 headNum

    а почему не iHeadNum?

    sda553 headNumArray

    а почему не aHeadNum? или не headNums?

    правила именования - вещь многообразная, в каждом проекте, и даже в каждом ЯП могут быть свои правила и особенности.
    не нужно их экстраполировать на всех и вся

  63. 23.04.2020 06:41:01 отредактировано jsmith82

    Чёто вы в какую-то иную степь ударились. вопрос в том, следует ли в типовых писать = Истина / Ложь.

    Ответы: (65)
  64. Приведения типов в 1с нет. Поэтому ошибки могут спокойно валиться при попытках преобразования значений из результатов запроса типа Null или Неопределено, ну и при неинициализации (Неопределено) и прочих косяках разработчиков.

  65. (63) на ассемблере пиши. там все просто, только единицы и нули...

    Ответы: (66)
  66. Guk только единицы и нули...

    нет

    Ответы: (67)
  67. (66) ну есть пара тройка команд...

  68. в ассемблере тоже есть переменные. их тоже надо как-то именовать. давайте поговорим об этом

  69. я обычно именую переменные с большой буквы, ставлю пробелы вокруг операторов, фигурные скобки переношу на следующую строку

  70. MIK Не могу я глянуть, какой-та древний релиз

    Сильно древний релиз? Тогда я вижу ситуацию так: крайне сомнительно, что муй сидел на багованом релизе все это время и терпел. Это какой-то совсем нездоровый мазохизм получается. Скорее всего баг появился усилиями самого муя или его коллег в процессе допилки конфы под заказчика.

    Но виноваты разумеется все равно разрабы типовых. За то, что пишут код так, что не удается спрятать под капот косяки конфигурастов-улучшателей.

  71. Может Муй просто не слышал про такую штуку как расщирения?

    Ответы: (73)
  72. Там стока ошибок, что божешьмой-божешьмой...

    http://downloads.v8.1c.eu/content//EnterpriseUkr/1_3_56_2/ErrEnterpriseUkr_1_3_56_2.htm

  73. УПП - мертвое направление для 1с. Хочешь Светлого Будущего - переходи на ЕРП. Не хочешь переходить? Правь косяки самостоятельно. Как правильно замечено в (71) используй расширения.

  74. Муй, ты разобрался в ошибке?

    Ответы: (75)
  75. (74) Сразу же, меньше чем за минуту.

    Ответы: (76)
  76. (75) и в чём дело?

    Ответы: (77) (84)
  77. (76) эй! английский размовляешь?

  78. sda553 (57) вообще то прнято, чтобы тип переменной определял название переменной. Соответственно по названию был бы очевиден тип.
    bool isValid;
    int headNum;
    int[] headNumArray;

    Верно, но только название типа писать в имени переменной - не очень красиво.
    Лучше вместо:

    int[] headNumArray;

    Написать во множественном числе по-человечески:

    int[] headNums;
  79. 23.04.2020 19:30:14 отредактировано sda553

    Тогда не понятно будет, сет это эррэй, или может вообще какая нибудь кьюа или стэк. Понятно что коллекция какая то и не боле

    Ответы: (80) (85)
  80. sda553 Тогда не понятно будет, сет это эррэй, или может вообще какая нибудь кьюа или стэк. Понятно что коллекция какая то и не боле

    Современная IDE подскажет. Уже нет необходимости писать что это. Зато красиво получится.

  81. К тому же иногда бывает, что я определяю, к примеру тип
    typedef int* HeadNums;
    //Потом объявляю переменную этого типа
    HeadNums nu_i_kak_mne_teper_peremennuyu_nazvat;//?

    Ответы: (82)
  82. sda553 К тому же иногда бывает, что я определяю, к примеру тип
    typedef int* HeadNums;
    //Потом объявляю переменную этого типа
    HeadNums nu_i_kak_mne_teper_peremennuyu_nazvat;//?

    Странное название для типа. Но переменную нужно называть по смыслу, что она обозначает.

  83. я стараюсь избегать всяких префиксов и постфиксов, обозначающих типы

  84. (76) Просто выполнил своё обещание - как только встречу такой случай - сообщу. Вот и сообщил.

  85. sda553 Понятно что коллекция какая то и не боле

    так и не надо боле, вполне достаточно

  86. вот наименование типа полюбас лучше обозначить префиксом или суффиксом, чтобы явно было видно, что это именно тип

  87. ну если только по-человечески назвать: ListOf.., а не lst.. или al..

  88. а почему не tNums, или не NumsType?

или зарегистрируйтесь чтобы ответить!