gifts2017

Сказка о "потерянном времени" или правила хорошего тона

Опубликовал Юрий Тимофеев (Tatitutu) в раздел Программирование - Практика программирования

Как "не потерять время" или корректно проверить Выбранный период

Добрый день , уважаемые коллеги !

Эта статья для начинающих великих программистов.
 

О ценности года спроси студента, завалившего сессию в конце года…
О ценности месяца, спроси у матери, родившей преждевременно…
О ценности недели спроси у издателя еженедельника…
О ценности часа спроси у влюбленных, нетерпеливо ожидающих свидания..
О ценности минуты спроси опоздавшего на поезд…
О ценности секунды спроси уцелевшего в аварии…


Поводом для написания статьи послужила большая кропотливая работа по проверке !!! тестовых заданий ...

Начну как всегда издалека.

На форму штатными средствами 1С можно вставить элемент управления "Выбор периода"

В модуле формы автоматически добавится код


Вроде все хорошо и можно дальше ваять....но мелочи скрыты в деталях

Если мы по кнопке "Выбор периода" зададим некоторый период и посчитаем разницу

Количество дней:               16
Количество часов:          4 079
Количество минут:       24 479
Количество секунд: 1 468 799

Пока все хорошо. Но если мы ВРУЧНУЮ изменим реквизит КОНПЕРИОД и повторим запрос

Количество дней:                16
Количество часов:          3 840
Количество минут:       23 040
Количество секунд: 1 382 400

Мы увидим, что потеряли почти (без одной секунды) целый день

Из-за чего это произошло???? Дело в том,что реквизит с типом значения "Дата" имеет три возможных состава даты: "Дата", "Время" и "Дата и время"

Изменим реквизвит -  Состав даты: Дата и время 

и заново повторим ввод

Теперь мы видим, что 17.06.2015  0:00:00  и  17.06.2015 23:59:59 сильно отличаются !

Иногда об этом забывают и получают недостоверную информацию.

Но это было предысловие.

Дальше те, кто наступил на эти грабли, начинают придумавать различные варианты (их очень великое множество, даже перечислять не буду)
на проверку КОРРЕКТНОСТИ выбора периода:

  • заполнены они или нет
  • правильно ли заполнены - может начало периода больше конца периода
  • рука дрогнула и пользователь ввел вместо 01.06.2015 - 01.06.1915


Простое предложение :

Сделать глобальную функцию 

//////////////////////////////////////////////////////////
// две даты
// видПериода  - по умолчанию 0 (день)
Функция ПроверкаПериода(ПерваяДата,ВтораяДата,ВидПериода=0)
    //преобразуем к концу дня
    ВтораяДата=КонецДня(ВтораяДата);
    Запрос = Новый Запрос;
    ТекстЗапроса = "ВЫБРАТЬ
    | РАЗНОСТЬДАТ(&Дата1, &Дата2, НужныйПериод) Как Период
    |";

    Если ВидПериода=0 тогда
        СтрПериод="День";
    ИначеЕсли ВидПериода=1 тогда
        СтрПериод="Час";
    ИначеЕсли ВидПериода=2 тогда
        СтрПериод="Минута";
    ИначеЕсли ВидПериода=3 тогда
        СтрПериод="Минута";
    КонецЕсли;

    ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"НужныйПериод",СтрПериод); 
    Запрос.Текст =ТекстЗапроса;

    Запрос.УстановитьПараметр("Дата1",ПерваяДата);
    Запрос.УстановитьПараметр("Дата2",ВтораяДата);
    Результат = Запрос.Выполнить().Выбрать();
    Если Результат.Следующий() Тогда 
        Возврат Результат.Период;
    КонецЕсли;

КонецФункции
//////////////////////////////////////////////////////////

и вызывать перед формированием отчета, обработки

КоличествоПериод=ПроверкаПериода(НачПериода,КонПериода);

и вот тут уже сравнивать

если КоличествоПериод < = 0 - неправильно выбран период

если КоличествоПериод > больше критичного значения (например больше 90 дней - выдавать предупреждение)

и.т.д.

Песенка не новая, но может кому-то облегчит жизнь и понимание процесса.

Всегда ваш, Tatitutu

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Алексей Роза (DoctorRoza) 26.06.15 14:08
О ценности года спроси студента, завалившего сессию в конце года…


"И проходящего срочную службу в ВС РФ" :)
2. Юрий Тимофеев (Tatitutu) 26.06.15 14:23
(1) DoctorRoza, это точно

Кстати в качество ОFF:
25.06.1995 я получил погоны лейтенанта - 20 лет выпуску !

Лишь 25 коротких лет
растил ГВВУТ тыловиков для Армии и Флота,
но не забудет выпускник - пусть даже генерал, как в Горьком
начинал с курсантской
роты!

Горьковское Высшее Военное Училище тыла имени Маршала Советского Союза И. Х. Баграмяна - 6 рота (1991-1994)
Вольский Филиал Военной Академии Тыла и Транспорта - 2 рота (1994-1995)

Сегодня будем встречаемся и будем отмечать !
DoctorRoza; +1 Ответить
3. Сергей Созинов (Созинов) 26.06.15 21:02
    Если ВидПериода=0 тогда
        СтрПериод="День";
    ИначеЕсли ВидПериода=0 тогда
        СтрПериод="Час";
    ИначеЕсли ВидПериода=0 тогда
        СтрПериод="Минута";
    ИначеЕсли ВидПериода=0 тогда
        СтрПериод="Минута";
    КонецЕсли;
...Показать Скрыть


Может я не понимаю код или это опечатка? ВидПериода=0
klinval; Tatitutu; +2 Ответить 1
4. Юрий Тимофеев (Tatitutu) 29.06.15 09:51
(3) Созинов, Да, спасибо - была опечатка.Поправил.
5. Василий Коровин (vasyak319) 29.06.15 10:05
Нет, запрос для проверки периода это слишком просто. Надо сделать внешнюю компоненту, которая по ssl туннелю будет связываться со специальным сервером, на котором надо будет запустить сервис, осуществляющий проверки периодов на все случаи жизни. Подробности см. в очередном выпуске ежемесячного журнала "Еженедельный ежедневник общества проктологов "Удаление гланд"".
6. Юрий Тимофеев (Tatitutu) 29.06.15 10:48
(5) vasyak319, ты крут ! ))) ,
но к сожалению уже слеп и без чувства юмора
в пятой строке статьи написано "Эта статья для начинающих..."
7. Василий Коровин (vasyak319) 29.06.15 10:54
(6) Tatitutu, если так, то эта статья не смешна, а вредна. Удали.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа