Разработка и Конфигурация · 8 мин
Как прибавить к дате день в 1С 8
Как прибавить к дате день в 1С 8: функция ДобавитьКДате, арифметика с секундами, работа в запросах и обычных формах. Примеры кода, ошибки и проверка результата.
Задача прибавить к дате день встречается в 1С 8 постоянно: при расчёте сроков оплаты, дат отгрузки, окончания договоров, формировании периодов отчётов. Встроенный язык платформы предлагает несколько способов решения, и у каждого есть свои особенности, о которых нужно знать, чтобы не получить ошибку или неверный результат.
Главный нюанс в том, что тип «Дата» в 1С хранится с точностью до секунды, и простое сложение даты с числом работает иначе, чем ожидают новички. Кроме того, способ прибавления дня отличается в зависимости от контекста: код модуля, запрос, выражение в СКД или формула в макете.
Ниже разобраны все рабочие варианты: штатная функция, арифметика с секундами, добавление дней в запросе, а также типичные ошибки и способы проверки результата.
Функция ДобавитьКДате — основной способ
Штатный механизм работы с датами во встроенном языке 1С — функция ДобавитьКДате(). Она принимает три параметра: исходную дату, тип интервала (строка: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД) и количество единиц интервала.
Пример прибавления одного дня:
НоваяДата = ДобавитьКДате(ТекущаяДата(), "ДЕНЬ", 1);
// или с произвольной датой
ДатаОтгрузки = ДобавитьКДате(ДатаЗаказа, "ДЕНЬ", 3);
Функция возвращает новое значение типа «Дата» и не изменяет исходную переменную — результат нужно присвоить. Чтобы вычесть день, передайте отрицательное число: ДобавитьКДате(Дата, "ДЕНЬ", -1).
Преимущество функции перед арифметикой с секундами — корректная работа с календарными интервалами. При добавлении месяца или года платформа сама учитывает разное количество дней в месяцах, чего сложение секунд не обеспечивает.
Прибавление дня через арифметику с секундами
В 1С к значению типа «Дата» можно прибавлять число — оно интерпретируется как количество секунд. Чтобы прибавить один день, нужно прибавить 86400 (24 × 60 × 60):
НоваяДата = Дата + 86400; // плюс один день
// или читаемее:
СекундВДне = 24 60 60;
НоваяДата = Дата + СекундВДне;
Этот способ короче и часто встречается в старом коде, но у него есть ограничение: он работает только с секундами, минутами, часами и днями. Прибавить так месяц невозможно, потому что длительность месяца в секундах непостоянна.
Сравнение вариантов
Универсальный способ для любых интервалов: дни, месяцы, годы. Рекомендуется для нового кода.
Подходит только для дней и меньших единиц. Короче, но менее читаемо и не работает с месяцами.
Единственный вариант, когда дата вычисляется на стороне СУБД в тексте запроса.
Как прибавить день к дате в запросе
В тексте запроса арифметика с секундами недоступна — там используется функция языка запросов ДОБАВИТЬКДАТЕ(Дата, ТипИнтервала, Количество). Тип интервала указывается без кавычек:
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(Заказы.Дата, ДЕНЬ, 1) КАК ДатаОтгрузки
ИЗ
Документ.ЗаказПокупателя КАК Заказы
Функцию можно применять и в условиях отбора. Например, выбрать документы за день, следующий за указанной датой:
ГДЕ
Заказы.Дата МЕЖДУ ДОБАВИТЬКДАТЕ(&Дата, ДЕНЬ, 1)
И КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&Дата, ДЕНЬ, 1), ДЕНЬ)
Обратите внимание: в запросах тип интервала пишется как ключевое слово (ДЕНЬ), а не строка. Если написать "ДЕНЬ" в кавычках, конструктор запроса выдаст ошибку.
Прибавление дня к дате документа и в реквизитах
Типовой сценарий — рассчитать дату оплаты или отгрузки на основании даты документа. В модуле объекта или формы это делается через ту же функцию:
// В модуле объекта документа
ДатаОплаты = ДобавитьКДате(Дата, "ДЕНЬ", СрокОплатыДней);
Если срок хранится в реквизите (например, «СрокОплаты» в договоре), подставьте его третьим параметром. Перед расчётом полезно проверить, что реквизит заполнен, иначе при пустом значении платформа вернёт дату без изменений или вы получите неочевидный результат.
При работе с датой документа помните: Дата документа содержит и время. Если для расчёта важно начало дня, предварительно отбросьте время функцией НачалоДня(Дата), иначе прибавленный день сохранит исходное время.
- 1Получите исходную дату: реквизит документа или ТекущаяДата()
- 2При необходимости приведите её к началу дня: НачалоДня(Дата)
- 3Вызовите ДобавитьКДате с типом интервала ДЕНЬ и нужным количеством дней
- 4Присвойте результат целевой переменной или реквизиту
- 5Проверьте результат через Сообщить() или отладчик
Проверка результата и отладка
Самый быстрый способ убедиться, что дата посчитана верно, — вывести её через Сообщить() или посмотреть в отладчике (точка останова, табло). Для наглядности форматируйте вывод:
Сообщить(Формат(НоваяДата, "ДЛФ=D"));
Проверяйте граничные случаи: переход через конец месяца, конец года, високосный февраль. Например, прибавление дня к 31 января должно дать 1 февраля, а к 28 февраля високосного года — 29 февраля. Функция ДобавитьКДате обрабатывает эти переходы корректно, но если вы используете арифметику секунд, убедитесь, что не смешали её с логикой «конца месяца».
Как проверить результат
Дата увеличилась ровно на заданное число дней
Дата не изменилась — результат не присвоен переменной
Время соответствует ожиданию (сохранено или обнулено через НачалоДня)
Неожиданное время мешает сравнению дат в условиях
31.01 + 1 день = 01.02
Получилась несуществующая или сдвинутая дата — проверьте способ расчёта
Особые случаи: рабочие дни и границы периодов
Если нужно прибавить не календарный, а рабочий день (с учётом выходных и праздников), простых функций недостаточно. В типовых конфигурациях для этого используется регистр сведений с производственным календарём (например, «ДанныеПроизводственногоКалендаря») и функции общих модулей работы с календарями. Самописный перебор дней с проверкой дня недели учтёт только субботу и воскресенье, но не праздничные переносы.
Другой частый сценарий — получить конец следующего дня для периода отчёта. Комбинируйте функции: КонецДня(ДобавитьКДате(Дата, "ДЕНЬ", 1)). Для запросов аналогично работает связка КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(...), ДЕНЬ).
Частые вопросы
Почему Дата + 1 не прибавляет день?
Потому что число при сложении с датой трактуется как секунды. Дата + 1 сдвигает значение на одну секунду. Чтобы прибавить день, используйте Дата + 86400 или функцию ДобавитьКДате(Дата, "ДЕНЬ", 1).
Как вычесть день из даты?
Передайте отрицательное количество: ДобавитьКДате(Дата, "ДЕНЬ", -1). При арифметическом способе вычтите секунды: Дата - 86400.
Как прибавить день к дате в СКД или вычисляемом поле?
В выражениях компоновки данных доступна функция языка выражений ДОБАВИТЬКДАТЕ(Дата, ДЕНЬ, 1) — синтаксис такой же, как в запросах, тип интервала указывается без кавычек.
Как прибавить день и сбросить время на начало суток?
Оберните результат в НачалоДня: НачалоДня(ДобавитьКДате(Дата, "ДЕНЬ", 1)). Получите следующий день с временем 00:00:00.
Работает ли ДобавитьКДате с пустой датой?
Функция выполнится, но результат будет вычисляться от пустого значения даты (01.01.0001), что почти всегда не то, что нужно. Перед расчётом проверяйте заполненность через ЗначениеЗаполнено(Дата).
Как прибавить рабочий день с учётом праздников?
Штатной простой функции нет. В типовых конфигурациях используйте производственный календарь и готовые функции общих модулей календарных графиков; в самописной конфигурации потребуется собственный регистр с графиком работы и перебор дней.
Что важно запомнить
Прибавляйте день через ДобавитьКДате(Дата, "ДЕНЬ", 1) — это универсально и безопасно. Арифметика Дата + 86400 годится только для дней и меньше. В запросах используется ДОБАВИТЬКДАТЕ с типом интервала без кавычек. Результат всегда присваивайте переменной и проверяйте на границах месяцев.