Работа с датами — одна из самых частых задач в программировании на платформе 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;
Такой подход избавляет коллег, которые будут читать ваш код, от необходимости вспоминать, сколько секунд в сутках, и делает намерения программиста очевидными.
Если вы работаете в современной конфигурации (например, 1С:ERP, Управление торговлей 11 или Бухгалтерия предприятия 3.0), в вашем распоряжении есть мощный инструмент — функции общих модулей БСП. Использование готовых функций считается "хорошим тоном", так как они учитывают множество нюансов и делают код более высокоуровневым.
Разберем пример использования функции из модуля ОбщегоНазначения. Посмотрим, как это выглядит в коде:
// Пример для конфигураций на базе БСП
КоличествоДней = 5;
НоваяДата = ОбщегоНазначения.ДобавитьДату(ТекущаяДата(), "День", КоличествоДней);
Этот метод удобен тем, что он универсален. Вам не нужно помнить количество секунд для дней, месяцев или лет. Достаточно указать тип периода строкой ("День", "Месяц", "Год").
Встроенная функция платформы ДобавитьМесяц() — это единственный правильный способ прибавления месяцев. Почему нельзя просто прибавить 30 * 86400? Потому что количество дней в месяцах разное (28, 29, 30, 31), и простая арифметика приведет к ошибкам в логике.
Рассмотрим нюанс с високосными годами. Если у нас есть дата 29 февраля и мы прибавляем 12 месяцев (1 год), платформа автоматически скорректирует дату на 28 февраля следующего года. Проанализируем пример:
ДатаРождения = '20040229'; // Високосный год
// Прибавляем ровно один год
ДатаСледующегоГода = ДобавитьМесяц(ДатаРождения, 12);
// Результат будет '20050228', так как в 2005 году нет 29 февраля
Для вычисления дня рождения в будущем периоде часто используют именно эту функцию, так как она корректно обрабатывает границы месяцев.
Часто в бизнес-задачах требуется прибавить не календарные, а рабочие дни. Обычное сложение с секундами здесь не поможет, так как нужно пропускать выходные и праздники. В 1С это решается через механизмы графиков работы.
Выясним, как программно вычислить дату завершения задачи через 3 рабочих дня по графику "Пятидневка":
// Требуется наличие подсистемы "Календарные графики"
ГрафикРаботы = Справочники.ПроизводственныеКалендари.НайтиПоНаименованию("РоссийскаяФедерация");
КоличествоДней = 3;
ДатаЗавершения = КалендарныеГрафики.ПолучитьДатуЗавершения(ГрафикРаботы, ТекущаяДата(), КоличествоДней);
Этот метод гарантирует, что если вы прибавите 2 рабочих дня к пятнице, вы получите вторник (при условии стандартной пятидневки), а не воскресенье.
Проанализируем несколько критических моментов, о которых стоит помнить каждому разработчику:
Дата в 1С всегда включает время. Если вы прибавляете 86400 секунд к 15.05.2023 14:30:05, вы получите 16.05.2023 14:30:05. Если вам нужно получить начало следующего дня (00:00:00), всегда используйте функцию НачалоДня().
НоваяДата = НачалоДня(ИсходнаяДата + 86400);
КоличествоДней = (КонецПериода - НачалоПериода) / 86400;
Для ежедневных задач программирования в 1С наиболее эффективными являются два подхода:
Дата + КолВоДней * 86400. Это быстро, работает везде и понятно любому 1С-нику.ОбщегоНазначения.ДобавитьДату, что делает ваш код более профессиональным и защищенным от ошибок расчета периодов.Мы рассмотрели все основные способы манипуляции датами в коде. Выбор конкретного метода зависит от архитектуры вашей конфигурации и сложности решаемой бизнес-задачи. Главное — помнить о структуре хранения даты и всегда проверять необходимость приведения результата к началу дня.