//.
// Возвращаемое значение:
// Структура - значения положительны для месячных типов и отрицательны для секундных
Функция МножителиТиповПериодов() Экспорт
Сутки = 24*60*60;
Множители = Новый Структура("Год, Полугодие, Квартал, Месяц, Декада, Неделя, День, Час, Минута, Секунда",
12, 6, 3, 1, -10*Сутки, -7*Сутки, -1*Сутки, -60*60, -60, -1);
Возврат Множители;
КонецФункции
// Аналог функции ДобавитьКДате языка запросов.
// Параметры:
// ИсходнаяДата - Дата -
// ТипПериода - Строка - имя типа периода аналогично языку запросов, регистр букв не важен
// Количество - Число - допускается отрицательное
// Возвращаемое значение:
// Дата -
Функция ДобавитьКДате(Знач ИсходнаяДата, Знач ТипПериода, Знач Количество = -1) Экспорт
ТипПериода = ВРег(ТипПериода);
Если Найти("ГОД;КВАРТАЛ;ПОЛУГОДИЕ;МЕСЯЦ;", ТипПериода + ";") > 0 Тогда
Если Цел(Количество) <> Количество Тогда
ВызватьИсключение "Количество должно быть целым числом для типа периода " + ТипПериода;
КонецЕсли;
КонецЕсли;
Множители = МножителиТиповПериодов();
Если Не Множители.Свойство(ТипПериода) Тогда
ВызватьИсключение "Неподдерживаемый тип периода: " + ТипПериода;
КонецЕсли;
Если Множители[ТипПериода] > 0 Тогда
Возврат ДобавитьМесяц(ИсходнаяДата, Количество * Множители[ТипПериода]);
Иначе
Возврат ИсходнаяДата - Количество * Множители[ТипПериода];
КонецЕсли;
КонецФункции
// Аналог функции РазностьДат языка запросов.
// Параметры:
// ВычитаемаяДата - Дата - которую вычитаем
// ИсходнаяДата - Дата - из которой вычитаем
// ТипПериода - Строка - имя типа периода аналогично языку запросов, регистр букв не важен
// Возвращаемое значение:
// Число - ИсходнаяДата-ВычитаемаяДата
Функция РазностьДат(Знач ВычитаемаяДата, Знач ИсходнаяДата, Знач ТипПериода) Экспорт
Множители = МножителиТиповПериодов();
Если Не Множители.Свойство(ТипПериода) Тогда
ВызватьИсключение "Неподдерживаемый тип периода: " + ТипПериода;
КонецЕсли;
Если Множители[ТипПериода] > 0 Тогда
Возврат Цел((Год(ИсходнаяДата) * 12 + Месяц(ИсходнаяДата) - 1) / Множители[ТипПериода])
- Цел((Год(ВычитаемаяДата) * 12 + Месяц(ВычитаемаяДата) - 1) / Множители[ТипПериода])
Иначе
Возврат Цел((Дата(1,1,1) - ИсходнаяДата) / Множители[ТипПериода])
- Цел((Дата(1,1,1) - ВычитаемаяДата) / Множители[ТипПериода])
КонецЕсли;
КонецФункции
Добавить к дате и разность дат
Прибавить рабочие дни к дате (Запрос)
Получить дату через указанное количество [дней, месяцев, лет, ...]
Проверка пересечения периодов (интервалов дат) в запросе
#1, ред. 03 июня 2025 08:30
Сделано на основе https://fastcode.im/Templates/6833/dobavit-k-date-i-raznost-dat
#2, 04 июня 2025 11:26
(1) tormozit, спасибо, очень не хватало этих функций