Как в коде 1С правильно прибавить количество дней к дате?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Работа с датами — одна из самых частых задач в программировании на платформе 1С. В отличие от запросов, где существует удобная встроенная функция ДОБАВИТЬКДАТЕ, в языке программирования 1С (на стороне сервера или клиента) подход к арифметике дат имеет свои особенности. Разберем по шагам, как правильно манипулировать датами, чтобы код был надежным и понятным.

Метод 1: Прямая арифметика через секунды

В платформе 1С:Предприятие тип данных Дата хранится как количество секунд, прошедших с 0001-01-01 00:00:00. Поэтому самое простое решение для изменения даты — это прибавление или вычитание нужного количества секунд. Проанализируем, как рассчитать количество секунд в сутках:

1 минута = 60 секунд. 1 час = 60 минут * 60 секунд = 3600 секунд. 1 сутки = 24 часа * 3600 секунд = 86400 секунд.

Если нам нужно прибавить к текущей дате 2 дня, мы можем написать следующий код:


КоличествоДней = 2;
НоваяДата = ТекущаяДата() + (КоличествоДней * 86400);

Многие разработчики используют число 86400 как "магическую константу", которая уже стала частью культурного кода программистов 1С. Однако для повышения читаемости кода, особенно если вы прибавляете часы или минуты, рассмотрим использование развернутого умножения:


// Прибавляем 2 дня, расписывая время для наглядности
НоваяДата = ТекущаяДата() + 2 * 24 * 60 * 60;

Такой подход избавляет коллег, которые будут читать ваш код, от необходимости вспоминать, сколько секунд в сутках, и делает намерения программиста очевидными.

Метод 2: Использование Библиотеки стандартных подсистем (БСП)

Если вы работаете в современной конфигурации (например, 1С:ERP, Управление торговлей 11 или Бухгалтерия предприятия 3.0), в вашем распоряжении есть мощный инструмент — функции общих модулей БСП. Использование готовых функций считается "хорошим тоном", так как они учитывают множество нюансов и делают код более высокоуровневым.

Разберем пример использования функции из модуля ОбщегоНазначения. Посмотрим, как это выглядит в коде:


// Пример для конфигураций на базе БСП
КоличествоДней = 5;
НоваяДата = ОбщегоНазначения.ДобавитьДату(ТекущаяДата(), "День", КоличествоДней);

Этот метод удобен тем, что он универсален. Вам не нужно помнить количество секунд для дней, месяцев или лет. Достаточно указать тип периода строкой ("День", "Месяц", "Год").

Метод 3: Работа с месяцами и годами через ДобавитьМесяц()

Встроенная функция платформы ДобавитьМесяц() — это единственный правильный способ прибавления месяцев. Почему нельзя просто прибавить 30 * 86400? Потому что количество дней в месяцах разное (28, 29, 30, 31), и простая арифметика приведет к ошибкам в логике.

Рассмотрим нюанс с високосными годами. Если у нас есть дата 29 февраля и мы прибавляем 12 месяцев (1 год), платформа автоматически скорректирует дату на 28 февраля следующего года. Проанализируем пример:


ДатаРождения = '20040229'; // Високосный год
// Прибавляем ровно один год
ДатаСледующегоГода = ДобавитьМесяц(ДатаРождения, 12); 
// Результат будет '20050228', так как в 2005 году нет 29 февраля

Для вычисления дня рождения в будущем периоде часто используют именно эту функцию, так как она корректно обрабатывает границы месяцев.

Метод 4: Учет рабочих дней и производственного календаря

Часто в бизнес-задачах требуется прибавить не календарные, а рабочие дни. Обычное сложение с секундами здесь не поможет, так как нужно пропускать выходные и праздники. В 1С это решается через механизмы графиков работы.

Выясним, как программно вычислить дату завершения задачи через 3 рабочих дня по графику "Пятидневка":


// Требуется наличие подсистемы "Календарные графики"
ГрафикРаботы = Справочники.ПроизводственныеКалендари.НайтиПоНаименованию("РоссийскаяФедерация");
КоличествоДней = 3;
ДатаЗавершения = КалендарныеГрафики.ПолучитьДатуЗавершения(ГрафикРаботы, ТекущаяДата(), КоличествоДней);

Этот метод гарантирует, что если вы прибавите 2 рабочих дня к пятнице, вы получите вторник (при условии стандартной пятидневки), а не воскресенье.

Важные технические нюансы при работе с датами

Проанализируем несколько критических моментов, о которых стоит помнить каждому разработчику:

  1. Время в дате: Помните, что тип Дата в 1С всегда включает время. Если вы прибавляете 86400 секунд к 15.05.2023 14:30:05, вы получите 16.05.2023 14:30:05. Если вам нужно получить начало следующего дня (00:00:00), всегда используйте функцию НачалоДня(). НоваяДата = НачалоДня(ИсходнаяДата + 86400);
  2. Переход на летнее/зимнее время: Хотя в РФ сейчас нет сезонного перевода стрелок, при работе с зарубежными серверами или историческими данными (до 2014 года) прямое прибавление секунд может быть коварным. В сутки перевода времени в них может быть 23 или 25 часов. В таких специфических случаях лучше использовать функции БСП или платформенные методы работы с периодами.
  3. Разность дат: Чтобы решить обратную задачу — узнать, сколько дней между двумя датами — просто вычтите одну дату из другой. Результат будет в секундах. Чтобы перевести его в дни, разделите на 86400. КоличествоДней = (КонецПериода - НачалоПериода) / 86400;

Подведем итоги

Для ежедневных задач программирования в 1С наиболее эффективными являются два подхода:

Мы рассмотрели все основные способы манипуляции датами в коде. Выбор конкретного метода зависит от архитектуры вашей конфигурации и сложности решаемой бизнес-задачи. Главное — помнить о структуре хранения даты и всегда проверять необходимость приведения результата к началу дня.

← На главную