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

Мы разберем не только стандартные функции вроде ДобавитьМесяц(), но и альтернативные подходы с использованием объекта Дата, запросов и даже внешних компонент для сложных сценариев. Особое внимание уделим типичным ошибкам, например, когда прибавление дня к 31.01.2026 дает не 01.02.2026, а неожиданный результат. Готовые примеры кода вы сможете адаптировать под УТ 11, БП 3.0, ЗУП 3.1 и другие популярные конфигурации.

📊 С какой целью вам нужно прибавлять дни к датам в 1С?
Автоматизация отчетов
Расчет сроков поставок
Учет рабочего времени
Интеграция с внешними системами
Другое

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

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

НоваяДата = ДобавитьДень(ИсходнаяДата, КоличествоДней);

Пример для добавления одного дня к текущей дате:

ТекущаяДата = ТекущаяДата();

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

  • ✅ Работает во всех версиях 1С 8.x (включая 8.2 и 8.3)
  • ✅ Учитывает високосные годы и разную длину месяцев
  • ⚠️ Не учитывает рабочие/выходные дни (для этого нужен Календарь)
  • 🔄 Можно добавлять отрицательное количество дней (вычитание)

Важный нюанс: если вы передаете в функцию не дату, а строку (например, "20260229"), сначала преобразуйте её в тип Дата с помощью Дата(Значение). Иначе получите ошибку "Недопустимый тип данных".

💡

Чтобы быстро проверить результат в отладчике 1С, используйте команду Сообщить(ДобавитьДень(ТекущаяДата(), 1)); — она выведет новую дату в отдельном окне.

2. Альтернативный метод: работа с объектом Дата

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

Пример кода:

ДатаОбъект = Новый Дата(2026, 2, 28);  // 28 февраля 2026

ДатаОбъект.УстановитьДень(ДатаОбъект.День() + 1); // Прибавляем 1 день

Результат = ДатаОбъект;

Преимущества этого способа:

  • 🔧 Позволяет модифицировать дату "по частям" (день, месяц, год отдельно)
  • 📅 Легко комбинировать с установкой времени (УстановитьВремя())
  • 🔄 Можно использовать в циклах для перебора дат
⚠️ Внимание: При работе с 31.12.2026 метод УстановитьДень(32) автоматически перенесет дату на 01.01.2026, но если вы пытаетесь установить 31.04.2026 (апрель имеет 30 дней), 1С выдаст ошибку. Всегда проверяйте корректность даты после манипуляций!
Метод Пример использования Результат для 31.01.2026
ДобавитьДень() ДобавитьДень(Дата, 1) 01.02.2026
Объект Дата ДатаОбъект.УстановитьДень(ДатаОбъект.День() + 1) 01.02.2026
Арифметика (ошибка!) Дата + 86400 (секунды) Ошибка выполнения

3. Прибавление дней с учетом рабочего календаря

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

  1. Использовать плановый календарь из конфигурации (например, Календари.Основной в ЗУП).
  2. Или создать свой календарь с учетом специфики организации.

Пример кода для прибавления одного рабочего дня:

Календарь = Календари.Основной;

ТекущаяДата = ТекущаяДата();

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

Что учитывать:

  • 📅 В 1С:ЗУП и 1С:ERP календари уже настроены по умолчанию
  • 🔧 В 1С:БП или 1С:УТ может потребоваться донастройка
  • ⚠️ Праздничные дни (например, 1 мая) автоматически пропускаются
Как добавить календарь в типовую конфигурацию?

1. Откройте конфигуратор (F12 → Режим "Конфигуратор").

2. Перейдите в ветку Общие → Календари.

3. Создайте новый календарь и настройте рабочие/выходные дни.

4. В коде обращайтесь к нему по имени, например Календари.МойКалендарь.

4. Использование запросов для массового изменения дат

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

Пример запроса, который увеличивает дату отгрузки на 1 день для всех неоплаченных заказов:

ВЫБРАТЬ

ЗаказыПокупателей.Ссылка КАК Ссылка,

ДОБАВИТЬКДАТЕ(ЗаказыПокупателей.ДатаОтгрузки, ДЕНЬ, 1) КАК НоваяДатаОтгрузки

ИЗ

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

ГДЕ

ЗаказыПокупателей.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовПокупателей.НеОплачен)

И ЗаказыПокупателей.ДатаОтгрузки < ТЕКУЩАЯДАТА()

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

⚠️ Внимание: Функция ДОБАВИТЬКДАТЕ() в запросах работает иначе, чем ДобавитьДень() в встроенном языке! Она принимает три параметра: дату, единицу измерения (ДЕНЬ, МЕСЯЦ) и количество. Ошибка в синтаксисе приведет к падению запроса.

5. Программное решение для сложных сценариев

Иногда требуется не просто прибавить день, а учитывать дополнительные условия. Например:

  • 📦 В 1С:УТ: сдвинуть дату отгрузки, если она попадает на выходной
  • 💰 В 1С:БП: перенести платеж на следующий рабочий день после праздников
  • ⏰ В 1С:ЗУП: скорректировать дату увольнения с учетом отработки

Для таких задач пишут универсальную функцию, которую затем вызывают по всему коду. Пример:

Функция ПрибавитьДеньСУчетомПравил(ИсходнаяДата, Календарь = Неопределено) Экспорт

Если Календарь = Неопределено Тогда

Календарь = Календари.Основной; // Используем календарь по умолчанию

КонецЕсли;

НоваяДата = ДобавитьДень(ИсходнаяДата, 1);

// Если новая дата - выходной, переносим на следующий рабочий день

Пока НЕ Календарь.РабочийДень(НоваяДата) Цикл

НоваяДата = ДобавитьДень(НоваяДата, 1);

КонецЦикла;

Возврат НоваяДата;

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

Эту функцию можно разместить в общем модуле и вызывать откуда угодно:

НоваяДатаОтгрузки = ПрибавитьДеньСУчетомПравил(ТекущаяДатаОтгрузки, Календари.Складской);
💡

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

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

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

  • 🗓 Игнорирование временной зоны: Если сервер и клиент в разных часовых поясах, ТекущаяДата() может вернуть неожиданный результат. Используйте ТекущаяДатаСеанса() для клиентских операций.
  • 🔢 Путаница с типами данных: Передача строки вместо даты ("2026-03-15") вызовет ошибку. Всегда преобразуйте входные данные с помощью Дата(Значение).
  • 📅 Неучет переходов на летнее/зимнее время: В некоторых конфигурациях это может сдвинуть дату на час. Проверяйте настройку ИспользоватьЛетнееВремя в параметрах сеанса.
  • 🔄 Рекурсивные переносы: При добавлении дней в цикле (например, +30 дней) не забывайте обновлять исходную дату, иначе получите линейный сдвиг вместо календарного.

Критическая ошибка: Если вы работаете с периодическими регистрами (например, регистр сведений ЦеныНоменклатуры), прибавление дня к дате начала действия может нарушить целостность данных. Всегда проверяйте, не пересекается ли новая дата с существующими записями!

Сделать резервную копию базы|Проверить права доступа (администрирование → пользователи)|Убедиться, что дата не попадает в закрытый период|Протестировать изменения на копии базы|Зафиксировать действия в журнале изменений-->

7. Внешние компоненты и расширения для работы с датами

Для нестандартных задач (например, работа с исламским календарем или фискальными периодами) стандартных средств 1С может не хватить. В таких случаях используют:

  • 🔌 Внешние компоненты:
    • AddIn для работы с датами по шариату (например, IslamicDate.dll)
    • OneScript-библиотеки с расширенными функциями (например, oscript-library)
  • 📦 Готовые обработки:
    • Обработка "Календарь праздников РФ" для автоматического учета переносов выходных
    • Расширение "ДатаПлюс" с визуальным интерфейсом для массового изменения дат

Пример подключения внешней компоненты:

ПутьКФайлу = "C:\AddIns\DateCalculator.dll";

Попытка

ВнешняяКомпонента = Новый COMОбъект("DateCalculator.AddIn");

НоваяДата = ВнешняяКомпонента.AddHijriDays(ТекущаяДата(), 1); // Добавляем 1 день по хиджре

Исключение

Сообщить("Ошибка загрузки компоненты: " + ОписаниеОшибки());

КонецПопытки;

⚠️ Внимание: Внешние компоненты могут конфликтовать с антивирусами или политиками безопасности 1С. Перед использованием проверьте их на тестовом сервере и убедитесь, что они подписаны доверенным сертификатом.

FAQ: Частые вопросы по работе с датами в 1С

Как прибавить 1 день к дате в отчете (СКД)?

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

ДОБАВИТЬКДАТЕ(&ДатаДокумента, ДЕНЬ, 1)

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

Почему после добавления дня к 31.03.2026 получаю 01.04.2026, а не 32.03.2026?

Это нормальное поведение 1С: функция ДобавитьДень() автоматически корректирует дату с учетом календаря. Числа "32 марта" не существует, поэтому результат переносится на апрель. Если вам нужно именно увеличить числовое значение дня (например, для внутренней нумерации), работайте с компонентами даты отдельно:

День = Дата.День() + 1;

НоваяДата = Дата(Дата.Год(), Дата.Месяц(), День);

Но помните, что такая дата может быть некорректной (например, 31 февраля).

Как массово сдвинуть даты в документах на 1 день назад?

Используйте обработку с запросом и транзакцией:

  1. Создайте запрос, который выберет все нужные документы.
  2. В цикле обновите даты с помощью ДобавитьДень(Дата, -1).
  3. Оберните операции в НачатьТранзакцию() и ЗафиксироватьТранзакцию().

Пример кода для документов РеализацияТоваровУслуг:

Выборка = Документы.РеализацияТоваровУслуг.Выбрать();

НачатьТранзакцию();

Пока Выборка.Следующий() Цикл

Объект = Выборка.ПолучитьОбъект();

Объект.Дата = ДобавитьДень(Объект.Дата, -1);

Объект.Записать();

КонецЦикла;

ЗафиксироватьТранзакцию();

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

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

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

Ограничения:

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

Перед изменением даты проверяйте её попадание в закрытый период с помощью функции:

Если НЕ УчетныеПериоды.ДатаВЗакрытомПериоде(НоваяДата) Тогда

// Можно изменять дату

Иначе

Сообщить("Дата попадает в закрытый период!");

КонецЕсли;

В типовой конфигурации 1С:БП 3.0 закрытые периоды хранятся в регистре сведений УчетныеПериоды.