Добавление фиксированного количества дней к дате — одна из самых частых задач при работе с 1С:Предприятие. Бухгалтерам нужно рассчитывать сроки оплаты по договорам, кадровикам — исчислять дедлайны для отпусков, а программистам — автоматизировать отчеты с динамическими периодами. Казалось бы, что может быть проще? Но в 1С 8.3 (как и в 8.2) есть нюансы: функция ДобавитьМесяц() ведет себя неочевидно с датами в конце месяца, а ручное сложение дней через плюс (+) чревато ошибками при переходе через месяц или год.
В этой статье мы разберем 5 рабочих способов прибавить 30 дней к дате — от простейших встроенных функций до программного кода для сложных сценариев. Вы узнаете, какой метод выбрать для бухгалтерских отчетов, а какой подойдет для автоматизации бизнес-процессов. Все примеры протестированы на актуальных релизах платформы 1С:Предприятие 8.3.22 и 8.3.23, но majority логики работают и в более ранних версиях.
1. Способ: функция ДобавитьДень() — самый простой вариант
Если вам нужно быстро прибавить 30 дней к текущей дате или дате из документа, используйте встроенную функцию ДобавитьДень(). Это базовый метод, который подходит для большинства задач в 1С:Бухгалтерия, 1С:Зарплата и Управление Персоналом или 1С:Управление Торговлей.
Синтаксис функции:
ДобавитьДень(Дата, КоличествоДней)
Примеры использования:
- 📅 К текущей дате:
ДобавитьДень(ТекущаяДата(), 30)— вернет дату через 30 дней от сегодня. - 📄 К дате документа:
ДобавитьДень(Документ.Дата, 30)— прибавит 30 дней к дате конкретного документа. - 📊 В запросе:
ВЫБРАТЬ ДобавитьДень(Документ.Дата, 30) КАК СрокОплаты— добавит колонку с новой датой в результат запроса.
✅ Плюсы метода: простота, работает во всех конфигурациях, не требует прав редактирования.
❌ Минусы: не учитывает рабочие/выходные дни (если нужно прибавить 30 рабочих дней, читайте раздел 4).
Если дата попадает на конец месяца (например, 31 января + 30 дней), функция ДобавитьДень() автоматически перенесет её на правильное число следующего месяца (2 или 3 марта, в зависимости от года).
2. Арифметика с датами: оператор + и его подводные камни
В 1С можно прибавлять дни к датам через стандартный оператор сложения (+). Это удобно для быстрых расчетов, но требует осторожности: платформа интерпретирует даты как числа (количество дней от 01.01.0001), и некорректное использование может привести к ошибкам.
Примеры:
НоваяДата = ТекущаяДата() + 30; // Прибавляет 30 дней к сегодня
СрокИсполнения = ДатаДоговора + 30; // Для даты из переменной
⚠️ Внимание: если вы используете этот метод в запросах, оберните выражение в функцию ДАТАВРЕМЯ(), иначе 1С может выдать ошибку несоответствия типов:
ВЫБРАТЬ ДАТАВРЕМЯ(Документ.Дата + 30) КАК НовыйСрок
| Метод | Пример кода | Работает в запросах? | Учитывает выходные? |
|---|---|---|---|
ДобавитьДень() |
ДобавитьДень(ТекущаяДата(), 30) |
Да | Нет |
Оператор + |
ТекущаяДата() + 30 |
Только с ДАТАВРЕМЯ() |
Нет |
НачалоДня() + дни |
НачалоДня(ТекущаяДата()) + 30*86400 |
Нет | Нет |
🔹 Когда использовать: для простых расчетов в модулях объектов или регламентных заданиях. Избегайте этого метода, если дата может "вылезать" за пределы месяца (например, 31.01.2026 + 30 дней). В таких случаях лучше применять ДобавитьДень().
3. Прибавление дней в запросах 1С: синтаксис и примеры
Если вам нужно прибавить 30 дней к дате непосредственно в тексте запроса (например, для формирования отчета или выборки документов с учетом срока), используйте конструкцию с функцией ДОБАВИТЬКДАТЕ(). Это аналог ДобавитьДень(), но для языка запросов.
Базовый синтаксис:
ДОБАВИТЬКДАТЕ(Дата, ДЕНЬ, КоличествоДней)
Примеры:
- 📌 Простой вариант:
ВЫБРАТЬДОБАВИТЬКДАТЕ(Документ.Дата, ДЕНЬ, 30) КАК СрокОплаты
ИЗ Документ.ЗаказПокупателя КАК Документ
- 🔍 С фильтрацией:
ВЫБРАТЬНомер,
Дата,
ДОБАВИТЬКДАТЕ(Дата, ДЕНЬ, 30) КАК Срок
ИЗ Документ.СчетНаОплату
ГДЕ ДОБАВИТЬКДАТЕ(Дата, ДЕНЬ, 30) < ТЕКУЩАЯДАТА()
(выберет счета, у которых истек срок оплаты)
⚠️ Внимание: в запросах нельзя использовать оператор + напрямую с полем типа Дата. Всегда применяйте ДОБАВИТЬКДАТЕ() или ДАТАВРЕМЯ().
Что делать, если нужно прибавить дни к дате с временем?
Если поле содержит и дату, и время (например, 2026-05-15 14:30:00), используйте функцию ДОБАВИТЬКДАТЕ() с указанием интервала:
ДОБАВИТЬКДАТЕ(ДатаВремя, СЕКУНДА, 30*86400)
где 86400 — количество секунд в одном дне. Это гарантирует, что время останется неизменным, а дата сдвинется на нужное количество дней.
4. Как прибавить 30 рабочих дней (с учетом выходных)
Если задача — прибавить не календарные, а рабочие дни (исключая субботу, воскресенье и праздники), стандартные функции 1С не подойдут. Здесь нужны:
- Календарь рабочих дней (встроенный или кастомный).
- Цикл или рекурсивная функция для пошагового добавления дней.
📌 Пример кода для добавления 30 рабочих дней:
Функция ДобавитьРабочиеДни(НачальнаяДата, КоличествоДней)
ТекущаяДата = НачальнаяДата;
Счетчик = 0;
Пока Счетчик < КоличествоДней Цикл
ТекущаяДата = ТекущаяДата + 1;
Если НЕ ТекущаяДата.ДеньНедели() = 6 // Суббота
И НЕ ТекущаяДата.ДеньНедели() = 7 // Воскресенье
И НЕ ЭтоПраздник(ТекущаяДата) Тогда
Счетчик = Счетчик + 1;
КонецЕсли;
КонецЦикла;
Возврат ТекущаяДата;
КонецФункции
// Функция проверки праздников (упрощенно)
Функция ЭтоПраздник(Дата)
// Здесь должен быть ваш код проверки праздничных дней
// Например, выборка из справочника "Праздники"
Возврат Ложь;
КонецФункции
🔹 Где взять календарь праздников?
- 📅 В типовой конфигурации 1С:Зарплата и Управление Персоналом есть справочник
ПроизводственныеКалендари. - 🌐 Для 1С:Бухгалтерия можно подключить внешнюю обработку или загрузить календарь из ИТС.
- 🛠️ Написать свою функцию с жестко прописанными праздничными датами (не рекомендуется — придется обновлять каждый год).
При добавлении рабочих дней всегда учитывайте региональные особенности: в некоторых субъектах РФ выходными могут быть дополнительные дни (например, религиозные праздники).
5. Программное добавление дней через НачалоДня() и секунды
Для сложных сценариев (например, когда нужно прибавить дни к дате с временем или работать с миллисекундами) можно использовать функцию НачалоДня() и арифметику секунд. Этот метод гибкий, но требует аккуратности.
📌 Пример: прибавить 30 дней к дате с временем 15.05.2026 14:30:00, сохранив время:
ДатаСВременем = '2026-05-15 14:30:00';
НоваяДата = НачалоДня(ДатаСВременем) + 30*86400 +
(ДатаСВременем - НачалоДня(ДатаСВременем));
🔢 Расшифровка:
НачалоДня()— обнуляет время (оставляет только дату).30*86400— количество секунд в 30 днях (30 дней × 24 часа × 3600 секунд).(ДатаСВременем - НачалоДня(ДатаСВременем))— сохраняет оригинальное время.
⚠️ Внимание: этот метод может дать некорректный результат при переходе на зимнее/летнее время (если таковое вновь введут). В таких случаях используйте ДобавитьДень().
1. Убедитесь, что функция возвращает дату, а не число
2. Проверьте результат на граничных датах (конец месяца, 29 февраля)
3. Если работаете с временем — сохраните его отдельно
4. Для рабочих дней — протестируйте на праздничных периодах (май, январь)
-->
6. Автоматизация: обработка для массового добавления дней
Если вам нужно прибавить 30 дней к датам в массиве документов (например, перенести сроки оплаты по всем счетам), удобнее создать внешнюю обработку. Ниже пример кода для обработки табличной части документа:
Процедура ПеренестиСрокиНа30Дней(ТабличнаяЧасть)
Для Каждого Строка Из ТабличнаяЧасть Цикл
Если ЗначениеЗаполнено(Строка.Дата) Тогда
Строка.Дата = ДобавитьДень(Строка.Дата, 30);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
🔹 Как использовать:
- Создайте новую обработку в конфигураторе (
Файл → Новый → Обработка). - Добавьте реквизит типа
ТаблицаЗначенийдля хранения данных. - Вставьте код выше в модуль обработки.
- Запустите обработку в режиме 1С:Предприятие и передайте в неё табличную часть документа.
📂 Где скачать готовые обработки?
- 🌍 Инфостарт — крупнейшая база обработок для 1С.
- 📦 ИТС — официальные решения от 1С.
- 🛠️ GitHub — открытые репозитории с кодом (ищите по тегам
1C,8.3).
Перед массовым изменением дат сделайте резервную копию базы (Администрирование → Выгрузить информационную базу). Это спасет вас от ошибок при некорректной обработке.
FAQ: Частые вопросы по добавлению дней в 1С
🔹 Почему функция ДобавитьМесяц() не подходит для добавления 30 дней?
Функция ДобавитьМесяц() добавляет целые месяцы, а не дни. Например, ДобавитьМесяц('31.01.2026', 1) вернет 29.02.2026 (если февраль високосный) или 28.02.2026, а не 02.03.2026, как могло бы показаться. Для дней всегда используйте ДобавитьДень().
🔹 Как прибавить 30 дней к дате в отчете СКД (Система Компоновки Данных)?
В настройках отчета СКД перейдите на закладку Параметры, добавьте новый параметр типа Дата и в выражении для него используйте:
ДОБАВИТЬКДАТЕ(&ДатаНачала, ДЕНЬ, 30)
Либо создайте вычисляемое поле в схеме компоновки с аналогичным выражением.
🔹 Можно ли прибавить 30 дней к дате в мобильном приложении 1С?
Да, в мобильной платформе 1С:Предприятие доступны те же функции: ДобавитьДень() и арифметика с датами. Однако учитывайте, что:
- Производительность на мобильных устройствах ниже — избегайте сложных циклов.
- В некоторых версиях мобильной платформы нет поддержки
ДОБАВИТЬКДАТЕ()в запросах (проверяйте в документации).
🔹 Как прибавить 30 дней к дате в 1С 7.7?
В 1С 7.7 логика аналогична, но синтаксис отличается. Используйте:
НоваяДата = ТекущаяДата() + 30;
или функцию ДобДень() из библиотеки стандартных подсистем. Обратите внимание, что в 7.7 нет отдельного типа Дата — даты хранятся как числа.
🔹 Почему при добавлении 30 дней к 31.03.2026 получается 30.04.2026, а не 01.05.2026?
Это корректное поведение 1С. Функция ДобавитьДень() учитывает реальное количество дней в месяце. Апрель имеет 30 дней, поэтому 31.03 + 30 дней = 30.04. Если вам нужно получить 01.05, прибавьте 31 день.