1С 8.3 Добавить к дате
Данные > Примеры кода 1С > 1С 8.3 Дата и время
Перейти в основной раздел:

Добавляет указанное количество периодов к дате (аналог функции языка запросов):
// Возвращает структуру множителей для различных типов периодов.
// Положительные значения - для месячных типов (добавляются через ДобавитьМесяц),
// Отрицательные - для временных (добавляются через вычитание секунд).
//
// Возвращаемое значение:
// Структура - содержит множители для всех поддерживаемых типов периодов
Функция МножителиТиповПериодов() Экспорт
Сутки = 24 * 60 * 60;
Множители = Новый Структура();
Множители.Вставить("Год", 12);
Множители.Вставить("Полугодие", 6);
Множители.Вставить("Квартал", 3);
Множители.Вставить("Месяц", 1);
Множители.Вставить("Декада", -10 * Сутки);
Множители.Вставить("Неделя", -7 * Сутки);
Множители.Вставить("День", -1 * Сутки);
Множители.Вставить("Час", -60 * 60);
Множители.Вставить("Минута", -60);
Множители.Вставить("Секунда", -1);
Возврат Множители;
КонецФункции
// Добавляет указанное количество периодов к дате (аналог функции языка запросов).
// Поддерживаются как месячные периоды (год, квартал, месяц), так и временные (дни, часы и т.д.).
//
// Параметры:
// ИсходнаяДата - Дата - базовая дата для вычислений
// ТипПериода - Строка - имя типа периода ("Год", "Квартал", "День" и т.д.), регистр не важен
// Количество - Число - количество периодов для добавления (может быть отрицательным)
//
// Возвращаемое значение:
// Дата - результат добавления периода
//
// Исключения:
// - Если тип периода не поддерживается
// - Если для месячного периода указано нецелое количество
Функция ДобавитьКДате(Знач ИсходнаяДата, Знач ТипПериода, Знач Количество = 1) Экспорт
ТипПериода = ВРег(ТипПериода);
Множители = МножителиТиповПериодов();
// Проверка поддержки типа периода
Если Не Множители.Свойство(ТипПериода) Тогда
ВызватьИсключение "Неподдерживаемый тип периода: " + ТипПериода;
КонецЕсли;
// Для месячных периодов проверяем целочисленность количества
Если Множители[ТипПериода] > 0 Тогда
Если Цел(Количество) <> Количество Тогда
ВызватьИсключение "Количество должно быть целым числом для типа периода " + ТипПериода;
КонецЕсли;
Возврат ДобавитьМесяц(ИсходнаяДата, Количество * Множители[ТипПериода]);
Иначе
Возврат ИсходнаяДата + (Количество * Множители[ТипПериода]);
КонецЕсли;
КонецФункции
// Положительные значения - для месячных типов (добавляются через ДобавитьМесяц),
// Отрицательные - для временных (добавляются через вычитание секунд).
//
// Возвращаемое значение:
// Структура - содержит множители для всех поддерживаемых типов периодов
Функция МножителиТиповПериодов() Экспорт
Сутки = 24 * 60 * 60;
Множители = Новый Структура();
Множители.Вставить("Год", 12);
Множители.Вставить("Полугодие", 6);
Множители.Вставить("Квартал", 3);
Множители.Вставить("Месяц", 1);
Множители.Вставить("Декада", -10 * Сутки);
Множители.Вставить("Неделя", -7 * Сутки);
Множители.Вставить("День", -1 * Сутки);
Множители.Вставить("Час", -60 * 60);
Множители.Вставить("Минута", -60);
Множители.Вставить("Секунда", -1);
Возврат Множители;
КонецФункции
// Добавляет указанное количество периодов к дате (аналог функции языка запросов).
// Поддерживаются как месячные периоды (год, квартал, месяц), так и временные (дни, часы и т.д.).
//
// Параметры:
// ИсходнаяДата - Дата - базовая дата для вычислений
// ТипПериода - Строка - имя типа периода ("Год", "Квартал", "День" и т.д.), регистр не важен
// Количество - Число - количество периодов для добавления (может быть отрицательным)
//
// Возвращаемое значение:
// Дата - результат добавления периода
//
// Исключения:
// - Если тип периода не поддерживается
// - Если для месячного периода указано нецелое количество
Функция ДобавитьКДате(Знач ИсходнаяДата, Знач ТипПериода, Знач Количество = 1) Экспорт
ТипПериода = ВРег(ТипПериода);
Множители = МножителиТиповПериодов();
// Проверка поддержки типа периода
Если Не Множители.Свойство(ТипПериода) Тогда
ВызватьИсключение "Неподдерживаемый тип периода: " + ТипПериода;
КонецЕсли;
// Для месячных периодов проверяем целочисленность количества
Если Множители[ТипПериода] > 0 Тогда
Если Цел(Количество) <> Количество Тогда
ВызватьИсключение "Количество должно быть целым числом для типа периода " + ТипПериода;
КонецЕсли;
Возврат ДобавитьМесяц(ИсходнаяДата, Количество * Множители[ТипПериода]);
Иначе
Возврат ИсходнаяДата + (Количество * Множители[ТипПериода]);
КонецЕсли;
КонецФункции
Добавить к дате как в запросе в 1С 8.3 от Сергей (ildarovich):
// Как в языке запросов
Функция ДобавитьКДате(ДатаНач, Количество, Период) Экспорт
Функция ДобавитьКДате(ДатаНач, Количество, Период) Экспорт
Шаг = Новый Структура("Год, Квартал, Месяц, Неделя, День, Час, Минута, Секунда", 12, 3, 1, -604800, -86400, -3600, -60, -1);
Возврат ?(Шаг[Период] > 0, ДобавитьМесяц(ДатаНач, Количество * Шаг[Период]), ДатаНач - Количество * Шаг[Период])
КонецФункции
Функция добавляет период к дате в формате перечисления - "периодичности": в 1С 8.3 (типовая):
Функция ДобавитьПериод(Дата, Периодичность, КоличествоПериодов = 1) Экспорт
День = 24 * 60 * 60; // Количество секунд в дне
Если Периодичность = ПредопределенноеЗначение("Перечисление.Периодичность.Год") Тогда
Возврат ДобавитьМесяц(Дата, 12 * КоличествоПериодов);
ИначеЕсли Периодичность =
ПредопределенноеЗначение("Перечисление.Периодичность.Полугодие") Тогда
Возврат ДобавитьМесяц(Дата, 6 * КоличествоПериодов);
ИначеЕсли Периодичность =
ПредопределенноеЗначение("Перечисление.Периодичность.Квартал") Тогда
Возврат ДобавитьМесяц(Дата, 3 * КоличествоПериодов);
ИначеЕсли Периодичность =
ПредопределенноеЗначение("Перечисление.Периодичность.Месяц") Тогда
Возврат ДобавитьМесяц(Дата, 1 * КоличествоПериодов);
ИначеЕсли Периодичность =
ПредопределенноеЗначение("Перечисление.Периодичность.Неделя") Тогда
Возврат Дата + 7 * День * КоличествоПериодов;
ИначеЕсли Периодичность =
ПредопределенноеЗначение("Перечисление.Периодичность.Декада") Тогда
Возврат Дата + 10 * День * КоличествоПериодов;
ИначеЕсли Периодичность = ПредопределенноеЗначение("Перечисление.Периодичность.День")
Тогда
Возврат Дата + 1 * День * КоличествоПериодов;
Иначе
Возврат Дата;
КонецЕсли;
КонецФункции
День = 24 * 60 * 60; // Количество секунд в дне
Если Периодичность = ПредопределенноеЗначение("Перечисление.Периодичность.Год") Тогда
Возврат ДобавитьМесяц(Дата, 12 * КоличествоПериодов);
ИначеЕсли Периодичность =
ПредопределенноеЗначение("Перечисление.Периодичность.Полугодие") Тогда
Возврат ДобавитьМесяц(Дата, 6 * КоличествоПериодов);
ИначеЕсли Периодичность =
ПредопределенноеЗначение("Перечисление.Периодичность.Квартал") Тогда
Возврат ДобавитьМесяц(Дата, 3 * КоличествоПериодов);
ИначеЕсли Периодичность =
ПредопределенноеЗначение("Перечисление.Периодичность.Месяц") Тогда
Возврат ДобавитьМесяц(Дата, 1 * КоличествоПериодов);
ИначеЕсли Периодичность =
ПредопределенноеЗначение("Перечисление.Периодичность.Неделя") Тогда
Возврат Дата + 7 * День * КоличествоПериодов;
ИначеЕсли Периодичность =
ПредопределенноеЗначение("Перечисление.Периодичность.Декада") Тогда
Возврат Дата + 10 * День * КоличествоПериодов;
ИначеЕсли Периодичность = ПредопределенноеЗначение("Перечисление.Периодичность.День")
Тогда
Возврат Дата + 1 * День * КоличествоПериодов;
Иначе
Возврат Дата;
КонецЕсли;
КонецФункции
0
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник