UserFriendly-запрос диапазона дат.

15 3

"Вы все еще..." (С) мучаете пользователей стандартной формой диалога запроса диапазона дат, типа:

Как показала практика, мало кто помнит точные даты, например, создания документов. Пользователь помнит примерное время, например "Сегодня / Вчера / ... / На этой неделе / Недавно / В этом месяце, кажется / <Май> / Давно / ...". В данной форме скорее всего он заполнит даты с "запасом" + -. Даже если ищет он, к примеру, во вчерашнем дне, или на прошлой неделе, все-равно надо заполнить 2 даты. А можно одной кнопкой.

Или возможно, вы даже не спрашиваете их о параметрах поиска, что дает в результате пользователю огромный список объектов, который со временем только полнеет... Можно сократить список.

Будьте добрее к пользователям.

Посмотрите:

Такая форма намного более эргономична. Запрос произвольного диапазона в любом случае необходим, для этого предусмотрена кнопка "Другой...". Зато для поиска за полугодие достаточно нажать одну кнопку.

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

1. Заменить ту форму следующим кодом, или добавить его перед выполнением поиска:

Months = ArrayOf('Январь'; 'Февраль'; 'Март'; 'Апрель'; 'Май'; 'Июнь'; 'Июль'; 
                 'Август'; 'Сентябрь'; 'Октябрь'; 'Ноябрь'; 'Декабрь')
CountNeedMonths = 6  // ! небольше 12
ButtonsList = ''
ButtonOther = 'Другой ...'
while CountNeedMonths > 0
  AddButton = FormatDate('MM'; ChangeDate('M'; ToDay(); - CountNeedMonths-1))
  AddButton = UpperCase(Copy(AddButton; 1; 1)) & LowerCase(Copy(AddButton; 2; 10))
  if not Assigned(ButtonsList)
    ButtonsList = AddButton
  else
    ButtonsList = Format('%s|%s'; ArrayOf(AddButton; ButtonsList))
  endif
  CountNeedMonths = CountNeedMonths - 1   
endwhile
ButtonsList = Format('%s|%s'; ArrayOf(ButtonsList; ButtonOther)) 
PresButton = MessageBoxEx('Выбор периода создания документа'; 
        'Выберите период создания искомого документа'; 
        ; ButtonsList; ; ; ; cbsCommandLinks; ; 'Отмена'; )             
if PresButton <<>> 'НЕУДАЧА: ESC'
  Range = ''
  if PresButton == ButtonOther
    InpValue = InputDialog('*С|*По'; ; 'Дата|Дата'; 'Введите диапазон дат'; ; ; ; )
    Date1 = SubString(InpValue; '|'; 1)
    Date2 = SubString(InpValue; '|'; 2)
    Range = Format('(С %s ПО %s)'; ArrayOf(Date1; Date2))
  else
    CurrMonthNum = FormatDate('M'; ToDay())
    SelMonthNum  = IndexOf(Months; PresButton) + 1
    DeltaOfMonths = SelMonthNum - CurrMonthNum
    if DeltaOfMonths > 0
      DeltaOfMonths = -(12 - DeltaOfMonths)
    endif
    Date1 = BeginOfMonth(; ChangeDate('M'; ToDay(); DeltaOfMonths))
    Date2 = EndOfMonth(; ChangeDate('M'; ToDay(); DeltaOfMonths))
    Range = Format('(С %s ПО %s)'; ArrayOf(Date1; Date2))
  endif
endif  

2. В параметрах поиска по датам использовать переменную Range, например:

Search = Application.SearchFactory.CreateNew(ckEDocument)
Criteria = Search.SearchCriteria      
CurrentCriterion = Criteria.Add('ISBEDocKind')
CurrentCriterion.SetCompleteValue('<КОДЫ_ВЭДОВ_ЧЕРЕЗ_"ИЛИ">')      
CurrentCriterion = Criteria.Add('ISBEDocCreateDate')   
CurrentCriterion.SetCompleteValue(Range)   
Search.Show(ssmSelect; TRUE)
Отлично смотрится в доработке "Документы-приложения", когда пользователю предоставляется выбор не из всех документов, а только за указанный месяц.
15
Авторизуйтесь, чтобы оценить материал.
Алексей Долгих

В текущем варианте при выборе месяца период поиска устанавливается в этот месяц, если присваивать Date2 = ToDay(), то период будет с начала указанного месяца по текущую дату.
Различие: документы за март или с марта по сегодня.

Дмитрий Третьяков

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

Дмитрий Третьяков

Алексей, прошу прощения, а комментарии-то не редактируются surprise

Авторизуйтесь, чтобы написать комментарий