В процессе разработки конфигураций на платформе 1С:Предприятие часто возникает необходимость вычислить временной интервал. Будь то расчет премии за отработанный период, определение срока годности товара или формирование отчета по дебиторской задолженности, умение работать с датами является базовым навыком.

Платформа предоставляет несколько способов решения этой задачи, от простых арифметических операций до использования специализированных методов объектов. Выбор конкретного алгоритма зависит от того, какие именно сутки нужно посчитать: календарные или рабочие.

В этой статье мы подробно разберем все доступные инструменты для получения разницы в днях. Вы узнаете о нюансах использования оператора вычитания, особенностях функции ДнейВГоду и методах глобального контекста.

Использование оператора вычитания дат

Самый простой и очевидный способ получить количество дней между двумя моментами времени — это использование оператора вычитания -. В языке запросов и встроенном языке платформы дата представляет собой числовое значение, где целая часть соответствует количеству дней.

Когда вы вычитаете одну дату из другой, система автоматически возвращает число, равное разнице в сутках. Результатом такой операции всегда будет числовой тип данных. Это наиболее быстрый метод с точки зрения производительности.

Однако стоит помнить, что при работе с объектами типа ДатаВремя необходимо учитывать временную составляющую. Если вам нужны полные дни, дробную часть результата следует отбросить или округлить.

Пример использования в коде:

ДатаНачала = Дата(2026, 01, 01);

ДатаКонца = Дата(2026, 01, 10);

Разница = ДатаКонца - ДатаНачала;

// Результат: 9

💡

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

Важно понимать, что порядок операндов влияет на знак результата. Если дата начала позже даты конца, вы получите отрицательное число. В некоторых сценариях это удобно для логики программы, в других — требует дополнительной обработки через функцию Абс().

💡

Оператор вычитания возвращает разницу в днях как число. Для получения модуля разницы используйте функцию Абс().

Применение функции ДнейВГоду

Функция ДнейВГоду часто вызывает путаницу у начинающих разработчиков, так как ее название не полностью отражает функционал. На самом деле, этот инструмент предназначен для определения номера дня в году или разницы между датами с учетом года.

Функция может принимать один или два параметра. При передаче одного параметра (даты) она возвращает номер дня от начала года (от 1 до 365 или 366). Это полезно при расчете периодов внутри одного календарного года.

  • 📅 Возвращает порядковый номер даты в году.
  • 📅 При двух параметрах вычисляет разницу с учетом перехода года.
  • 📅 Автоматически учитывает високосные годы.

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

⚠️ Внимание: Функция ДнейВГоду с двумя параметрами может вести себя иначе в разных версиях платформы или контекстах вызова. Для универсальности кода предпочтительнее использовать явное вычитание дат.

Особое внимание стоит уделить високосным годам. Платформа 1С:Предприятие корректно обрабатывает 29 февраля. При расчете интервалов, захватывающих февраль високосного года, результат будет точным без дополнительных проверок.

📊 Какой метод расчета дат вы используете чаще?
Оператор минус (-)
Функция ДнейВГоду
Методы объекта Дата
Сложные циклы

Работа с методами объекта Дата

В современных версиях платформы объект Дата обладает расширенным набором методов для манипуляций со временем. Хотя прямого метода "РазницаВднях" может не быть в явном виде, комбинация методов позволяет решать сложные задачи.

Например, метод НачалоДня() позволяет привести дату к midnight (00:00:00), что исключает влияние времени на расчет разницы. Это критически важно при сравнении дат документов, где время создания не имеет значения.

⚠️ Внимание: Интерфейсы и доступные методы могут отличаться в зависимости от версии конфигурации и платформы. Всегда сверяйтесь со справкой по вашей конкретной версии 1С.

Рассмотрим пример очистки времени перед расчетом:

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

Дата2 = Дата(2026, 12, 31, 15, 30, 00);

// Очищаем время

Дата1Очищенная = Дата1.НачалоДня();

Дата2Очищенная = Дата2.НачалоДня();

КоличествоДней = Дата2Очищенная - Дата1Очищенная;

Использование методов объекта делает код более читаемым и самодокументируемым. Вы явно указываете намерение работать именно с границами дней, а не с точными временными метками.

Почему время влияет на расчет?

Если Дата1 = 01.01.2026 23:00, а Дата2 = 02.01.2026 01:00, то разница составит всего 2 часа (0.083 дня), а не 1 сутки.

Расчет количества рабочих дней

Задача усложняется, когда требуется исключить выходные и праздничные дни. Стандартными средствами платформы - или ДнейВГоду это сделать невозможно, так как они считают только календарные сутки.

Для решения этой проблемы существует специальная функция КоличествоРабочихДней. Она доступна в глобальном контексте и позволяет указать производственный календарь. Это незаменимый инструмент для кадрового учета и расчета зарплаты.

Функция принимает следующие аргументы:

  • 🏭 Дата начала периода.
  • 🏭 Дата окончания периода.
  • 🏭 Ссылка на объект производственного календаря (необязательно).

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

Метод Учитывает выходные Скорость работы Сложность
Вычитание (-) Нет Высокая Низкая
ДнейВГоду() Нет Высокая Низкая
КоличествоРабочихДней() Да Средняя Средняя
Ручной цикл Да (настраиваемое) Низкая Высокая

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

☑️ Проверка расчета рабочих дней

Выполнено: 0 / 9

Обработка ошибок и граничные значения

При работе с датами в 1С:Предприятие существуют ограничения на диапазон допустимых значений. Минимальная дата — 01.01.0001, максимальная — 31.12.9999. Попытка вычислить разницу за пределами этого диапазона приведет к ошибке выполнения.

Частой ошибкой является передача неопределенного значения (Неопределено) в функции расчета дат. Платформа не сможет выполнить арифметическую операцию и выдаст сообщение об ошибке типизации.

Всегда проверяйте входные данные перед расчетом:

Если ДатаНачала = Неопределено Или ДатаКонца = Неопределено Тогда

Сообщить("Даты не заполнены");

Возврат;

КонецЕсли;

Также стоит учитывать часовой пояс, если система работает в распределенной среде или с веб-клиентом. Конвертация времени может сдвинуть дату на соседний день, что исказит результат расчета разницы в 1 сутки.

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

Часто задаваемые вопросы

Как получить разницу в месяцах, а не в днях?

Для расчета разницы в месяцах нельзя просто разделить количество дней на 30. Используйте функцию РазностьДат, указав в параметре тип периода ПериодДаты.Месяц. Это позволит получить точное количество полных месяцев между датами.

Почему результат вычитания дат дробный?

Потому что даты содержат информацию о времени (часы, минуты, секунды). Разница в 12 часов будет представлена как 0.5. Чтобы получить целые дни, используйте функцию Цел() или предварительно обрежьте время методом НачалоДня().

Можно ли вычитать дату из строки?

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

Как учесть разные часовые пояса при расчете?

Используйте методы объекта Дата для конвертации времени: ВремяМестное() или ВремяUTC(). Приведите обе даты к одному часовому поясу перед выполнением операции вычитания.

Что вернет функция, если дата конца раньше даты начала?

Функции вычитания и ДнейВГоду вернут отрицательное число. Функция КоличествоРабочихДней также может вернуть отрицательное значение или ноль, в зависимости от реализации и версии платформы. Для получения модуля разницы используйте Абс().