Добавление одного дня к дате — одна из самых частых задач при работе с 1С:Предприятие, будь то автоматизация бизнес-процессов, формирование отчетов или расчеты в бухгалтерии. На первый взгляд операция кажется простой, но в 1С 8.3 (как и в более ранних версиях) есть нюансы: от различий между клиентским и серверным кодом до особенностей обработки рабочих/выходных дней. Эта статья охватывает все актуальные способы — от ручных действий для пользователей до программных решений для разработчиков.
Мы разберем не только стандартные функции вроде ДобавитьМесяц(), но и альтернативные подходы с использованием объекта Дата, запросов и даже внешних компонент для сложных сценариев. Особое внимание уделим типичным ошибкам, например, когда прибавление дня к 31.01.2026 дает не 01.02.2026, а неожиданный результат. Готовые примеры кода вы сможете адаптировать под УТ 11, БП 3.0, ЗУП 3.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);
Что учитывать:
- 📅 В 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)
- AddIn для работы с датами по шариату (например,
- 📦 Готовые обработки:
- Обработка "Календарь праздников РФ" для автоматического учета переносов выходных
- Расширение "ДатаПлюс" с визуальным интерфейсом для массового изменения дат
Пример подключения внешней компоненты:
ПутьКФайлу = "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). - Оберните операции в
НачатьТранзакцию()иЗафиксироватьТранзакцию().
Пример кода для документов РеализацияТоваровУслуг:
Выборка = Документы.РеализацияТоваровУслуг.Выбрать();
НачатьТранзакцию();
Пока Выборка.Следующий() Цикл
Объект = Выборка.ПолучитьОбъект();
Объект.Дата = ДобавитьДень(Объект.Дата, -1);
Объект.Записать();
КонецЦикла;
ЗафиксироватьТранзакцию();
Можно ли прибавить день к дате в мобильном приложении 1С?
Да, в 1С:Мобильная платформа доступны те же функции, что и в десктопной версии. Используйте:
НоваяДата = ДобавитьДень(ТекущаяДата(), 1);
Ограничения:
- Нет доступа к серверным календарям (нужно передавать данные с сервера)
- Некоторые внешние компоненты могут не работать
Как проверить, что прибавление дня не выходит за закрытый период?
Перед изменением даты проверяйте её попадание в закрытый период с помощью функции:
Если НЕ УчетныеПериоды.ДатаВЗакрытомПериоде(НоваяДата) Тогда
// Можно изменять дату
Иначе
Сообщить("Дата попадает в закрытый период!");
КонецЕсли;
В типовой конфигурации 1С:БП 3.0 закрытые периоды хранятся в регистре сведений УчетныеПериоды.