"Вы все еще..." (С) мучаете пользователей стандартной формой диалога запроса диапазона дат, типа:
Как показала практика, мало кто помнит точные даты, например, создания документов. Пользователь помнит примерное время, например "Сегодня / Вчера / ... / На этой неделе / Недавно / В этом месяце, кажется / <Май> / Давно / ...". В данной форме скорее всего он заполнит даты с "запасом" + -. Даже если ищет он, к примеру, во вчерашнем дне, или на прошлой неделе, все-равно надо заполнить 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)
Отлично смотрится в доработке "Документы-приложения", когда пользователю предоставляется выбор не из всех документов, а только за указанный месяц.
В текущем варианте при выборе месяца период поиска устанавливается в этот месяц, если присваивать Date2 = ToDay(), то период будет с начала указанного месяца по текущую дату.
Различие: документы за март или с марта по сегодня.
Андрей, спасибо за красивое решение, использовали в одном из типовых маршрутов, только не при выборе дат, а при выборе вариантов запуска типового маршрута
Алексей, прошу прощения, а комментарии-то не редактируются
Авторизуйтесь, чтобы написать комментарий