Разработка и Конфигурация · 11 мин
Как прибавить время в 1С: способы, примеры кода и типичные ошибки
Как прибавить время к дате в 1С: функция ДобавитьКДате, операции с секундами, примеры кода, типичные ошибки и проверка результата в запросах и отчётах.
Во встроенном языке 1С дата и время хранятся одним типом «Дата», и прибавить часы, минуты или секунды можно двумя основными способами: арифметикой с секундами и функцией ДобавитьКДате. Выбор зависит от задачи: для точных интервалов внутри суток обычно достаточно сложения секунд, а для календарных сдвигов (месяцы, кварталы) нужна специальная функция.
Новички часто пытаются складывать даты как строки или используют форматирование, из-за чего получают ошибку преобразования типов. Ниже разобраны рабочие приёмы с примерами кода, отличия для запросов, границы применимости каждого способа и типичные ошибки, которые приводят к неверным датам в документах и отчётах.
Основное правило простое: в 1С один день равен 86400 секундам, и любое смещение времени сводится либо к сложению с числом секунд, либо к вызову функции с явным указанием единицы измерения. Поняв эти два механизма, вы сможете решить любую задачу: от «прибавить 15 минут к времени документа» до «рассчитать дедлайн через 3 рабочих дня».
Как устроен тип «Дата» и почему время прибавляется секундами
Тип «Дата» в 1С всегда содержит и календарную дату, и время с точностью до секунды. Даже если вы видите на форме только «12.03.2026», внутри хранится полное значение вида 12.03.2026 0:00:00. Поэтому любые операции со временем — это операции с тем же самым типом, без отдельного типа «Время».
Платформа позволяет складывать дату с числом, и это число интерпретируется как количество секунд. Отсюда простые константы: минута — 60 секунд, час — 3600, сутки — 86400. Выражение ДатаДокумента + 3600 вернёт ту же дату, сдвинутую на час вперёд.
Вычитание двух дат, наоборот, возвращает число — разницу в секундах. Это удобно для расчёта длительности: Разница = ДатаОкончания - ДатаНачала; даст количество секунд между событиями, которое затем можно перевести в часы или минуты делением.
Способ 1: прибавить время сложением с секундами
Самый быстрый способ сдвинуть время внутри суток — прибавить нужное количество секунд. Подходит для минут, часов и целых суток, когда не требуется календарная логика перехода через месяцы разной длины.
ДатаДокумента = ТекущаяДатаСеанса();
// Прибавить 15 минут
Через15Минут = ДатаДокумента + 15 * 60;
// Прибавить 2 часа
Через2Часа = ДатаДокумента + 2 * 3600;
// Прибавить сутки
Завтра = ДатаДокумента + 86400;
Для читаемости кода удобно завести функцию-обёртку, особенно если операция встречается в нескольких местах модуля. Тогда вместо «магических чисел» в коде будет явно видно, что именно прибавляется.
Функция ПрибавитьМинуты(Дата, Минуты)
Возврат Дата + Минуты * 60;
КонецФункции
Функция ПрибавитьЧасы(Дата, Часы)
Возврат Дата + Часы * 3600;
КонецФункции
Учтите ограничение: сложение секунд не учитывает календарные особенности. Прибавление «30 дней» через 30 * 86400 и прибавление одного месяца — разные операции, и для месяцев, кварталов и лет нужен второй способ.
Способ 2: функция ДобавитьКДате
Функция ДобавитьКДате(ИсходнаяДата; ТипЕдиницы; Количество) выполняет календарный сдвиг с учётом реальной структуры календаря. Второй параметр задаёт единицу измерения: Секунда, Минута, Час, День, Неделя, Месяц, Квартал, Год, Декада, Полугодие.
// Прибавить 1 месяц к дате
СледующийМесяц = ДобавитьКДате(ДатаДокумента, "Месяц", 1);
// Прибавить 3 рабочих интервала по 10 дней
Через30Дней = ДобавитьКДате(ДатаДокумента, "День", 30);
// Прибавить 45 минут
НовоеВремя = ДобавитьКДате(ДатаДокумента, "Минута", 45);
Ключевое отличие от секундной арифметики видно на примере месяцев: ДобавитьКДате('31.01.2026', "Месяц", 1) вернёт 28.02.2026, потому что в феврале нет 31 числа. Платформа автоматически подставляет последний день месяца. Сложение секунд такого результата не даст — оно просто сдвинет дату на фиксированное число суток.
Тип единицы можно передавать строкой или через перечисление ТипЕдиницыИзмеренияВремени.Месяц — оба варианта рабочие. Для отрицательного сдвига (вычесть время) передавайте отрицательное количество: ДобавитьКДате(Дата, "Час", -2).
Сравнение способов
Быстро и коротко для минут, часов, суток. Не подходит для календарных месяцев и лет.
Корректная календарная арифметика для месяцев, кварталов, лет. Чуть многословнее в записи.
Когда сдвиг нужен прямо в выборке данных без обхода результата в коде.
Как прибавить время в запросе 1С
В языке запросов доступна функция ДОБАВИТЬКДАТЕ(Дата, Тип, Количество) с теми же единицами измерения. Она позволяет вычислять сдвинутые даты на уровне СУБД, не выгружая данные в код для построчной обработки — это быстрее и чище.
ВЫБРАТЬ
Заказ.Дата КАК ДатаЗаказа,
ДОБАВИТЬКДАТЕ(Заказ.Дата, ЧАС, 3) КАК ДедлайнСборки,
ДОБАВИТЬКДАТЕ(Заказ.Дата, ДЕНЬ, 5) КАК ДатаОтгрузки
ИЗ
Документ.ЗаказПокупателя КАК Заказ
ГДЕ
Заказ.Дата МЕЖДУ &НачалоПериода И &КонецПериода
Типичный сценарий — фильтрация по скользящему окну: выбрать документы за последние сутки относительно текущей даты. Для этого параметр границы вычисляется в коде через ДобавитьКДате(ТекущаяДатаСеанса(), "День", -1) и передаётся в запрос, либо сдвиг выполняется прямо в условии ГДЕ.
Помните, что в запросах функция работает только с полями и параметрами типа «Дата». Если поле составного типа и может содержать, например, строку, сначала приведите его через ВЫРАЗИТЬ(... КАК ДАТА), иначе получите ошибку исполнения запроса.
- 1Определите поле типа Дата, которое нужно сдвинуть
- 2Выберите единицу: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, МЕСЯЦ и т.д.
- 3Добавьте в текст запроса ДОБАВИТЬКДАТЕ(Поле, Единица, Количество)
- 4Выполните запрос в консоли и проверьте значения на границах суток и месяцев
Практические сценарии: документы, сроки, регистры
Установить время документа внутри дня
Частая задача — провести документ не текущим временем, а, например, концом дня. Для этого берут начало дня и прибавляют нужное число секунд: Дата = НачалоДня(ТекущаяДатаСеанса()) + 23 3600 + 59 60 + 59; — получится 23:59:59. Аналогично работают функции КонецДня(), НачалоЧаса(), КонецМесяца(), которые сразу возвращают граничные моменты.
Рассчитать дедлайн от даты документа
Если по бизнес-процессу на обработку заявки даётся 4 часа, дедлайн вычисляется как ДобавитьКДате(Заявка.Дата, "Час", 4) и записывается в реквизит или регистр сведений. Хранить вычисленный срок надёжнее, чем пересчитывать его каждый раз, — при изменении правил старые записи сохранят исторически верные значения.
Разница между двумя моментами времени
Для расчёта фактической длительности операции вычтите даты и переведите секунды в удобные единицы: ЧасовРаботы = (ДатаОкончания - ДатаНачала) / 3600;. Если результат должен быть целым числом часов с округлением вверх, используйте Цел() с корректировкой или функцию Окр().
При расчёте длительности в часах деление 3600 даёт дробное число. Если результат используется в печатной форме, заранее решите, как округлять: Окр() до целого или форматирование с одним знаком после запятой через Формат().
Типичные ошибки и как их избежать
Самая частая ошибка — попытка сложить дату со строкой вида Дата + "3600" или прибавить время через строковое форматирование. Встроенный язык строго типизирован: сложение допустимо только с числом, иначе возникает ошибка преобразования типов.
Вторая группа ошибок связана с путаницей между ТекущаяДата() и ТекущаяДатаСеанса(). В клиент-серверном режиме ТекущаяДата() на клиенте вернёт время компьютера пользователя, которое может отличаться от серверного. Для расчётов, влияющих на данные базы, используйте ТекущаяДатаСеанса() — она едина для всех пользователей сеанса.
Третья ошибка — использование секундной арифметики там, где нужен календарный сдвиг. Прибавление 365 * 86400 вместо ДобавитьКДате(Дата, "Год", 1) в високосные годы даст смещение на сутки. Для любых единиц крупнее недели применяйте только ДобавитьКДате.
Проверка результата и граничные случаи
Перед выводом кода в рабочую базу проверьте вычисления на граничных датах: переход через полночь, конец месяца (особенно 31 января → февраль), конец года и високосный февраль. Удобно сделать это в консоли кода или через Сообщить() в тестовой обработке.
Для отладки выводите даты в полном формате: Формат(НоваяДата, "ДЛФ=DT") покажет и дату, и время. Если видеть только календарную часть, легко пропустить ошибку в сдвиге часов и минут.
Отдельно проверьте поведение с незаполненными датами. Пустая дата в 1С — это 01.01.0001 0:00:00, и любой сдвиг от неё даст технически корректное, но бессмысленное значение. Перед вычислениями добавляйте проверку Если ЗначениеЗаполнено(ДатаДокумента) Тогда ... КонецЕсли;.
Как проверить результат
23:50 + 20 минут даёт 00:10 следующего дня
Время сбрасывается или дата не меняется
31.01 + 1 месяц = последний день февраля
Получается несуществующая или съехавшая дата
Код пропускает вычисление или выдаёт понятное сообщение
В данных появляются даты января года 1
Часто задаваемые вопросы
Как прибавить к дате только время, не меняя календарный день?
Если гарантированно не будет перехода через полночь, прибавьте нужное число секунд. Если переход возможен и его нужно запретить, сравните результат с КонецДня(ИсходнаяДата) и при превышении обрежьте значение или обработайте ситуацию отдельной веткой логики.
Как вычесть время, а не прибавить?
Оба способа работают в обе стороны: вычитайте секунды (Дата - 3600) или передавайте отрицательное количество в ДобавитьКДате, например ДобавитьКДате(Дата, "Месяц", -1) для даты месяц назад.
Чем отличается ТекущаяДата() от ТекущаяДатаСеанса()?
ТекущаяДата() возвращает время того компьютера, где выполняется код, и на клиенте это часы рабочей станции пользователя. ТекущаяДатаСеанса() — единое серверное время сеанса. Для расчётов, сохраняемых в базу, правильно использовать второй вариант.
Как прибавить рабочие дни с учётом производственного календаря?
Встроенная функция ДобавитьКДате не знает о праздниках. Нужно использовать регистр сведений с данными производственного календаря: в цикле прибавлять по одному дню и проверять, является ли день рабочим, пока не наберётся нужное количество.
Можно ли прибавить время к дате прямо в СКД?
Да, в вычисляемых полях СКД доступна функция ДобавитьКДате языка выражений, а в тексте запроса набора данных — функция ДОБАВИТЬКДАТЕ. Для сложных календарных расчётов лучше выполнять сдвиг в запросе набора данных.
Почему после сдвига в отчёте время отображается без часов и минут?
Значение сдвинуто правильно, проблема в формате вывода. Проверьте форматную строку поля: для показа времени нужен формат вида ДЛФ=DT или явное указание шаблона с часами и минутами через Формат().
Что важно запомнить
В 1С время прибавляется двумя способами: сложением даты с числом секунд для минут, часов и суток, и функцией ДобавитьКДате для календарных единиц — месяцев, кварталов, лет. В запросах используйте ДОБАВИТЬКДАТЕ. Берите время через ТекущаяДатаСеанса(), проверяйте заполненность исходной даты и тестируйте вычисления на границах суток и месяцев.