Разработка и Конфигурация · 10 мин
Как прибавить дату в 1С: рабочие способы с примерами
Как прибавить дни, месяцы и годы к дате в 1С: функция ДобавитьМесяц, арифметика с секундами, ДОБАВИТЬКДАТЕ в запросах. Примеры кода и типичные ошибки.
Операция «прибавить к дате период» встречается в 1С постоянно: расчёт срока оплаты по договору, даты окончания гарантии, периода действия скидки, плановой даты отгрузки. При этом встроенного оператора «дата + месяц» в платформе нет, и попытка сложить даты напрямую приводит к ошибке или неверному результату.
Причина в том, что дата в 1С — это не число дней, а значение специального типа, хранящее момент времени с точностью до секунды. Поэтому для разных задач используются разные механизмы: арифметика с секундами, функция ДобавитьМесяц() и функция языка запросов ДОБАВИТЬКДАТЕ. Выбор зависит от того, что именно нужно прибавить — дни, месяцы или годы — и где выполняется расчёт: в коде или в запросе.
Ниже разобраны все рабочие способы с точными примерами кода, ограничения каждого подхода и типичные ошибки, из-за которых даты «уезжают» на неожиданные значения.
Как устроена дата в 1С и почему нельзя складывать даты напрямую
Тип «Дата» в 1С хранит момент времени с точностью до секунды: дату и время одновременно. Даже если вы видите на экране только «15.03.2026», внутри значения присутствует время — по умолчанию 00:00:00. Это важно, потому что все арифметические операции с датой выполняются именно в секундах.
Платформа разрешает две операции: прибавить к дате число (получится новая дата, сдвинутая на указанное число секунд) и вычесть из одной даты другую (получится разница в секундах). Операция «дата + дата» запрещена и вызовет ошибку исполнения.
Из этого следует главное практическое правило: чтобы прибавить период, его нужно выразить в секундах либо использовать специальные функции для календарных периодов — месяцев и лет, длина которых непостоянна.
Как прибавить дни, часы и минуты к дате в коде
Для фиксированных интервалов — секунд, минут, часов, дней, недель — используется простое сложение. Число интерпретируется как количество секунд, поэтому дни удобно записывать через умножение, чтобы код читался явно.
ДатаОтгрузки = ДатаЗаказа + 3 * 86400; // плюс 3 дня
ДатаОплаты = ДатаСчета + 14 24 3600; // плюс 14 дней
ВремяКонца = ВремяНачала + 3600; // плюс 1 час
ДатаНеделя = ДатаНачала + 7 * 86400; // плюс неделя
Константу 86400 (60 × 60 × 24) стоит запомнить или вынести в именованную переменную — так код легче проверять. Запись Дата + 3 прибавит не три дня, а три секунды, и это одна из самых частых ошибок начинающих разработчиков.
Вычитание работает симметрично: Дата - 86400 вернёт ту же дату минус сутки. Если нужно узнать разницу между датами в днях, вычтите одну дату из другой и разделите результат на 86400, округлив при необходимости функцией Цел().
Как прибавить месяцы и годы функцией ДобавитьМесяц
Месяц и год — календарные периоды переменной длины, поэтому прибавлять их через секунды нельзя: «30 дней» не равно месяцу. Для этого в глобальном контексте есть функция ДобавитьМесяц(Дата, ЧислоМесяцев), которая корректно работает с разной длиной месяцев и високосными годами.
СледующийМесяц = ДобавитьМесяц(ДатаДоговора, 1); // плюс месяц
ЧерезКвартал = ДобавитьМесяц(ДатаДоговора, 3); // плюс квартал
ЧерезГод = ДобавитьМесяц(ДатаДоговора, 12); // плюс год
МесяцНазад = ДобавитьМесяц(ДатаДоговора, -1); // минус месяц
Функция сохраняет номер дня, насколько это возможно. Если целевой месяц короче — например, прибавить месяц к 31 января — результатом будет последний день февраля (28 или 29 число), а не 3 марта. Это осознанное поведение платформы, и его нужно учитывать при расчёте повторяющихся платежей: цепочка «последний день месяца + 1 месяц» будет «прилипать» к концам месяцев.
Время суток при использовании ДобавитьМесяц() сохраняется: к дате 10.01.2026 15:45:00 прибавление месяца даст 10.02.2026 15:45:00.
Как прибавить период к дате в запросе: ДОБАВИТЬКДАТЕ
В языке запросов арифметика с секундами недоступна — там используется функция ДОБАВИТЬКДАТЕ(Дата, ТипПериода, Количество). Она универсальна и поддерживает периоды от секунды до года, что делает её удобнее кода для смешанных расчётов.
ВЫБРАТЬ
Заказы.Ссылка КАК Заказ,
ДОБАВИТЬКДАТЕ(Заказы.Дата, ДЕНЬ, 5) КАК ДатаОтгрузки,
ДОБАВИТЬКДАТЕ(Заказы.Дата, МЕСЯЦ, 1) КАК СрокОплаты,
ДОБАВИТЬКДАТЕ(Заказы.Дата, ГОД, 1) КАК Годовщина
ИЗ
Документ.ЗаказПокупателя КАК Заказы
Допустимые типы периода: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ПОЛУГОДИЕ, ГОД. Количество может быть отрицательным — тогда период вычитается.
Обратная функция — РАЗНОСТЬДАТ(Дата1, Дата2, ТипПериода) — возвращает разницу между датами в заданных единицах. Она полезна для проверки результата: например, убедиться, что между исходной и рассчитанной датой ровно три месяца.
// Код: прибавить 10 рабочих дней по календарю нельзя напрямую — только календарные
НоваяДата = ДобавитьМесяц(ДатаДокумента, 6);
НоваяДата = ДатаДокумента + 10 * 86400;
// Запрос: ДОБАВИТЬКДАТЕ(&Дата, ДЕНЬ, 10)Как прибавить рабочие дни с учётом производственного календаря
Частая бизнес-задача — «прибавить 5 рабочих дней», и здесь простая арифметика не помогает: платформа не знает сама, какие дни праздничные. Стандартный подход в типовых конфигурациях — использовать регистр сведений «Данные производственного календаря» (в БСП — подсистема «Календарные графики»).
Алгоритм такой: запросом выбрать из календаря даты, начиная со следующего дня после исходной, отсортировать по возрастанию и взять N-ю рабочую дату. В типовых конфигурациях на базе БСП есть готовые программные интерфейсы, например методы общего модуля КалендарныеГрафики, которые формируют даты по графику работы.
Если конфигурация самописная и календаря нет, минимально корректный вариант — цикл: прибавлять по одному дню и пропускать субботу и воскресенье (день недели возвращает функция ДеньНедели()). Праздники такой способ не учтёт, поэтому для расчётов с юридически значимыми сроками без производственного календаря обойтись нельзя.
Как выбрать способ и проверить результат
Выбор механизма определяется типом периода и местом расчёта. Дни и меньше — арифметика секунд в коде. Месяцы и годы в коде — только ДобавитьМесяц(). В запросах и СКД — всегда ДОБАВИТЬКДАТЕ, потому что других средств там нет. Рабочие дни — через производственный календарь.
Для проверки результата удобно вывести исходную и итоговую даты через Сообщить() в явном формате, например Формат(НоваяДата, "ДЛФ=DT"), чтобы видеть и дату, и время. Скрытое время — частая причина «несовпадающих» дат при сравнениях: дата с временем 14:00 не равна той же дате с временем 00:00.
Если результат сравнивается с границей периода, используйте КонецДня() или НачалоДня() для нормализации. При выгрузке в запрос проверяйте, что параметр имеет тип «Дата», а не строка — неявное преобразование строки в дату зависит от региональных настроек и может дать неверный результат.
Как выбрать действие
Как проверить результат
Время совпадает с исходным или явно нормализовано через НачалоДня/КонецДня
Появилось или пропало время, сравнения дат дают ложное неравенство
ДобавитьМесяц от 31.01 дал последний день февраля — это ожидаемо
Использовалось сложение секунд, и дата уехала на начало марта
РАЗНОСТЬДАТ возвращает ровно заданное количество периодов
Разница больше или меньше — вероятно, перепутаны единицы (секунды вместо дней)
Частые вопросы о работе с датами в 1С
Можно ли прибавить к дате сразу «1 месяц и 5 дней»?
Да, последовательно: сначала ДобавитьМесяц(Дата, 1), затем к результату прибавить 5 * 86400. Порядок важен: прибавление месяца к 31 января сначала даст конец февраля, и пять дней будут отсчитываться уже от него. В запросе это делается вложенными вызовами ДОБАВИТЬКДАТЕ.
Почему Дата + 1 не прибавляет день?
Потому что единица при сложении с датой — одна секунда, а не одни сутки. Чтобы прибавить день, пишите Дата + 86400 или Дата + 24 * 3600. Визуально дата при прибавлении секунды почти не меняется, поэтому ошибка часто остаётся незамеченной до сравнения дат.
Как прибавить месяц так, чтобы получить тот же день, а не конец месяца?
Никак напрямую — ДобавитьМесяц() при отсутствии такого дня всегда возвращает последний день месяца. Если бизнес-логика требует иное (например, перенос на первое число следующего месяца), проверяйте результат вручную: сравнивайте День(Результат) с исходным днём и корректируйте.
Как прибавить дату в СКД или динамическом списке?
В СКД и динамических списках работают функции языка запросов, поэтому используйте ДОБАВИТЬКДАТЕ в тексте запроса набора данных. В вычисляемых полях СКД на языке выражений системы компоновки функции добавления дат нет — расчёт нужно выполнять на уровне запроса.
Чем отличается пустая дата и как с ней работать при расчётах?
Пустая дата — это 01.01.0001 00:00:00, литерал '00010101'. Прибавление периода к пустой дате даст дату от начала летоисчисления, что почти всегда ошибка. Перед расчётом проверяйте заполненность: Если ЗначениеЗаполнено(ДатаДокумента) Тогда ....
Как получить разницу между датами в месяцах?
В запросе — РАЗНОСТЬДАТ(Дата1, Дата2, МЕСЯЦ). В коде готовой функции нет: либо перебором с ДобавитьМесяц() в цикле, либо расчётом (Год2 - Год1) * 12 + Месяц2 - Месяц1 с поправкой на день месяца, если нужна точность до полных месяцев.
Что важно запомнить
Дни и часы прибавляйте секундами (сутки = 86400), месяцы и годы — функцией ДобавитьМесяц, в запросах — ДОБАВИТЬКДАТЕ. Учитывайте скрытое время в датах, поведение на коротких месяцах и используйте производственный календарь для рабочих дней.