// Пример: РазницаМеждуДатами(Дата(1991, 08, 05, 01, 01, 01),ТекущаяДата(),"лет");
Функция РазницаМеждуДатами(НачалоПериода, КонецПериода, Период = "ЧАС") Экспорт
Если Период = "" Тогда
Период = "ЧАС";
КонецЕсли;
Период = ВРег(Период);
Период = СтрЗаменить(Период, "СЕКУНД","СЕКУНДА");
Период = СтрЗаменить(Период, "СЕК","СЕКУНДА");
Период = СтрЗаменить(Период, "МИНУТ","МИНУТА");
Период = СтрЗаменить(Период, "МИН","МИНУТА");
Период = СтрЗаменить(Период, "ЧАСОВ","ЧАС");
Период = СтрЗаменить(Период, "ДНЕЙ","ДЕНЬ");
Период = СтрЗаменить(Период, "ЛЕТ","ГОД");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ГОД) КАК ГОД,
| РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, МЕСЯЦ) КАК МЕСЯЦ,
| РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ) КАК ДЕНЬ,
| РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ЧАС) КАК ЧАС,
| РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, МИНУТА) КАК МИНУТА,
| РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, СЕКУНДА) КАК СЕКУНДА";
Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода", КонецПериода);
Если КонецПериода > НачалоПериода Тогда
Результат = Запрос.Выполнить().Выгрузить();
Если Период = "ГОД" Тогда Возврат Результат[0].ГОД;
ИначеЕсли Период = "МЕСЯЦ" Тогда Возврат Результат[0].МЕСЯЦ;
ИначеЕсли Период = "ДЕНЬ" Тогда Возврат Результат[0].ДЕНЬ;
ИначеЕсли Период = "ЧАС" Тогда Возврат Результат[0].ЧАС;
ИначеЕсли Период = "МИНУТА" Тогда Возврат Результат[0].МИНУТА;
ИначеЕсли Период = "СЕКУНДА" Тогда Возврат Результат[0].СЕКУНДА;
КонецЕсли;
КонецЕсли;
Возврат 0;
КонецФункции
2.
user654641_yaga_m
1319.12.23 13:17 Сейчас в теме
ДД, такой нет, по крайней мере я не нашел, сам неделю назад искал - ничего "красивого" не нашел...)) Пришлось самому писать. Готовлю статью для сообщества... если модератор пропустит.
(8)я решила чтоб знать сколько дней в месяце нужны календари. Например если запросом взять разность дат в днях, определить сколько в них месяцев
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РАЗНОСТЬДАТ(&ДатаНачало, &ДатаКонец, ГОД) КАК Год,
| РАЗНОСТЬДАТ(&ДатаНачало, &ДатаКонец, МЕСЯЦ) КАК Месяц";
Запрос.УстановитьПараметр("ДатаНачало", ДатаПриема);
Запрос.УстановитьПараметр("ДатаКонец", КонечнаяДата);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДат = РезультатЗапроса.Выбрать();
Пока ВыборкаДат.Следующий() Цикл
Год = ВыборкаДат.Год;
Месяц = ВыборкаДат.Месяц - Год*12;
КонецЦикла;
Показать
тут я нашла формат лет...месяцев, а вот с днями проблема
В конечном итоге будите делать поправки на високосные года, количество дней в месяцах и придете к тому же алгоритму в {10} :-)
Примерно этот алгоритм реализован и в ЗиК 77 и в программах на FoxPro и в онлайн калькуляторах. Велосипед тут изобретать не нужно. Либо взять готовый вариант 1, либо взять готовый вариант 2, 3, 4,... либо ещё какой. Выбор за вами.
Если в БСП такой функции нет, то придется её писать, либо брать из специализированных конфигураций - любая где есть расчет стажа. Алгоритм может быть простым, но не сильно точным. Посложнее поточнее. Но совсем правильного не существует. На бумаге есть споры о правильном результате. :-) Поэтому определите степень точности, который вам нужен и используйте.
(11) Иногда надо запросом, что бы в цикле не вызывать.
Функцию, которую Вы ищите должна делать примерно тоже самое, что и онлайн калькулятор календаря.
По сути это как раз примерно такой же алгоритм. В котором необходимо учесть високосный год или нет. 30 дней это уже месяц или ещё нет и т.д. :-)