Работа с датами в 1С:Предприятие — одна из самых частых задач, с которыми сталкиваются и бухгалтеры при формировании отчетов, и программисты при разработке конфигураций. Добавление дней к текущей или произвольной дате требуется для расчета сроков оплаты, поставки, исполнения договоров, а также для автоматизации бизнес-процессов. В этой статье мы разберем все возможные способы, как прибавить дни к дате в 1С 8.3 и 8.2 — от стандартных функций платформы до программного кода и SQL-запросов.

Вы узнаете не только базовые методы вроде функции ДобавитьМесяц(), но и нюансы работы с календарными и рабочими днями, учетом праздников, а также типичные ошибки, которые приводят к сбоям в расчетах. Материал будет полезен как начинающим пользователям, так и опытным разработчикам, которые хотят оптимизировать свой код.

Способ 1: Стандартная функция ДобавитьДень() — самый простой вариант

Если вам нужно просто сдвинуть дату на определенное количество дней — без учета выходных, праздников или других особенностей — достаточно воспользоваться встроенной функцией ДобавитьДень(). Она работает во всех версиях платформы 1С:Предприятие и не требует дополнительных настроек.

Синтаксис функции:

ДобавитьДень(Дата, КоличествоДней)

Где:

  • 📅 Дата — исходная дата (может быть текущей датой, датой документа или любой другой).
  • КоличествоДней — целое число (положительное или отрицательное), на которое нужно сдвинуть дату.

Примеры использования:

// Прибавить 5 дней к текущей дате

Результат = ДобавитьДень(ТекущаяДата(), 5);

// Отнять 3 дня от даты документа

НоваяДата = ДобавитьДень(Документ.Дата, -3);

💡

Если вам нужно прибавить не дни, а месяцы или годы, используйте аналогичные функции ДобавитьМесяц() и ДобавитьГод(). Они автоматически корректируют дату с учетом количества дней в месяце (например, 31 января + 1 месяц = 28 февраля).

Эта функция не учитывает рабочие/выходные дни. Если вам нужно пропустить субботу и воскресенье, используйте методы из следующих разделов.

Способ 2: Работа с календарными днями через Календарь и РабочиеДни

Когда требуется добавить только рабочие дни (исключая субботу, воскресенье и праздники), стандартной функции ДобавитьДень() недостаточно. В этом случае используйте объекты Календарь и РабочиеДни, которые позволяют гибко настраивать правила учета рабочего времени.

Алгоритм действий:

  1. Создайте объект Календарь и укажите в нем рабочие дни недели.
  2. При необходимости добавьте исключения (праздники или дополнительные рабочие дни).
  3. Используйте метод ДобавитьРабочиеДни() для расчета новой даты.

Пример кода:

Календарь = Новый Календарь(РежимРабочегоВремени.Пятидневка);

Календарь.ДобавитьИсключение(Новый ДиапазонДаты('20260101', '20260108')); // Новый год

НоваяДата = Календарь.ДобавитьРабочиеДни(ТекущаяДата(), 10); // +10 рабочих дней

Этот метод учитывает производственный календарь, поэтому если вы добавляете 5 рабочих дней начиная с пятницы, результат будет не понедельник, а следующий четверг (пропуская субботу, воскресенье и понедельник как выходные).

Как добавить праздники в календарь автоматически?

Для автоматического заполнения праздников можно использовать обработку "Производственный календарь" из стандартных поставок 1С или подключить внешнюю обработку с актуальными данными по регионам. Например, в конфигурации "Зарплата и управление персоналом" уже есть готовый календарь с российскими праздниками.

Способ 3: Использование запросов 1С для массовой обработки дат

Если вам нужно прибавить дни к датам в большой таблице (например, в документах или регистрах), удобнее использовать запрос на языке 1С. Это позволит обработать тысячи записей за считанные секунды без циклов в коде.

Пример запроса для добавления 7 дней ко всем датам в таблице документов:

ВЫБРАТЬ

Документ.Ссылка КАК Ссылка,

ДобавитьДень(Документ.Дата, 7) КАК НоваяДата

ИЗ

Документ.ЗаказПокупателя КАК Документ

Для рабочих дней запрос будет сложнее — потребуется присоединить календарь:

ВЫБРАТЬ

Документ.Ссылка КАК Ссылка,

Календарь.ДобавитьРабочиеДни(Документ.Дата, 5) КАК НоваяДата

ИЗ

Документ.ЗаказПокупателя КАК Документ

ЛЕВОЕ СОЕДИНЕНИЕ Календарь.Производственный КАК Календарь

ПО 1 = 1

📊 Какой способ добавления дней вы используете чаще?
Стандартную функцию ДобавитьДень()
Календарь с рабочими днями
Запросы 1С
Программный код на встроенном языке
Другой вариант

Запросы особенно полезны для отчетов, где требуется показать даты с учетом различных сдвигов. Например, в отчете по просроченным платежам можно автоматически рассчитать дату оплаты как "дата документа + 14 дней".

Способ 4: Программный код для сложных сценариев

Когда стандартных функций недостаточно (например, нужно учитывать индивидуальный график работы сотрудников или сложные правила переноса праздников), приходится писать собственный код на встроенном языке .

Пример функции, которая добавляет дни с учетом персонального графика:

Функция ДобавитьДниСУчетомГрафика(ДатаНачала, КоличествоДней, ГрафикРаботы)

ТекущаяДата = ДатаНачала;

ОсталосьДней = КоличествоДней;

Пока ОсталосьДней > 0 Цикл

ТекущаяДата = ДобавитьДень(ТекущаяДата, 1);

Если ГрафикРаботы.ЭтоРабочийДень(ТекущаяДата) Тогда

ОсталосьДней = ОсталосьДней - 1;

КонецЕсли;

КонецЦикла;

Возврат ТекущаяДата;

КонецФункции

Где ГрафикРаботы — это объект, который содержит правила рабочих дней для конкретного сотрудника или отдела. Такой подход позволяет:

  • 🔄 Учитывать сменный график (например, 2 через 2).
  • 🏢 Применять разные правила для разных подразделений.
  • 📅 Динамически изменять график (например, в декабре добавить дополнительные рабочие дни).

✅ Убедитесь, что функция обрабатывает отрицательное количество дней (сдвиг в прошлое)

✅ Проверьте корректность работы на границах месяцев/лет

✅ Протестируйте с датами, попадающими на праздники

✅ Оптимизируйте цикл для больших значений (например, +1000 дней)-->

Этот метод требует больше усилий на разработку, но дает максимальную гибкость для нестандартных бизнес-процессов. Например, в логистике можно учитывать дни доставки только по четным числам или исключать определенные дни недели для конкретных маршрутов.

Способ 5: Работа с датами в SQL-запросах (для внешних источников)

Если вы работаете с внешними базами данных (например, Microsoft SQL Server или PostgreSQL) через механизм ADODB или HTTP-Сервисы, добавление дней реализуется прямо в SQL-запросе. Это удобно для интеграций, когда данные хранятся вне .

Примеры SQL-кода для разных СУБД:

СУБД Синтаксис Пример
MS SQL Server DATEADD(day, N, date) SELECT DATEADD(day, 5, OrderDate) FROM Orders
PostgreSQL date + integer SELECT order_date + 5 FROM orders
MySQL DATE_ADD(date, INTERVAL N DAY) SELECT DATE_ADD(order_date, INTERVAL 5 DAY) FROM orders
Oracle date + N SELECT order_date + 5 FROM orders

В результат SQL-запроса можно получить так:

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ

| Подключение.ВыполнитьСкаллярный(""SELECT DATEADD(day, 5, '2026-01-01'')"") КАК НоваяДата";

Результат = Запрос.Выполнить();

💡

При работе с внешними БД всегда проверяйте формат даты! В SQL даты часто передаются в формате YYYY-MM-DD, а в 1С — как ДД.ММ.ГГГГ. Используйте функции преобразования, чтобы избежать ошибок.

Этот способ актуален для распределенных систем, где часть логики вынесена на сервер баз данных. Например, если в вашей компании даты хранения документов рассчитываются на стороне SQL Server, а в только отображаются.

Типичные ошибки и как их избежать

Даже опытные разработчики иногда сталкиваются с проблемами при работе с датами в . Вот самые распространенные ошибки и способы их решения:

⚠️ Внимание: Если вы добавляете дни к дате в 31.01.2026 и получаете 02.03.2026 вместо 28.02.2026, проверьте, не используете ли вы по ошибке ДобавитьМесяц(Дата, 1) вместо ДобавитьДень(Дата, 30). Функции ДобавитьМесяц() и ДобавитьГод() автоматически корректируют дату до последнего дня месяца!

Другие частые проблемы:

  • 🗓️ Неучет временной зоны: Если вы работаете с сервером в другом часовом поясе, даты могут сдвигаться на ± несколько часов. Используйте НачалоДня() для приведения к началу суток.
  • 🔄 Циклы с бесконечным добавлением: При ручной проверке рабочих дней в цикле (способ 4) легко упустить условие выхода, что приведет к зависанию системы. Всегда ограничивайте количество итераций.
  • 📊 Округление в запросах: В некоторых версиях при сложении дат и чисел в запросах может происходить неявное округление. Явно приводите типы с помощью ДАТАВРЕМЯ().

Чтобы избежать ошибок:

  1. Всегда тестируйте код на граничных значениях (конец месяца, високосный год, переход на зимнее/летнее время).
  2. Используйте Сообщить() для вывода промежуточных результатов при отладке.
  3. Для критичных расчетов (например, сроков исковой давности) дублируйте логику в тестовых обработках.

FAQ: Ответы на частые вопросы

Можно ли добавить к дате не целые дни, а часы или минуты?

Да, для этого используйте функцию ДобавитьСекунды() или работайте с типом ДатаВремя. Примеры:

// Добавить 5 часов

НоваяДата = ДобавитьСекунды(ТекущаяДата(), 5 * 3600);

// Добавить 30 минут

НоваяДата = ТекущаяДата() + 30 * 60;

Обратите внимание, что при выводе даты без времени (формат ДД.ММ.ГГГГ) дробная часть будет отброшена.

Как добавить дни к дате в отчете без изменения исходных данных?

В настройках отчета создайте вычисляемое поле с формулой:

  1. Откройте схему компоновки данных.
  2. Добавьте новое поле типа "Выражение".
  3. Укажите выражение: ДобавитьДень([ДатаДокумента], 10).

Это поле будет отображаться в отчете, но не изменит данные в базе.

Почему при добавлении 1 дня к 31.12.2026 получаю 31.12.2026, а не 01.01.2026?

Скорее всего, вы работаете с полем типа Дата (без времени), и функция ДобавитьДень() возвращает дату в формате ДД.ММ.ГГГГ 00:00:00. При приведении к типу Дата время обрезается, и если исходная дата тоже была без времени, визуально ничего не меняется.

Решение: используйте НачалоДня(ДобавитьДень(Дата, 1)) или явно приводите к типу ДатаВремя.

Как учесть региональные праздники (например, в Татарстане или Башкортостане)?

Для учета региональных праздников:

  1. Скачайте актуальный производственный календарь для вашего региона (например, с сайта местного правительства).
  2. Импортируйте даты праздников в справочник Календари или ИсключенияКалендаря.
  3. При создании объекта Календарь добавьте эти исключения:
Календарь = Новый Календарь(РежимРабочегоВремени.Пятидневка);

Для Каждого Праздник Из Справочник.РегиональныеПраздники Цикл

Календарь.ДобавитьИсключение(Праздник.Дата);

КонецЦикла;

Можно ли добавить дни к дате в мобильном приложении 1С?

Да, в мобильной платформе 1С:Предприятие доступны те же функции: ДобавитьДень(), Календарь и запросы. Однако учитывайте:

  • 📱 На мобильных устройствах производительность циклов ниже — оптимизируйте код.
  • 🔄 Синхронизируйте производственные календари с сервером, чтобы избежать расхождений.
  • 📅 Для отображения дат используйте формат, адаптированный под маленькие экраны (например, Формат(Дата, "ДФ=dd.MM")).