Вычисление разницы между двумя датами в днях — одна из самых частых задач при работе с 1С:Предприятие. Без этого не обойтись при расчете просроченных платежей, определении стажа сотрудников, анализе временных интервалов в отчетах или автоматизации бизнес-процессов. Казалось бы, что может быть проще? Но в есть несколько способов получить разность дат, и каждый из них имеет свои нюансы.

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

1. Базовый метод: функция ДатаРазность()

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

Синтаксис функции:

ДатаРазность(Дата1, Дата2, "День")

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

ДатаНачала = '2026-01-15';

ДатаОкончания = '2026-02-20';

КоличествоДней = ДатаРазность(ДатаОкончания, ДатаНачала, "День");

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

  • Плюсы: максимальная простота, работает во всех версиях 1С 8.x, учитывает високосные годы
  • ⚠️ Минусы: не различает рабочие и выходные дни, не учитывает праздники
  • 🔄 Альтернатива: для обратного порядка дат (если Дата1 > Дата2) результат будет отрицательным
📊 Какой способ расчета разницы дат вы используете чаще?
Встроенную функцию ДатаРазность()
Запросы 1С
Собственные алгоритмы на встроенном языке
Готовые обработки из Инфостарта
⚠️ Внимание: Если вы передаете в функцию неполные даты (без времени), автоматически подставит 00:00:00. Это может привести к ошибке на 1 день при сравнении дат с временем. Всегда используйте полный формат: '2026-01-15 00:00:00'.

2. Вычитание дат как чисел

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

Пример кода:

Дата1 = '2026-03-10';

Дата2 = '2026-03-15';

РазницаДней = Дата2 - Дата1;

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

Этот способ работает быстрее ДатаРазность(), но имеет критические ограничения:

ПараметрДатаРазность()Вычитание чисел
Учет времени✅ Корректно❌ Округляет до дней
Високосные годы✅ Учитывает✅ Учитывает
Отрицательный результат✅ Возвращает✅ Возвращает
ПроизводительностьСредняя⚡ Высокая
💡

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

3. Расчет с учетом рабочих дней

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

  1. Использовать обработку "Календарь" из Библиотеки стандартных подсистем (БСП). Она содержит методы для проверки рабочих дней.
  2. Создать собственную функцию с учетом производственного календаря.

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

Функция РабочиеДниМеждуДатами(ДатаНачала, ДатаОкончания)

Календарь = Новый Структура();

Календарь.Вставить("20260101", Истина); // 1 января - праздник

Календарь.Вставить("20260501", Истина); // 1 мая - праздник

// ... добавить все праздники

КоличествоДней = 0;

ТекущаяДата = НачалоДня(ДатаНачала);

Пока ТекущаяДата <= КонецДня(ДатаОкончания) Цикл

ДеньНедели = ДеньНедели(ТекущаяДата);

ДатаСтрокой = Формат(ТекущаяДата, "ДФ=yyyyMMdd");

Если НЕ Календарь.Свойство(ДатаСтрокой) И ДеньНедели <> 6 И ДеньНедели <> 7 Тогда

КоличествоДней = КоличествоДней + 1;

КонецЕсли;

ТекущаяДата = ТекущаяДата + 86400; // +1 день в секундах

КонецЦикла;

Возврат КоличествоДней;

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

Как оптимизировать код для больших периодов?

Для расчета рабочих дней между датами с разницей в несколько лет можно:

1. Разбить период на полные недели (5 рабочих дней) и остаток

2. Вычесть праздники, попавшие на рабочие дни

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

Это сократит количество итераций с тысяч до десятков.

⚠️ Внимание: Производственные календари различаются по регионам! Например, в Москве и Санкт-Петербурге могут быть разные праздничные дни. Всегда уточняйте актуальный календарь для вашего предприятия.

4. Использование запросов 1С

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

Пример запроса для расчета просрочки платежей:

ВЫБРАТЬ

ДокументыСчета.Ссылка КАК Счет,

ДокументыСчета.Дата КАК ДатаСчета,

ТЕКУЩАЯДАТА() КАК ТекущаяДата,

ДАТАРАЗНОСТЬ(ТЕКУЩАЯДАТА(), ДокументыСчета.Дата, ДЕНЬ) КАК ПросрочкаДней

ИЗ

Документ.СчетаКлиентам КАК ДокументыСчета

ГДЕ

ДокументыСчета.Оплачен = ЛОЖЬ

И ДокументыСчета.Дата < ТЕКУЩАЯДАТА()

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

  • 📊 Обрабатывает тысячи записей за секунды
  • 🔄 Легко интегрируется в отчеты СКД (Система Компоновки Данных)
  • 📎 Можно добавить фильтрацию по организациям, контрагентам и другим параметрам

Использовать псевдонимы для полей (КАК)

Проверить индексы на таблицах для ускорения

Ограничить выборку по датам (ГДЕ Дата > ...)

Добавить УПОРЯДОЧИТЬ ПО для читаемости результата-->

5. Готовые обработки и расширения

Не хотите писать код? В экосистеме есть сотни готовых решений:

  1. Обработка "Календарь" из БСП — содержит функции для работы с рабочими днями и праздничными календарями.
  2. Расширение "Дополнительные функции даты" от Инфостарт — добавляет методы для сложных расчетов.
  3. Обработка "Анализ просрочки" — визуализирует разницу дат в виде диаграмм.

Где искать:

  • 🔍 Инфостарт — крупнейшая база обработок (более 50 000 решений)
  • 📦 Портал ИТС — официальные дополнения от
  • 🤝 Сообщества в Telegram и VK — часто выкладывают бесплатные обработки
💡

Перед установкой сторонних обработок всегда проверяйте их на тестовой базе! Особенно если они модифицируют конфигурацию. Лучше использовать расширения — они безопаснее для основной базы.

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

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

Даже опытные программисты иногда допускают ошибки при работе с датами. Вот самые распространенные:

  1. Игнорирование временной зоны — если в базе хранятся даты с временем (например, '2026-01-15 23:59:59'), простое вычитание может дать неверный результат.
  2. Путаница с форматами — функции ожидают дату в формате ГГГГ-ММ-ДД, а пользователи иногда вводят ДД.ММ.ГГГГ.
  3. Неучет летнего времени — при расчете разницы в часах может появиться лишний час.
  4. Округление результата — некоторые функции возвращают дробные дни (например, 3.14), которые нужно правильно интерпретировать.

Как проверить свой код:

// Тестовый сценарий

Дата1 = '2026-01-01 00:00:00';

Дата2 = '2026-01-02 23:59:59';

Результат1 = ДатаРазность(Дата2, Дата1, "День"); // Должно быть 1

Результат2 = Дата2 - Дата1; // Должно быть 1.999...

FAQ: Частые вопросы по расчету разницы дат

Можно ли в 1С получить разницу дат в месяцах с учетом неполных периодов?

Да, для этого используйте функцию ДатаРазность() с параметром "Месяц". Она вернет целое количество месяцев между датами. Например, разница между 01.01.2026 и 15.02.2026 составит 1 месяц, даже если фактически прошло 45 дней.

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

Как посчитать количество будних дней между двумя датами без выходных?

Стандартными средствами это сделать нельзя — нужно либо:

  1. Использовать обработку "Календарь" из БСП (если она подключена)
  2. Написать свою функцию с проверкой дня недели (ДеньНедели() = 6 или 7 — выходной)
  3. Подключить внешнюю компоненту для работы с календарями

Пример простого кода (без учета праздников):

КоличествоБуднихДней = 0;

ТекущаяДата = ДатаНачала;

Пока ТекущаяДата <= ДатаОкончания Цикл

Если ДеньНедели(ТекущаяДата) <> 6 И ДеньНедели(ТекущаяДата) <> 7 Тогда

КоличествоБуднихДней = КоличествоБуднихДней + 1;

КонецЕсли;

ТекущаяДата = ТекущаяДата + 86400;

КонецЦикла;

Почему функция ДатаРазность() иногда возвращает нецелое число?

Это происходит, когда вы передаете даты с временем. Функция учитывает не только дни, но и часы/минуты. Например:

Дата1 = '2026-01-01 12:00:00';

Дата2 = '2026-01-02 12:00:00';

Результат = ДатаРазность(Дата2, Дата1, "День"); // Вернет 1.0

Дата3 = '2026-01-01 23:00:00';

Дата4 = '2026-01-02 01:00:00';

Результат = ДатаРазность(Дата4, Дата3, "День"); // Вернет 0.083... (2 часа из 24)

Решение: используйте НачалоДня() или КонецДня() для приведения дат к целым суткам.

Как в запросе 1С отфильтровать записи по просрочке более 30 дней?

Используйте конструкцию ДАТАРАЗНОСТЬ() в секции ГДЕ:

ВЫБРАТЬ

Документы.Ссылка КАК Документ,

Документы.Дата КАК ДатаДокумента

ИЗ

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

ГДЕ

ДАТАРАЗНОСТЬ(ТЕКУЩАЯДАТА(), Документы.Дата, ДЕНЬ) > 30

И Документы.Статус = Значение(Перечисление.СтатусыДокументов.НеОплачен)

Для ускорения работы добавьте индекс на поле Дата в конфигураторе.

Где в 1С хранится производственный календарь для расчета рабочих дней?

В стандартных конфигурациях (УПП, ERP, КА, ЗУП) календарь хранится в справочнике "ПроизводственныеКалендари". Он содержит:

  • Список праздничных дней
  • Настройки рабочих недель (5- или 6-дневка)
  • Исключения для конкретных дат

Доступ к нему можно получить через:

Календарь = Календари.ПроизводственныйКалендарь();

Если Календарь.ЭтоРабочийДень(ТекущаяДата) Тогда

// Логика для рабочего дня

КонецЕсли;

В Бухгалтерии предприятия (БП) производственного календаря нет — его нужно создавать самостоятельно или подключать через расширения.