Функция для вычисления разницы двух дат в формате лет, месяцев, дней

19.01.24

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

Приведен алгоритм и реализация функции для программного вычисления разницы двух дат (не в запросе).

Доброго времени суток. Недавно на форуме увидел в очередной раз обсуждение кода для вычисления разницы двух дат (не в запросе) для размещения в форме в виде табло: Лет, Месяцев, Дней. Для отображения количества промежутка времени в стаже, контракта, например. Как выражаются мои бухгалтеры: калькулятор. Для "обратного" действия от тоже работает.

В БСП такой функции не обнаружил, с переводом в запрос (там есть нужная функция) получается "громоздко". Захотелось сделать своё, без проверок и условий, что-то более "изящное". Получилось вроде неплохо, обратил внимание, что функция ДобавитьМесяц() работает очень корректно, например при переходе через февраль месяц (начальная дата, например, 30 января, конечная дата - 30 марта). Этим и воспользовался.

Привожу код функции.

Пару слов: обрабатываю в примере два интервала: в русском языке есть два понятия - с/по и с/до! В соответствии с этим обрабатываю конечную дату.

Проверял на платформе 8.3 (8.3.12.1924), но думаю, работать будет везде.

 

PS. Благодаря "бдительности" Gesperid (отдельное спасибо) подкорректировал код + нашел неточность (пометил на примере кода: кто скачивал - исправляйте)

Функция ПолучениеРазницыДат (ДатаС, ДатаПо, ДатаДо)
	Если ДатаПо <> Дата('00010101') Тогда
		ДатаОкон = ДатаПо;
                ДеньКоррекции = 3600*24; //для корректировки даты ПО
	ИначеЕсли ДатаДо <> Дата('00010101') Тогда
		ДатаОкон = ДатаДо;
		ДеньКоррекции = 0;
	Иначе
		НовСообщ = Новый СообщениеПользователю;
		НовСообщ.Текст = "Выберите одну дату";
		НовСообщ.Сообщить();
	КонецЕсли;

	РазницаДатыС = День(КонецМесяца(ДатаС)) - День(ДатаС); //добавление
	КонМесДатыС = КонецМесяца(ДатаС);                         //добавление

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

		Иначе
			НовСообщ = Новый СообщениеПользователю;
			НовСообщ.Текст = "Проверьте формат дат";
			НовСообщ.Сообщить();
		КонецЕсли;
		

КонецФункции

 

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

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Универсальные функции 1С 8.3 1С:Документооборот Россия Платные (руб)

ДО+ — расширение конфигурации, в котором собран постоянно пополняемый набор из 33 востребованных доработок для 1С:Документооборот КОРП 3.0: согласование задач прямо из мессенджеров MAX и Telegram, отзыв согласования и исполнения, гибкие повторные круги, эскалация с точностью до минут, контроль исполнительской дисциплины, выгрузка вложений в ZIP и склейка PDF, реестр документов в Excel, проверка дублей контрагентов и регистрационных номеров. Каждая возможность активируется отдельным флажком в режиме предприятия — включается только то, что нужно конкретной организации. Список функций расширяется с каждым релизом — текущая версия 2.1.0. Режим AddOn: типовая конфигурация не модифицируется, обновления ДО ставятся штатно, дополнительные лицензии и внешние компоненты не требуются. Внедрение силами администратора — около часа.

30000 руб.

09.07.2026    967    1    0    

2

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

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

30.10.2025    8321    Abysswalker    11    

49

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

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

14.05.2025    13717    DeerCven    15    

64

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

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

21.05.2024    67297    dimanich70    87    

178

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

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

1 стартмани

18.03.2024    8973    7    John_d    13    

59

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

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

12.02.2024    84054    atdonya    31    

75

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

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

30.11.2023    13204    ke.92@mail.ru    18    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Gesperid 2 28.12.23 13:59 Сейчас в теме
Что вы понимаете под разностью дат?
Это сложный вопрос.
Вот вопросы попроще.
* 01.03.2023 - 28.01.23 = ?
* 01.03.2023 - 29.01.23 = ?
* 01.03.2023 - 30.01.23 = ?

Вызывает вопросы:
* Имена и назначение параметров
* Тип и формат возвращаемого значения. Почему строкой и в таком формате?
* Факт валидации входных параметров
* Возврат ошибки через сообщение пользователю

И, честно сказать, изящность функции в целом - под вопросом.
2. user654641_yaga_m 17 29.12.23 18:22 Сейчас в теме
(1)Спасибо за тестирование и анализ кода. Чуть исправил - надеюсь Вы будете "довольны" - Ваши примеры работают...
3. user654641_yaga_m 17 19.01.24 09:07 Сейчас в теме
Коллеги, сорь, нашел ошибку:
"РазницаДатыС = День(КонецМесяца(ДатаС)) - День(ДатаС) + 1;"
исправил на:
"РазницаДатыС = День(КонецМесяца(ДатаС)) - День(ДатаС);"
4. SagittariusA 19.01.24 10:20 Сейчас в теме
В БСП такой функции не обнаружил

Очень странно...

Это не подходит?

ОбщегоНазначенияБПКлиентСервер.РазностьДат


ОбщегоНазначенияУТ.РазностьДат
RidelAV; xa1ter; MatF; _root; +4 Ответить
5. user654641_yaga_m 17 19.01.24 12:43 Сейчас в теме
(4)ДД, у меня другие конфигурации, + может старые БСП...
6. SagittariusA 19.01.24 13:17 Сейчас в теме
(5) возможно. Актуальные БСП можно брать на тут.
Для отправки сообщения требуется регистрация/авторизация