Разработка и Конфигурация · 9 мин
Как прибавить 10 дней к дате в 1С
Как прибавить 10 дней к дате в 1С: оператор сложения, функция ДобавитьКДате, запросы и работа в пользовательском режиме. Примеры кода, ошибки и FAQ.
Задача «прибавить 10 дней к дате» возникает в 1С постоянно: расчёт срока оплаты по договору, даты отгрузки, окончания гарантии, плановой даты доставки. Встроенный язык 1С предлагает несколько способов решения, и у каждого есть особенности, которые важно понимать, чтобы не получить ошибку или неверный результат.
Главное, что нужно знать: значение типа «Дата» в 1С хранится с точностью до секунды, и простое арифметическое сложение работает именно в секундах. Поэтому запись Дата + 10 прибавит не 10 дней, а 10 секунд — это самая частая ошибка новичков.
Ниже разобраны все рабочие способы: сложение с секундами, функция ДобавитьКДате, аналог в языке запросов, прибавление дней в пользовательском режиме без программирования, а также проверка результата и типичные ошибки.
Способ 1. Сложение даты с числом секунд
Тип «Дата» в 1С поддерживает арифметические операции с числами, где единица — одна секунда. Чтобы прибавить 10 дней, нужно прибавить количество секунд в десяти сутках: 10 × 24 × 60 × 60 = 864 000.
ДатаДокумента = ТекущаяДата();
ДатаОплаты = ДатаДокумента + 10 * 86400; // +10 дней
Для читаемости кода часто пишут множитель развёрнуто: Дата + 10 24 60 * 60. Результат идентичен, но при чтении сразу видно, что речь идёт о днях, а не о «магическом числе».
Способ быстрый и короткий, но у него есть ограничение: он удобен только для дней, часов, минут и секунд. Если нужно прибавить месяц или год, количество секунд заранее неизвестно (месяцы имеют разную длину), и такой подход не работает.
Способ 2. Функция ДобавитьКДате
Функция ДобавитьКДате(ИсходнаяДата; ТипЕдиницы; Количество) — штатный и самый читаемый способ. Она корректно обрабатывает переходы через месяцы и годы, високосные годы и разную длину месяцев.
НоваяДата = ДобавитьКДате(ДатаДокумента; "ДЕНЬ"; 10);
Второй параметр задаёт единицу измерения. Допустимые значения: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД, ПОЛУГОДИЕ, ДЕКАДА. Третий параметр — количество единиц; он может быть отрицательным, тогда дата сдвинется назад.
Пример для отсчёта назад — например, дата начала периода за 10 дней до отчётной:
ДатаНачала = ДобавитьКДате(ДатаОкончания; "ДЕНЬ"; -10);
Если исходная дата содержит время (например, 15.03 14:30), время сохранится: результатом будет 25.03 14:30. Если нужна «чистая» дата без времени, предварительно обрежьте её функцией НачалоДня().
Способ 3. Прибавление дней в запросе
В языке запросов 1С арифметика с секундами недоступна — вместо неё есть функция ДОБАВИТЬКДАТЕ. Синтаксис похож на встроенную функцию, но тип единицы указывается без кавычек.
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(Заказы.Дата, ДЕНЬ, 10) КАК ДатаОтгрузки
ИЗ
Документ.ЗаказПокупателя КАК Заказы
Количество дней можно передавать параметром, что удобно, когда срок хранится в договоре или настройках:
Запрос.Текст =
"ВЫБРАТЬ
| ДОБАВИТЬКДАТЕ(Заказы.Дата, ДЕНЬ, &СрокДней) КАК ДатаОтгрузки
|ИЗ Документ.ЗаказПокупателя КАК Заказы";
Запрос.УстановитьПараметр("СрокДней", 10);
Обратите внимание: в запросе нельзя использовать конструкцию вида Дата + 864000 — запрос просто не выполнится с ошибкой. Единственный способ сдвинуть дату в выборке — ДОБАВИТЬКДАТЕ.
Способ 4. Без программирования: калькулятор дат и обработки
Если вы не разработчик, а пользователь, которому нужно один раз узнать дату «через 10 дней», писать код не требуется. В большинстве конфигураций есть встроенные инструменты.
Во многих типовых решениях (например, в «1С:Бухгалтерии» и «1С:Управление торговлей») поля дат поддерживают быстрый ввод: можно ввести количество дней от текущей даты или использовать календарь. Также в меню «Сервис» или «Все функции» некоторых конфигураций доступны стандартные обработки для работы с датами.
Для массового пересчёта — например, проставить дату оплаты «дата документа + 10 дней» в сотне документов — используют типовую обработку «Групповое изменение реквизитов» (доступна в конфигурациях на Библиотеке стандартных подсистем через раздел «Администрирование» — «Обслуживание»). В ней можно задать произвольный алгоритм вычисления значения.
- 1Откройте «Администрирование» → «Обслуживание» → «Групповое изменение реквизитов»
- 2Выберите нужный вид документов и задайте отбор
- 3Для реквизита даты выберите режим «Произвольный алгоритм»
- 4Впишите: Результат = ДобавитьКДате(Объект.ДатаОплаты; "ДЕНЬ"; 10);
- 5Выполните изменение и проверьте несколько документов вручную
Сравнение способов и выбор под задачу
Каждый вариант имеет свою область применения. Выбор зависит от того, где выполняется расчёт и насколько он должен быть гибким.
Способы прибавить 10 дней
Быстрый код в модуле. Подходит только для дней и меньших единиц; не работает для месяцев и лет.
Универсальный способ в коде. Читаем, поддерживает месяцы, годы и отрицательные значения. Рекомендуется по умолчанию.
Единственный вариант внутри запроса. Позволяет передавать количество дней параметром.
Для пользователя без программирования при массовом пересчёте данных. Требует прав администратора.
Если сомневаетесь — берите ДобавитьКДате. Она делает код самодокументируемым: любой, кто будет читать модуль, сразу поймёт намерение, а замена «ДЕНЬ» на «МЕСЯЦ» потребует правки одного параметра.
Проверка результата и частые ошибки
После расчёта полезно убедиться, что дата получилась ожидаемой. Самый простой способ — вывести значение в сообщение или посмотреть его в отладчике (точка останова + табло).
НоваяДата = ДобавитьКДате(ДатаДокумента; "ДЕНЬ"; 10);
Сообщить("Срок оплаты: " + Формат(НоваяДата; "ДЛФ=D"));
Обратите внимание на составляющую времени. Если исходная дата — дата документа со временем 23:59, результат тоже будет содержать 23:59. При сравнении такой даты с «чистой» датой условие НоваяДата = Дата("20260325") вернёт «Ложь», хотя календарный день совпадает. Для сравнений по дню приводите обе даты через НачалоДня().
Отдельно проверяйте случай пустой даты. Если реквизит не заполнен (значение 01.01.0001), прибавление 10 дней даст 11.01.0001 — формально корректно, но бессмысленно для учёта. Перед расчётом добавьте проверку: Если ЗначениеЗаполнено(ДатаДокумента) Тогда ....
Практические сценарии применения
Срок оплаты в печатной форме
Классическая задача — вывести в счёте строку «Оплатить до …». В модуле менеджера печати или в макете с параметрами вычислите дату заранее и передайте её параметром:
Параметры.СрокОплаты = Формат(
ДобавитьКДате(Документ.Дата; "ДЕНЬ"; 10); "ДЛФ=DD");
Отбор документов за период «10 дней вперёд»
Для отбора заказов, которые нужно отгрузить в ближайшие 10 дней, удобно вычислить границу периода в коде и передать её в запрос:
ГраницаОтгрузки = КонецДня(ДобавитьКДате(ТекущаяДата(); "ДЕНЬ"; 10));
Запрос.УстановитьПараметр("Граница", ГраницаОтгрузки);
Здесь КонецДня() важен: без него документы, созданные после текущего времени в последний день периода, в выборку не попадут.
Рабочие дни вместо календарных
Все описанные способы прибавляют календарные дни. Если по договору требуется «10 рабочих дней», простой арифметики недостаточно — нужен производственный календарь. В типовых конфигурациях для этого используются механизмы календарных графиков (например, функции работы с регистром «Календарные графики» в БСП). Самостоятельно «в лоб» такой расчёт писать не стоит: праздники и переносы выходных меняются каждый год.
Что важно запомнить
В коде используйте ДобавитьКДате(Дата; "ДЕНЬ"; 10) или Дата + 10 * 86400, в запросах — ДОБАВИТЬКДАТЕ(Дата, ДЕНЬ, 10). Следите за составляющей времени и пустыми датами. Для рабочих дней применяйте производственный календарь, а не арифметику.
Частые вопросы
Почему Дата + 10 не прибавляет 10 дней?
Потому что при сложении даты с числом единицей измерения является секунда. Запись Дата + 10 сдвигает дату на 10 секунд. Для десяти дней нужно Дата + 10 * 86400 или функция ДобавитьКДате.
Как прибавить 10 дней к дате в запросе 1С?
Используйте функцию ДОБАВИТЬКДАТЕ(ПолеДаты, ДЕНЬ, 10). Тип единицы пишется без кавычек, а количество дней можно передавать параметром запроса через &ИмяПараметра.
Как отнять 10 дней от даты?
Два варианта: ДобавитьКДате(Дата; "ДЕНЬ"; -10) или Дата - 10 * 86400. Оба корректно переходят через границу месяца и года.
Что делать, если результат сместился не на 10 дней, а на месяц?
Проверьте, не перепутаны ли параметры ДобавитьКДате: второй параметр — тип единицы строкой ("ДЕНЬ"), третий — количество. Если вместо "ДЕНЬ" указан "МЕСЯЦ", результат сдвинется на 10 месяцев. Также убедитесь, что не применяете функцию дважды к уже изменённой дате.
Как прибавить 10 рабочих дней, а не календарных?
Простой арифметикой это не решается. Нужен производственный календарь: в типовых конфигурациях используются календарные графики и соответствующие функции Библиотеки стандартных подсистем, которые учитывают выходные и праздники.
Сохранится ли время в дате после прибавления дней?
Да. Если исходная дата содержит время (например, 14:35:20), то и результат будет содержать то же время. Чтобы получить начало дня, оберните результат в НачалоДня(), а для включения всего дня в период используйте КонецДня().