Работа с временными интервалами является одной из ключевых задач при разработке и администрировании конфигураций 1С Предприятие. Будь то расчет сроков оплаты, формирование периодов отчетности или планирование бизнес-процессов, разработчику постоянно приходится манипулировать датами. Наиболее частая операция, с которой сталкиваются специалисты, — это необходимость прибавить определенный временной интервал к существующему значению.
В платформе 1С:Предприятие 8 существует несколько способов выполнить это действие, каждый из которых имеет свои особенности и области применения. Выбор конкретного метода зависит от контекста задачи, типа переменной и требований к производительности кода. Понимание механизмов работы с типом ДатаВремя позволяет избежать распространенных ошибок при переходе через границы месяцев и високосные годы.
В этой статье мы детально разберем все доступные инструменты для увеличения даты на один или несколько дней. Мы рассмотрим как простые арифметические действия, так и специализированные функции встроенного языка. Особое внимание будет уделено нюансам, которые могут возникнуть при работе с разными версиями платформы и конфигурациями.
Основы работы с типом ДатаВремя в платформе
Прежде чем приступать к арифметическим операциям, необходимо четко понимать структуру типа данных, с которым мы работаем. В 1С существует тип Дата (или ДатаВремя), который хранит информацию о календарной дате и времени с точностью до секунды. Этот тип является неизменяемым, что означает, что любая операция над ним создает новое значение, а не модифицирует старое.
Внутреннее представление даты в 1С основано на количестве секунд, прошедших с начала эры платформы. Именно поэтому к датам можно применять арифметические операторы сложения и вычитания. Однако
При объявлении переменных рекомендуется явно указывать тип, чтобы избежать неявных преобразований, которые могут замедлить выполнение кода. Использование строгой типизации также помогает системе контроля версий и другим разработчикам быстрее понять логику вашего алгоритма.
⚠️ Внимание: При работе с датами в разных часовых поясах или при переходе на летнее/зимнее время (если это актуально для вашей конфигурации и региона) убедитесь, что серверное время синхронизировано корректно, иначе расчеты могут сместиться на час.
Арифметическое сложение: самый простой метод
Наиболее интуитивный и часто используемый способ прибавить день — это использование оператора сложения +. Платформа 1С позволяет складывать значение типа Дата с числом, интерпретируя это число как количество дней. Это синтаксический сахар, который делает код читаемым и лаконичным.
Если вам нужно прибавить к текущей дате ровно одни сутки, вы можете просто написать выражение, где к переменной даты добавляется единица. Платформа автоматически выполнит конвертацию и вернет новый объект даты. Этот метод идеально подходит для простых расчетов в модулях формы или обработках.
Рассмотрим пример кода, демонстрирующий базовый синтаксис. Здесь мы берем текущую дату системы и увеличиваем ее на один день:
ТекущаяДата = ТекущаяДата();
НоваяДата = ТекущаяДата + 1;
Сообщить(НоваяДата);
Важно отметить, что при использовании этого метода время суток сохраняется неизменным. Если исходная дата была 15.05.2026 14:30:00, то после прибавления дня результат будет 16.05.2026 14:30:00. Это поведение критично учитывать при расчете дедлайнов, которые привязаны к конкретному времени.
Используйте оператор '+' для быстрых расчетов в запросах, где требуется динамическое формирование периодов прямо в тексте запроса 1С.
Арифметический подход также позволяет прибавлять дробные значения, если требуется добавить часть дня. Например, добавление 0.5 прибавит 12 часов. Однако для таких задач лучше использовать специализированные функции, чтобы код был более явным для поддержки.
Использование функции ДобавлениеВдату
Для более сложных сценариев и повышения читаемости кода в языке 1С предусмотрена встроенная функция ДобавлениеВдату. Этот метод является предпочтительным в профессиональной разработке, так как он явно указывает намерение разработчика и позволяет гибко управлять единицами измерения времени.
Функция принимает три аргумента: исходную дату, количество единиц для добавления и тип периода. Тип периода задается перечислением ПериодДатаВремя, что позволяет добавлять не только дни, но и месяцы, кварталы, годы, минуты и секунды. Это устраняет двусмысленность, которая может возникнуть при использовании магических чисел.
Синтаксис вызова функции выглядит следующим образом:
ИсходнаяДата = '01.01.2026';
НоваяДата = ДобавлениеВдату(ИсходнаяДата, 1, ПериодДатаВремя.День);
Главное преимущество ДобавлениеВдату заключается в корректной обработке переходов через конец месяца. Если вы прибавляете месяц к дате 31 января, функция автоматически скорректирует результат до последнего дня февраля (28 или 29), тогда как простая арифметика может дать непредсказуемый результат в старых версиях или при неправильном использовании.
Кроме того, использование перечислений делает код самодокументируемым. При чтении чужого кода сразу понятно, что именно добавляется к дате, без необходимости вникать в логику арифметических преобразований. Это особенно важно в больших проектах с высокой ротацией разработчиков.
Работа с периодами в запросах 1С
Когда речь заходит о выборке данных из базы, арифметика дат переносится на уровень языка запросов. В запросах 1С также поддерживается операция сложения даты и числа, что позволяет формировать динамические условия отбора прямо в теле запроса. Это снижает нагрузку на сервер приложений, так как фильтрация происходит на стороне СУБД.
В тексте запроса вы можете использовать конструкцию ДАТАВРЕМЯ(Год, Месяц, День, Час, Минута, Секунда) или обращаться к полям таблиц. Прибавление дня в запросе часто используется для формирования интервалов "сегодня", "вчера" или "следующая неделя".
Пример фрагмента запроса, где рассчитывается дата окончания периода:
ВЫБРАТЬ
Документ.Ссылка,
Документ.Дата,
ДОБАВИТЬКДАТЕ(Документ.Дата, 1, ДЕНЬ) КАК ДатаПлюсДень
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
ГДЕ
Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода
Обратите внимание, что в запросах часто используется функция ДОБАВИТЬКДАТЕ (аналог ДобавлениеВдату на языке запросов). Она работает аналогично и гарантирует правильную обработку календарных границ непосредственно в SQL-подобном синтаксисе 1С.
| Метод | Контекст использования | Производительность | Читаемость |
|---|---|---|---|
| Оператор + | Простые вычисления в коде | Высокая | Средняя |
| ДобавлениеВдату() | Сложная логика, разные периоды | Высокая | Высокая |
| ДОБАВИТЬКДАТЕ | Язык запросов | Максимальная (на сервере БД) | Высокая |
| Ручной расчет | Легаси код, специфичные задачи | Низкая | Низкая |
⚠️ Внимание: При использовании функций даты в условиях WHERE запроса убедитесь, что индексы по полям даты используются эффективно. Применение функций к полям в условии может привести к полному сканированию таблицы (Table Scan).
Нюансы високосных годов и переходов месяцев
Одной из самых коварных проблем при работе с датами является конец февраля в високосный год. Если вы пытаетесь прибавить год к дате 29 февраля, система должна корректно обработать ситуацию, когда в следующем году этого дня не существует. Платформа 1С:Предприятие решает эту задачу автоматически, но разработчик должен знать о правилах округления.
При использовании функции ДобавлениеВдату с периодом "Год" или "Месяц", если результирующий день выходит за пределы месяца, дата сдвигается на последний день этого месяца. Например, 31 марта минус один месяц даст 28 (или 29) февраля, а не 1 марта, как могло бы показаться при простой арифметике дней.
Это поведение зафиксировано в документации по платформе и является стандартом для большинства современных ERP-систем. Тем не менее, при написании собственных алгоритмов календарного планирования без использования встроенных функций, вы обязаны самостоятельно реализовывать проверку на високосность.
Как определить високосный год в 1С?
Для проверки можно использовать функцию Год(Дата) и логику: год високосный, если он делится на 4, но не делится на 100, либо делится на 400. Однако проще использовать встроенную проверку существования даты 29 февраля.
Всегда тестируйте свои расчеты на пограничных значениях: 31 декабря, 28 февраля, 1 января. Ошибки в этих точках могут привести к неверному начислению зарплаты, штрафам за просрочку платежей или сбоям в регламентных заданиях.
Практические примеры и чек-лист разработки
Чтобы закрепить полученные знания, рассмотрим типичные сценарии из практики бухгалтера и разработчика. Часто требуется рассчитать дату оплаты по договору, которая наступает через N дней после отгрузки, или определить дату следующего платежа по графику.
При реализации таких функций следуйте принципу DRY (Don't Repeat Yourself). Вынесите логику расчета дат в общие модули, чтобы использовать их во всей конфигурации. Это упростит поддержку и внесение изменений при обновлении законодательства.
☑️ Чек-лист проверки работы с датами
Ниже приведен пример универсальной функции, которая безопасно прибавляет рабочие дни, исключая выходные (упрощенный вариант). Такие решения часто требуются в модулях логистики и производства.
Функция ПрибавитьРабочиеДни(НачДата, КолвоДней)
ТекДата = НачДата;
Счетчик = 0;
Пока Счетчик < КолвоДней Цикл
ТекДата = ТекДата + 1;
Если ДеньНедели(ТекДата) <> 1 И ДеньНедели(ТекДата) <> 7 Тогда
Счетчик = Счетчик + 1;
КонецЕсли;
КонецЦикла;
Возврат ТекДата;
КонецФункции
Использование таких вспомогательных функций делает основной код бизнес-логики чистым и понятным. Вызывать ПрибавитьРабочиеДни гораздо информативнее, чем расписывать циклы с проверками дней недели в каждом месте, где нужен расчет срока.
⚠️ Внимание: Интерфейс и некоторые функции платформы могут незначительно отличаться в зависимости от версии релиза 1С:Предприятие 8.3. Всегда сверяйте синтаксис с актуальной синтаксической справкой вашей версии платформы.
Часто задаваемые вопросы (FAQ)
Что произойдет, если прибавить отрицательное число к дате?
Если вы используете оператор + с отрицательным числом (например, Дата + (-5)) или функцию ДобавлениеВдату с отрицательным количеством, дата сдвинется в прошлое. Это эквивалентно вычитанию дней и часто используется для расчета дат начала периодов.
Как прибавить к дате ровно 24 часа, игнорируя переходы на летнее время?
Для добавления фиксированного количества секунд (24 часа = 86400 секунд) лучше использовать функцию ДобавлениеВдату с периодом ПериодДатаВремя.Секунда и значением 86400. Оператор +1 добавляет именно календарные сутки, что может отличаться от 24 часов в дни перехода времени.
Можно ли прибавить дни к пустой дате (NULL)?
Нет, попытка выполнить арифметическую операцию над значением Null в 1С приведет к ошибке выполнения. Перед любыми вычислениями необходимо проверять дату на заполненность с помощью функции ЗначениеЗаполнено() или сравнением с Null.
Влияет ли часовой пояс сервера на результат прибавления дня?
Сама операция прибавления дня не зависит от часового пояса, так как она работает с абстрактным календарем. Однако функции получения текущей даты (ТекущаяДата()) и преобразования строк в дату могут учитывать настройки регионального стандарта сервера или клиента.
Как получить последний день месяца, прибавляя дни?
Самый надежный способ — использовать функцию КонецМесяца(Дата). Попытка вычислить это вручную путем прибавления дней ненадежна из-за разной длины месяцев. Встроенная функция гарантирует получение корректной даты (28, 29, 30 или 31 число).
Для большинства задач в 1С предпочтительнее использовать функцию ДобавлениеВдату, так как она явно указывает единицы измерения и гарантирует корректную обработку календарных границ.