Работа с датами в 1С:Предприятие — одна из самых частых задач, с которыми сталкиваются и бухгалтеры при формировании отчетов, и программисты при разработке конфигураций. Добавление дней к текущей или произвольной дате требуется для расчета сроков оплаты, поставки, исполнения договоров, а также для автоматизации бизнес-процессов. В этой статье мы разберем все возможные способы, как прибавить дни к дате в 1С 8.3 и 8.2 — от стандартных функций платформы до программного кода и SQL-запросов.
Вы узнаете не только базовые методы вроде функции ДобавитьМесяц(), но и нюансы работы с календарными и рабочими днями, учетом праздников, а также типичные ошибки, которые приводят к сбоям в расчетах. Материал будет полезен как начинающим пользователям, так и опытным разработчикам, которые хотят оптимизировать свой код.
Способ 1: Стандартная функция ДобавитьДень() — самый простой вариант
Если вам нужно просто сдвинуть дату на определенное количество дней — без учета выходных, праздников или других особенностей — достаточно воспользоваться встроенной функцией ДобавитьДень(). Она работает во всех версиях платформы 1С:Предприятие и не требует дополнительных настроек.
Синтаксис функции:
ДобавитьДень(Дата, КоличествоДней)
Где:
- 📅 Дата — исходная дата (может быть текущей датой, датой документа или любой другой).
- ➕ КоличествоДней — целое число (положительное или отрицательное), на которое нужно сдвинуть дату.
Примеры использования:
// Прибавить 5 дней к текущей дате
Результат = ДобавитьДень(ТекущаяДата(), 5);
// Отнять 3 дня от даты документа
НоваяДата = ДобавитьДень(Документ.Дата, -3);
Если вам нужно прибавить не дни, а месяцы или годы, используйте аналогичные функции ДобавитьМесяц() и ДобавитьГод(). Они автоматически корректируют дату с учетом количества дней в месяце (например, 31 января + 1 месяц = 28 февраля).
Эта функция не учитывает рабочие/выходные дни. Если вам нужно пропустить субботу и воскресенье, используйте методы из следующих разделов.
Способ 2: Работа с календарными днями через Календарь и РабочиеДни
Когда требуется добавить только рабочие дни (исключая субботу, воскресенье и праздники), стандартной функции ДобавитьДень() недостаточно. В этом случае используйте объекты Календарь и РабочиеДни, которые позволяют гибко настраивать правила учета рабочего времени.
Алгоритм действий:
- Создайте объект
Календарьи укажите в нем рабочие дни недели. - При необходимости добавьте исключения (праздники или дополнительные рабочие дни).
- Используйте метод
ДобавитьРабочиеДни()для расчета новой даты.
Пример кода:
Календарь = Новый Календарь(РежимРабочегоВремени.Пятидневка);
Календарь.ДобавитьИсключение(Новый ДиапазонДаты('20260101', '20260108')); // Новый год
НоваяДата = Календарь.ДобавитьРабочиеДни(ТекущаяДата(), 10); // +10 рабочих дней
Этот метод учитывает производственный календарь, поэтому если вы добавляете 5 рабочих дней начиная с пятницы, результат будет не понедельник, а следующий четверг (пропуская субботу, воскресенье и понедельник как выходные).
Как добавить праздники в календарь автоматически?
Для автоматического заполнения праздников можно использовать обработку "Производственный календарь" из стандартных поставок 1С или подключить внешнюю обработку с актуальными данными по регионам. Например, в конфигурации "Зарплата и управление персоналом" уже есть готовый календарь с российскими праздниками.
Способ 3: Использование запросов 1С для массовой обработки дат
Если вам нужно прибавить дни к датам в большой таблице (например, в документах или регистрах), удобнее использовать запрос на языке 1С. Это позволит обработать тысячи записей за считанные секунды без циклов в коде.
Пример запроса для добавления 7 дней ко всем датам в таблице документов:
ВЫБРАТЬ
Документ.Ссылка КАК Ссылка,
ДобавитьДень(Документ.Дата, 7) КАК НоваяДата
ИЗ
Документ.ЗаказПокупателя КАК Документ
Для рабочих дней запрос будет сложнее — потребуется присоединить календарь:
ВЫБРАТЬ
Документ.Ссылка КАК Ссылка,
Календарь.ДобавитьРабочиеДни(Документ.Дата, 5) КАК НоваяДата
ИЗ
Документ.ЗаказПокупателя КАК Документ
ЛЕВОЕ СОЕДИНЕНИЕ Календарь.Производственный КАК Календарь
ПО 1 = 1
Запросы особенно полезны для отчетов, где требуется показать даты с учетом различных сдвигов. Например, в отчете по просроченным платежам можно автоматически рассчитать дату оплаты как "дата документа + 14 дней".
Способ 4: Программный код для сложных сценариев
Когда стандартных функций недостаточно (например, нужно учитывать индивидуальный график работы сотрудников или сложные правила переноса праздников), приходится писать собственный код на встроенном языке 1С.
Пример функции, которая добавляет дни с учетом персонального графика:
Функция ДобавитьДниСУчетомГрафика(ДатаНачала, КоличествоДней, ГрафикРаботы)
ТекущаяДата = ДатаНачала;
ОсталосьДней = КоличествоДней;
Пока ОсталосьДней > 0 Цикл
ТекущаяДата = ДобавитьДень(ТекущаяДата, 1);
Если ГрафикРаботы.ЭтоРабочийДень(ТекущаяДата) Тогда
ОсталосьДней = ОсталосьДней - 1;
КонецЕсли;
КонецЦикла;
Возврат ТекущаяДата;
КонецФункции
Где ГрафикРаботы — это объект, который содержит правила рабочих дней для конкретного сотрудника или отдела. Такой подход позволяет:
- 🔄 Учитывать сменный график (например, 2 через 2).
- 🏢 Применять разные правила для разных подразделений.
- 📅 Динамически изменять график (например, в декабре добавить дополнительные рабочие дни).
✅ Убедитесь, что функция обрабатывает отрицательное количество дней (сдвиг в прошлое)
✅ Проверьте корректность работы на границах месяцев/лет
✅ Протестируйте с датами, попадающими на праздники
✅ Оптимизируйте цикл для больших значений (например, +1000 дней)-->
Этот метод требует больше усилий на разработку, но дает максимальную гибкость для нестандартных бизнес-процессов. Например, в логистике можно учитывать дни доставки только по четным числам или исключать определенные дни недели для конкретных маршрутов.
Способ 5: Работа с датами в SQL-запросах (для внешних источников)
Если вы работаете с внешними базами данных (например, Microsoft SQL Server или PostgreSQL) через механизм ADODB или HTTP-Сервисы, добавление дней реализуется прямо в SQL-запросе. Это удобно для интеграций, когда данные хранятся вне 1С.
Примеры 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 |
В 1С результат SQL-запроса можно получить так:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Подключение.ВыполнитьСкаллярный(""SELECT DATEADD(day, 5, '2026-01-01'')"") КАК НоваяДата";
Результат = Запрос.Выполнить();
При работе с внешними БД всегда проверяйте формат даты! В SQL даты часто передаются в формате YYYY-MM-DD, а в 1С — как ДД.ММ.ГГГГ. Используйте функции преобразования, чтобы избежать ошибок.
Этот способ актуален для распределенных систем, где часть логики вынесена на сервер баз данных. Например, если в вашей компании даты хранения документов рассчитываются на стороне SQL Server, а в 1С только отображаются.
Типичные ошибки и как их избежать
Даже опытные разработчики иногда сталкиваются с проблемами при работе с датами в 1С. Вот самые распространенные ошибки и способы их решения:
⚠️ Внимание: Если вы добавляете дни к дате в31.01.2026и получаете02.03.2026вместо28.02.2026, проверьте, не используете ли вы по ошибкеДобавитьМесяц(Дата, 1)вместоДобавитьДень(Дата, 30). ФункцииДобавитьМесяц()иДобавитьГод()автоматически корректируют дату до последнего дня месяца!
Другие частые проблемы:
- 🗓️ Неучет временной зоны: Если вы работаете с сервером в другом часовом поясе, даты могут сдвигаться на ± несколько часов. Используйте
НачалоДня()для приведения к началу суток. - 🔄 Циклы с бесконечным добавлением: При ручной проверке рабочих дней в цикле (способ 4) легко упустить условие выхода, что приведет к зависанию системы. Всегда ограничивайте количество итераций.
- 📊 Округление в запросах: В некоторых версиях 1С при сложении дат и чисел в запросах может происходить неявное округление. Явно приводите типы с помощью
ДАТАВРЕМЯ().
Чтобы избежать ошибок:
- Всегда тестируйте код на граничных значениях (конец месяца, високосный год, переход на зимнее/летнее время).
- Используйте
Сообщить()для вывода промежуточных результатов при отладке. - Для критичных расчетов (например, сроков исковой давности) дублируйте логику в тестовых обработках.
FAQ: Ответы на частые вопросы
Можно ли добавить к дате не целые дни, а часы или минуты?
Да, для этого используйте функцию ДобавитьСекунды() или работайте с типом ДатаВремя. Примеры:
// Добавить 5 часов
НоваяДата = ДобавитьСекунды(ТекущаяДата(), 5 * 3600);
// Добавить 30 минут
НоваяДата = ТекущаяДата() + 30 * 60;
Обратите внимание, что при выводе даты без времени (формат ДД.ММ.ГГГГ) дробная часть будет отброшена.
Как добавить дни к дате в отчете без изменения исходных данных?
В настройках отчета создайте вычисляемое поле с формулой:
- Откройте схему компоновки данных.
- Добавьте новое поле типа "Выражение".
- Укажите выражение:
ДобавитьДень([ДатаДокумента], 10).
Это поле будет отображаться в отчете, но не изменит данные в базе.
Почему при добавлении 1 дня к 31.12.2026 получаю 31.12.2026, а не 01.01.2026?
Скорее всего, вы работаете с полем типа Дата (без времени), и функция ДобавитьДень() возвращает дату в формате ДД.ММ.ГГГГ 00:00:00. При приведении к типу Дата время обрезается, и если исходная дата тоже была без времени, визуально ничего не меняется.
Решение: используйте НачалоДня(ДобавитьДень(Дата, 1)) или явно приводите к типу ДатаВремя.
Как учесть региональные праздники (например, в Татарстане или Башкортостане)?
Для учета региональных праздников:
- Скачайте актуальный производственный календарь для вашего региона (например, с сайта местного правительства).
- Импортируйте даты праздников в справочник
КалендариилиИсключенияКалендаря. - При создании объекта
Календарьдобавьте эти исключения:
Календарь = Новый Календарь(РежимРабочегоВремени.Пятидневка);
Для Каждого Праздник Из Справочник.РегиональныеПраздники Цикл
Календарь.ДобавитьИсключение(Праздник.Дата);
КонецЦикла;
Можно ли добавить дни к дате в мобильном приложении 1С?
Да, в мобильной платформе 1С:Предприятие доступны те же функции: ДобавитьДень(), Календарь и запросы. Однако учитывайте:
- 📱 На мобильных устройствах производительность циклов ниже — оптимизируйте код.
- 🔄 Синхронизируйте производственные календари с сервером, чтобы избежать расхождений.
- 📅 Для отображения дат используйте формат, адаптированный под маленькие экраны (например,
Формат(Дата, "ДФ=dd.MM")).