Ввод периода: хватит терроризировать пользователей

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

Предложения следующие:

Давайте обойдемся одним полем и приделаем к нему кнопку вызова календаря. Примерно так, как показано на рисунке
a44626753cce1d563eab1011d271d4be
И дадим пользователю максимальную свободу ввода. Правила простые (описание не формальное, зато, надеюсь, понятное):

  • Канонический формат ввода границ периода: дд/мм/гг… дд/мм/гг
  • Разрешается опускать некоторые параметры:
    • Отсутствие левой границы интерпретируется как все доступные данные до указанной даты
    • Если нет правой границы, то берутся данные от отмеченной даты по настоящий момент, либо без ограничения справа
  • Вместо двух точек можно использовать две запятые (актуально при смене раскладки клавиатуры)
  • Вместо разделителей день/месяц/год допускаем использование точки или тире
  • Для ввода квартала можно использовать комбинации: I, II, III, IV или i, ii, iii, iv, которые означают, соответственно, первый, второй, третий и четвертый кварталы
  • Если год опущен, то считаем, что речь идет о текущем годе
  • Если опущен месяц, аналогично считаем, что пользователь имел в виду текущий месяц
  • Если пропущен день, то трактовка зависит от того, введена пара термов или один. Если терм один (например, «10/2013»), то полагаем, что пользователю требуется полный месяц или год, если же период содержит пару термов (скажем, 5/2012..6/2012), то, в зависимости от того, закрывает рассматриваемая дата период или открывает, вставляем вместо пропущенной даты начало месяца (года) или конец месяца (года), соответственно
  • При вводе года 21 века можно опускать ноль после 2. Например: 213 это 2013 год
  • Неоднозначные варианты разрешаются в пользу более точного представления периода. Например:
    • 1/1 — первое января (не январь 2001)
    • 10 — десятое число текущего месяца (не октябрь и не 2010 год)

Приведу несколько примеров:

  • 1.2.07..29.3.07 С 1 февраля по 29-е марта 2007 года
  • ..4.07 По апрель 2007 года включительно
  • 4.98 Весь апрель 1998 года
  • 1.207..5.207 С января по май 2007 года
  • 1.2007… С января 2007 года по настоящий момент
  • ..23.4 По 23 апреля текущего года
  • ..23 По 23 число текущего месяца текущего года
  • 12 двенадцатое число текущего месяца
  • 12… с двенадцатого числа текущего месяца до последнего введенного значения
  • I..II С первого по второй квартал текущего года включительно
  • IV Только четвертый квартал текущего года
  • iv/2006..ii/07 С четвертого квартала 2006 года по второй квартал 2007 включительно
Осталось рассмотреть визуальный выбор периода

7d75a7cf51addc93125a129f8affa18a

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

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

e082d5dca51ec8f5d66bbb4f60add4ef

На этом рисунке тот же самый календарь демонстрирует быстрый выбор по одному из часто используемых случаев:

  • Сегодня
  • Вчера
  • Последние 7 дней
  • Прошлая неделя
  • Прошлая рабочая неделя
  • Текущий месяц
  • Прошедший месяц

Три кнопки внизу справа позволяют, соответственно, открыть относительно выбранной даты период слева (..5/11/2013), выбрать пустой период, открыть относительно выбранной даты период слева (1/11/2013..).

Описанная техника работает с 1996 года в системе Papyrus компании Петроглиф и неизменно радует пользователей.

PS. Пока писал свой опус пришел к выводу, что быстрый выбор периода по одному из перечисленных в последнем списке вариантов следует вызывать по нажатию клавиши «вниз», когда фокус ввода находится в поле периода — так и сделаем в ближайшее время.