bdd2

О важной разнице условий > и >=

Опубликовал Евгений Сивов (bird21) в раздел Сообщество - О жизни

О том, как важно иногда выбрать правильное условие, и к чему может привести выбор неправильного.

  Был обычный рабочий день, понедельник. Пришел я чуть позже обычного, около 9.
Вдруг звонит телефон и сервис-менеджер одного из сервисных подразделений говорит мне, что есть проблемы и в 1с возникает ошибка. Судя по контексту разговора ошибка какая-то некрасивая, программная. По ходу разговора выясняется, что ошибка возникает у многих пользователей этого сервисного подразделения (у нас их несколько, со своей спецификой). Прощаюсь с сервис-менеджером, где примерно смотреть уже понятно, обещаюсь перезвонить как разберусь.

Т.к. ошибка возникает у многих пользователей этого подразделения, то скорее всего она в отчете, который используют все пользователи этого подразделения и, который у них запускается автоматически при запуске 1с. В итоге в отладке нахожу документ из-за которого возникает ошибка в отчете. Проверяю документ открыванием, так и есть, возникает та же ошибка при открытии:

{Документ.ЗаявкаНаОбслуживаниеБанкоматов(446)}: Преобразование значения к типу Число не может быть выполнено

    ВычитаемоеВремя = ВычитаемоеВремя + ДлинаИнтервалаСтопКода;

Суть в том, что ДлинаИнтервалаСтопКода принимает значение "Неопределено", из-за чего возникает ошибка (при открытии документа и при формировании отчета).

В итоге, после анализа кода, причина оказывается в том, что при анализе временных интервалов в некоторых случаях не учтены значения равенства, а учтены только > и <. В случае если отрезок попадает во временной интервал до начала времени обслуживания с учетом равенства и в случае, если отрезок попадает во временной интервал после окончания времени обслуживания с учетом равенства. Первый случай как раз произошел, второй случай потенциально мог возникнуть.

Схема существует два года без месяца, оформлено 8728 заявок на обслуживание и такое в первый раз случилось! :)

Ну, собственно, причина того, что ошибка так долго не проявлялась состоит скорее всего в том, что в схеме особый акцент сделан на учет времени, оно учитывается до секунды. И в первый раз случилось так, что время, установленное инженером в событии (первоначально ставится автоматически, но потом можно изменить) совпало до секунды (9:00:00) со временем начала обслуживания по договору.

Мораль такова, что анализируя отрезки и периоды (скажем времени), всегда нужно помнить не только про больше и меньше, а также и про больше или равно и меньше или равно и учитывать это в алгоритмах.

См. также

Добавить вознаграждение
Комментарии
1. Куджо Колтовский (Cujoko) 3 19.09.14 16:37 Сейчас в теме
Честно говоря, никогда бы не подумал, что разница между «больше» и «больше или равно» настолько ощутима. Мне всегда казалось, что лишняя палочка в символе ≥ это сущий пустяк, не имеющий решающего значения. А вон оно как оказалось. Каждая, даже самая маленькая палочка может быть важна! Замечательная статья. Кстати, в ней есть и философский подтекст. Автор завуалированно, через описание рутинной рабочей ситуации обычного одинэсника, говорит, что детали важны, иногда критически важны для благоприятного исхода любого дела, будь то программирование, возведение атомных электростанций, строительство подводных лодок.
mr.Samuelson; help1Ckr; wondermaker; andogskiy; sergelemon; veretennikoff; wolfsoft; Патриот; +8 Ответить 1
2. Armando Armando (Armando) 1369 20.09.14 00:21 Сейчас в теме
Я вот недавно забыл переменную обнулить... Начну статью об этом писать.
AfroditaS; dj_serega; awk; dikd; ARL; help1Ckr; Dolly_EV; ShantinTD; dour-dead; wondermaker; nixel; Tavalik; sergelemon; scape; veretennikoff; wolfsoft; Патриот; hopter; Mi4man; Klash; kiros; Ёпрст; melenaspb; DERL; bashinsky; Upiterus; +26 Ответить 1
3. Дмитрий Башинский (bashinsky) 83 20.09.14 09:40 Сейчас в теме
Этому еще в школе учили 1 < 2 = иcтина, 1 < 1 = ложь, а 1 <=1 = истина
mr.Samuelson; ShantinTD; DrAku1a; +3 Ответить
4. Иван Титов (Ibrogim) 556 24.09.14 09:41 Сейчас в теме
(1) Cujoko,
Честно говоря, никогда бы не подумал, что разница между «больше» и «больше или равно» настолько ощутима.

У ахаха Никогда бы не подумал, что есть люди, которые никогда бы не подумали )))
Спасибо за минутку радости.
5. Александр Полтава (Патриот) 178 24.09.14 10:45 Сейчас в теме
Начну анализировать все конфы с которыми работаю на предмет наличия знака равно со знаками больше-меньше, а то не дай бог и у меня какая-нибудь ошибка вылезет. Но предупреждён значит вооружён! Спасибо (0) за это.
(2) тоже неплохую идею подкинул, в общем, надеюсь, на пару статей материала наковыряю в своих конфах ;)
А если серьёзно, то для таких статей модераторам ИС давно пора раздел Юмор выделить.
Serg_KSV; softcreator; andogskiy; +3 Ответить
6. Андрей Акулов (DrAku1a) 1182 24.09.14 13:52 Сейчас в теме
Народ, как статью минусануть?
awk; IgorS; +2 Ответить 1
7. Михаил Алексеевич (fokin) 24.09.14 14:11 Сейчас в теме
Из категории "из жизни" ?
по-моему таким "мелочам" на уроках школьной информатики учат
8. DAnry (DAnry) 3 24.09.14 20:20 Сейчас в теме
Что тут сказать, бывает... У меня тоже случай. Есть отчет, который рассчитывает доход от продаж, но при условии произведенной оплаты. В отчете есть реквизиты: Дата начала и Дата конца (Дата и время). То ли поленился, то ли не было времени, одним словом не приделал стандартный механизм выбора периода. Но представте все пользователи все делали правильно, т.е. в начальной дате оставляли время 00:00:00, в конечной - 23:59:59. Все кроме одного, ну конечно шефа фирмы! В результате у него при формировании отчета за месяц выпадал последний день. А так как большинство оплат проводилось как раз в последний день месяца, результат был соответственный.
9. Jurii (jmw) 59 01.10.14 12:19 Сейчас в теме
Эта ошибка получилась не из за того, что забыли поставить ≥ вместо >.
Это ошибка в разбитом условии.
Приведу пример:
...
Если Переменная < 0 Тогда
  НужныеДанные = 1;
КонецЕсли;
...
Если Переменная > 0 Тогда
  НужныеДанные = 2;
КонецЕсли;
...
...Показать Скрыть

И такая ошибка может произойти (даже если не вероятно, но всё равно может ;–).
Но обойти её можно было задав начальное значение НужныеДанные = 0; или перестроив условие:
...
Если Переменная < 0 Тогда
  НужныеДанные = 1;
Иначе // Переменная > 0
  НужныеДанные = 2;
КонецЕсли;
...
...Показать Скрыть

Если вы когда-нибудь обращались к службе поддержки 1С, то могли заметить, что они (на поддержке — не путать с решениями) всегда «обнуляют» переменные.
10. Анатолий Бычин (tolyan_ekb) 85 06.10.14 10:37 Сейчас в теме
(6) DrAku1a, идешь на форум. Поиск по форуму - забиваешь название статьи. Открываешь комментарии к статье и там уже можно нажать "-".
11. haz haz (hazd) 12.10.14 00:39 Сейчас в теме
статья улыбнула, я то подумал, что придумали что-то новое, я меня не предупредили))