Разность дат прописью

18.11.13

Разработка - Универсальные функции

Функция РазностьДатПрописью(Дата1, Дата2), которая возвращает разность между двумя датами прописью в виде 1 год 12 месяцев 3 дня 10 часов 6 минут 12 секунд.

Сделано на базе http://help1c.com/faq/view/679.html

Я добавил часы, минуты и секунды.

Функция РазностьДатПрописью(Дата1, Дата2)	
	Лет = 0; Мес = 0; Дн = 0;	
	Часов = 0; Минут = 0; Секунд = 0;
	РазобратьРазностьДат(Дата1, Дата2, Лет, Мес, Дн, Часов, Минут, Секунд);
	ЛетС = ФормаМножественногоЧисла("год","года","лет",Лет);	
	МесС = ФормаМножественногоЧисла("месяц","месяца","месяцев",Мес);
	ДнС = ФормаМножественногоЧисла("день","дня","дней",Дн);
	ЧасовС = ФормаМножественногоЧисла("час","часа","часов", Часов);
	МинутС = ФормаМножественногоЧисла("минута","минуты","минут", Минут);
	СекундС = ФормаМножественногоЧисла("секунда","секунды",	"секунд", Секунд);	
	Рез = 
	?(Лет > 0, Строка(Лет) + " " + ЛетС, "") + " " +
	?(Мес > 0, Строка(Мес) + " " + МесС, "") + " " +
	?(Дн > 0, Строка(Дн) + " " + ДнС, "") + " " +
	?(Часов > 0, Строка(Часов) + " " + ЧасовС, "") + " " +
	?(Минут > 0, Строка(Минут) + " " + МинутС, "") + " " +
	?(Секунд > 0, Строка(Секунд) + " " + СекундС, "");	
	Возврат Рез;
КонецФункции 
// Назначение: Получить разность дат.
// Данные разности возвращаются в переменные Лет, Мес, Дн, Часов, Минут, Секунд.
// Порядок дат не имеет значения.
Процедура РазобратьРазностьДат(ПолнаяДата1, ПолнаяДата2, Лет = 0, Месяцев = 0, Дней = 0, Часов = 0, Минут = 0, Секунд = 0)
	Лет	= 0;
	Месяцев	= 0;
	Дней	= 0;	
	Дата1 = Макс(НачалоДня(ПолнаяДата1), НачалоДня(ПолнаяДата2));
	Дата2 = Мин(НачалоДня(ПолнаяДата1), НачалоДня(ПолнаяДата2));	
	Если Дата1 > Дата2 Тогда		
		ВременнаяДата = Дата1;
		Если День(ВременнаяДата) < День(Дата2) Тогда
			Дней = (ВременнаяДата - ДобавитьМесяц(ВременнаяДата,-1))/86400;
			ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-1);
		КонецЕсли;
		Если Месяц(ВременнаяДата) < Месяц(Дата2) Тогда
			ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-12);
			Месяцев = 12;
		КонецЕсли;
		Лет		= Макс(Год(ВременнаяДата) - Год(Дата2), 0);
		Месяцев	= Макс(Месяцев	+ Месяц(ВременнаяДата)- Месяц(Дата2), 0);
		Дней	= Макс(Дней + День(ВременнаяДата) - День(Дата2), 0);		
		// скорректируем отображаемое значение, если ""вмешалось"" разное количество дней в месяцах
		Если Дата2 <> (ДобавитьМесяц(Дата1,-Лет * 12-Месяцев)-Дней * 86400) Тогда
			Дней = Дней + (День(КонецМесяца(Дата2)) - День(НачалоМесяца(Дата2))) - (День(КонецМесяца(ДобавитьМесяц(Дата1,-1))) - День(НачалоМесяца(ДобавитьМесяц(Дата1,-1))));
		КонецЕсли;		
	КонецЕсли;	
	//Приводим даты к одному дню, чтобы посчитать разность в секундах одного дня
	Дата1 = Дата(Год(ПолнаяДата2), Месяц(ПолнаяДата2), День(ПолнаяДата2), Час(ПолнаяДата1), Минута(ПолнаяДата1), Секунда(ПолнаяДата1));
	Дата2 = ПолнаяДата2;	
	Разность = Макс(Дата1, Дата2) - Мин(Дата1, Дата2);	
	Часов = Цел(Разность / 3600);
	Минут = Цел( (Разность - Часов * 3600) / 60 );
	Секунд = Окр( ( (Разность - Часов * 3600) / 60 - Минут ) * 60, 2);		
КонецПроцедуры

// Сформировать множественное число
Функция ФормаМножественногоЧисла(Слово1, Слово2, Слово3, Знач ЦелоеЧисло)	
	// Изменим знак целого числа, иначе отрицательные числа будут неправильно преобразовываться
	Если ЦелоеЧисло < 0 Тогда
		ЦелоеЧисло = -1 * ЦелоеЧисло;
	КонецЕсли;	
	Если ЦелоеЧисло <> Цел(ЦелоеЧисло) Тогда // для нецелых чисел - всегда вторая форма
		Возврат Слово2;
	КонецЕсли;	
	// остаток
	Остаток = ЦелоеЧисло % 10;
	Если (ЦелоеЧисло > 10) И (ЦелоеЧисло < 20) Тогда
		// для второго десятка - всегда третья форма
		Возврат Слово3;
	ИначеЕсли Остаток = 1 Тогда
		Возврат Слово1;
	ИначеЕсли (Остаток > 1) И (Остаток < 5) Тогда
		Возврат Слово2;
	Иначе
		Возврат Слово3;
	КонецЕсли;
КонецФункции

Пример использования:

Сообщить(РазностьДатПрописью(Дата(2009, 12, 31), ТекущаяДата()));

Порядок указания дат не имеет значения.

Вступайте в нашу телеграмм-группу Инфостарт

РАЗНОСТЬДАТ пропись

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    3308    Abysswalker    7    

44

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    6153    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    48129    dimanich70    83    

168

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7254    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    59989    atdonya    31    

69

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9032    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ksvd 23.10.13 17:30 Сейчас в теме
Спасибо. Может пригодиться
2. peterxx 23 24.10.13 08:06 Сейчас в теме
Спасибо. Присоединяюсь.
3. chmv 24.10.13 08:56 Сейчас в теме
а проще нельзя. Найти разность и сумма прописью
4. Yurkiss 18 24.10.13 11:49 Сейчас в теме
(3) chmv,
Если так:
СекундС = ЧислоПрописью(Секунд, "", "секунда, секунды, секунд, м, секунда, секунды, секунд, ж, 0");

то получается Девять секунд, а хочется 9 секунд
5. alexander-lubich 30 12.12.18 17:59 Сейчас в теме
Некорректно Дата1 = 12.12.2018 17:46:33 Дата2 = Дата1 + 24304

должно быть 6:45 , на деле нет.
Для отправки сообщения требуется регистрация/авторизация