Разработка и Конфигурация · 9 мин
Как из даты получить дни в 1С
Как из даты получить дни в 1С: функции День(), ДеньГода(), ДеньНедели(), разность дат в запросе, вычисление количества дней между датами с примерами кода.
Работа с датами — одна из самых частых задач при разработке и доработке конфигураций 1С. Под формулировкой «получить дни из даты» обычно скрывается несколько разных задач: извлечь номер дня месяца, определить день недели или день года, посчитать количество дней между двумя датами, получить число дней в конкретном месяце. Для каждой из них во встроенном языке и в языке запросов есть свои инструменты.
Во встроенном языке 1С дата — это отдельный примитивный тип, содержащий одновременно дату и время с точностью до секунды. Извлечь из него составные части можно встроенными функциями День(), Месяц(), Год(), ДеньНедели(), ДеньГода(). Для вычисления разности дат используется либо простое вычитание (результат — в секундах), либо функция запроса РАЗНОСТЬДАТ, которая удобнее при массовых расчётах.
Ниже разобраны все основные сценарии с готовыми фрагментами кода, которые можно переносить в свои модули с минимальной адаптацией. Примеры одинаково работают в управляемых и обычных формах, на клиенте и на сервере, если не указано иное.
Получение номера дня месяца функцией День()
Самая простая задача — вытащить из даты число месяца. Для этого служит функция День(), которая принимает значение типа Дата и возвращает целое число от 1 до 31.
ДатаДокумента = Дата(2026, 3, 15);
НомерДня = День(ДатаДокумента); // результат: 15
Функция корректно обрабатывает концы месяцев и високосные годы: для 29 февраля она вернёт 29, для 31 декабря — 31. Никаких дополнительных проверок писать не нужно.
Если день нужен в строковом виде с лидирующим нулём (например, для формирования номера документа или имени файла), используйте функцию Формат():
СтрокаДня = Формат(ДатаДокумента, "ДФ=dd"); // "05" для 5 марта
Обратите внимание: Формат() возвращает строку, а не число. Если результат потом участвует в арифметике, преобразуйте его обратно через Число(), иначе получите ошибку сложения строки с числом.
День недели и день года
Определение дня недели
Функция ДеньНедели() возвращает число от 1 до 7, где 1 — понедельник, 7 — воскресенье. Это соответствует российской привычке считать неделю с понедельника, но отличается от некоторых зарубежных систем, где неделя начинается с воскресенья.
Если ДеньНедели(ТекущаяДата()) >= 6 Тогда
Сообщить("Это выходной день");
КонецЕсли;
Такая проверка часто используется при расчёте сроков оплаты, дат доставки, планировании задач. Если нужно название дня недели строкой, применяйте Формат(Дата, "ДФ=dddd") — вернётся «понедельник», «вторник» и т.д. с учётом региональных настроек.
Порядковый день в году
Функция ДеньГода() возвращает порядковый номер дня с начала года — от 1 до 365 (или 366 в високосном году). Она удобна для расчётов, привязанных к годовым циклам: нормы выработки, графики ТО, сезонные коэффициенты.
НомерДняВГоду = ДеньГода(Дата(2026, 12, 31)); // 366 для високосного года
Количество дней между двумя датами
Вычитание двух дат во встроенном языке даёт результат в секундах, а не в днях. Это частая причина ошибок у начинающих разработчиков. Чтобы получить дни, результат делят на число секунд в сутках — 86400.
РазностьВСекундах = ДатаОкончания - ДатаНачала;
КоличествоДней = Цел(РазностьВСекундах / 86400);
Здесь есть тонкость: если в датах задано время, разность может быть не кратна суткам. Например, между 10:00 понедельника и 18:00 вторника — 1,33 суток. Функция Цел() отбросит дробную часть, что не всегда желательно. Если нужно считать именно календарные дни без привязки ко времени, предварительно обрежьте время функцией НачалоДня():
КоличествоДней = (НачалоДня(ДатаОкончания) - НачалоДня(ДатаНачала)) / 86400;
Такой вариант даёт целое число календарных дней и не зависит от времени внутри дат. Именно его стоит использовать при расчёте просрочки платежей, сроков хранения, длительности отпусков.
РАЗНОСТЬДАТ в языке запросов
Когда дни нужно вычислить для большого набора данных — например, просрочку по тысяче документов, — делать это в цикле после выборки нерационально. В языке запросов есть функция РАЗНОСТЬДАТ, выполняющая расчёт на стороне СУБД.
ВЫБРАТЬ
Счет.Ссылка КАК Счет,
РАЗНОСТЬДАТ(Счет.Дата, &ТекущаяДата, ДЕНЬ) КАК ДнейПросрочено
ИЗ
Документ.СчетНаОплатуПокупателю КАК Счет
ГДЕ
НЕ Счет.Оплачен
Первые два параметра — начальная и конечная даты, третий — единица измерения: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, МЕСЯЦ, КВАРТАЛ, ГОД. Результат — целое число полных единиц между датами.
В том же запросе можно извлечь и составные части даты: функции ДЕНЬ(Дата), МЕСЯЦ(Дата), ГОД(Дата), ДЕНЬНЕДЕЛИ(Дата), ДЕНЬГОДА(Дата) работают аналогично встроенному языку. Это удобно для группировок в отчётах, например «по дням недели» или «по числам месяца».
РазностьВДнях = (НачалоДня(Дата2) - НачалоДня(Дата1)) / 86400;Число дней в месяце и добавление дней к дате
Сколько дней в заданном месяце
Готовой функции «количество дней в месяце» в языке нет, но она легко получается через конец месяца:
ДнейВМесяце = День(КонецМесяца(ПроизвольнаяДата));
Функция КонецМесяца() возвращает последний момент месяца (23:59:59 последнего дня), а День() извлекает из него номер последнего дня — это и есть число дней в месяце с учётом високосных лет.
Прибавление и вычитание дней
Прибавить фиксированное число дней можно простым сложением с секундами: НоваяДата = Дата + 7 * 86400. Однако для сдвига на месяцы и годы такой способ не подходит из-за разной длины месяцев. Универсальный инструмент — функция ДобавитьМесяц() для месячных сдвигов, а для дней — сложение секунд.
В запросах для сдвига дат используется функция ДОБАВИТЬКДАТЕ(Дата, ДЕНЬ, 5), которая корректно работает и с днями, и с месяцами, и с годами. Для вычитания передавайте отрицательное число.
Сравнение вариантов
Подходит для единичных расчётов в коде. Требует контроля времени в датах, иначе результат дробный
Оптимально для массовых выборок и отчётов. Расчёт на стороне СУБД, но недоступно вне запроса
Подходит для вывода дня строкой в печатные формы и имена файлов. Не пригоден для арифметики
Проверка результата и граничные случаи
После внедрения расчёта дней проверьте его на граничных значениях: переход через месяц и год, високосный февраль, даты с ненулевым временем, пустая дата. Пустая дата в 1С — это Дата(1,1,1), и День() от неё вернёт 1, что может исказить расчёты. Перед вычислениями полезно проверять заполненность: Если ЗначениеЗаполнено(ДатаНачала) Тогда ....
Отдельный риск — даты, приходящие извне: из Excel, веб-сервисов, обменов. Они могут быть в текстовом виде в неожиданном формате (американский MM/DD/YYYY вместо DD/MM/YYYY). Преобразование такой строки без контроля формата даёт перевёрнутые день и месяц, и ошибка всплывёт только на датах после 12-го числа.
Как проверить результат
Между 31.01 и 01.02 ровно 1 день
Получается 0 или 2 — проверьте время в датах и деление на 86400
Между 28.02 и 01.03 високосного года 2 дня
Результат 1 день — вероятно, даты собраны строкой без учёта года
Есть проверка ЗначениеЗаполнено, расчёт пропускается
Разность показывает огромные числа — участвует дата 01.01.0001
Что важно запомнить
День месяца, недели и года извлекаются функциями День(), ДеньНедели(), ДеньГода(). Разность дат в коде — в секундах, делите на 86400 и отсекайте время через НачалоДня(). Для массовых расчётов используйте РАЗНОСТЬДАТ в запросе. Всегда проверяйте пустые даты и формат внешних данных.
Частые вопросы
Как получить день недели словом, а не числом?
Используйте Формат(Дата, "ДФ=dddd") — вернётся полное название дня («среда»), а с шаблоном "ДФ=ddd" — сокращённое («ср»). Регистр и язык зависят от региональных настроек сеанса.
Почему разность двух дат даёт огромное число вроде 31536000?
Потому что вычитание дат возвращает секунды, а не дни. Разделите результат на 86400, чтобы получить дни. Число 31536000 — это как раз год в секундах.
Как посчитать только рабочие дни между датами?
Встроенной функции нет. Стандартный подход — использовать регистр сведений с производственным календарём (в типовых конфигурациях он есть) и посчитать записи с признаком рабочего дня в нужном интервале запросом.
Чем отличается РАЗНОСТЬДАТ от вычитания дат в коде?
РАЗНОСТЬДАТ выполняется на стороне СУБД внутри запроса и сразу возвращает целое число в указанных единицах. Вычитание в коде даёт секунды и требует ручного пересчёта, но доступно в любом месте модуля без запроса.
Как прибавить к дате 30 дней?
Простым сложением: НоваяДата = ИсходнаяДата + 30 * 86400. В запросе — ДОБАВИТЬКДАТЕ(Дата, ДЕНЬ, 30). Оба способа корректно переходят через границы месяцев и лет.
Функция День() возвращает 1 для пустого реквизита — это ошибка?
Нет. Пустая дата в 1С — это 01.01.0001, и День() честно возвращает 1. Перед расчётом проверяйте реквизит функцией ЗначениеЗаполнено(), чтобы не считать дни от начала летоисчисления.