gifts2017

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Внимание! У вас нет прав на просмотр топика