Добрый день, уважаемые коллеги !
Эта статья для начинающих великих программистов.
О ценности года спроси студента, завалившего сессию в конце года…
О ценности месяца, спроси у матери, родившей преждевременно…
О ценности недели спроси у издателя еженедельника…
О ценности часа спроси у влюбленных, нетерпеливо ожидающих свидания..
О ценности минуты спроси опоздавшего на поезд…
О ценности секунды спроси уцелевшего в аварии…
Поводом для написания статьи послужила большая кропотливая работа по проверке !!! тестовых заданий ...
Начну как всегда издалека.
На форму штатными средствами 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