К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как перевести дату в число в 1С

Как перевести дату в число в 1С: функции Число(), Формат(), разность дат в секундах, преобразование в запросах. Примеры кода, ошибки и проверка результата.

Задача перевести дату в число возникает в 1С регулярно: при формировании уникальных кодов, сортировке данных, обмене с внешними системами, расчёте интервалов и построении ключей в соответствиях. Встроенный язык платформы не имеет одной универсальной функции «дата в число», поэтому используется несколько рабочих приёмов — выбор зависит от того, какое именно число нужно получить.

Чаще всего под «перевести дату в число» понимают одну из трёх задач: получить числовое представление даты в формате ГГГГММДД (например, 20260315), вычислить количество секунд или дней между двумя датами, либо извлечь из даты отдельный числовой компонент — год, месяц или день. Каждая задача решается своим инструментом.

Ниже разобраны основные способы с примерами кода, ограничения каждого подхода и типичные ошибки, которые приводят к неверным результатам в отчётах и обменах данными.

Почему нельзя просто написать Число(Дата)

Встроенная функция Число() в 1С преобразует только строковые и булевы значения. Если передать в неё значение типа «Дата», платформа выдаст ошибку «Преобразование значения к типу Число не может быть выполнено». Это принципиальное ограничение: у даты нет единственного «правильного» числового эквивалента, поэтому разработчик сам выбирает способ представления.

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

Способ 1: дата в число формата ГГГГММДД через Формат()

Самый распространённый приём — сначала превратить дату в строку нужного формата, а затем строку в число. Для этого используется функция Формат() с параметром форматной строки:

ДатаДокумента = ТекущаяДата();

ЧислоДаты = Число(Формат(ДатаДокумента, "ДФ=yyyyMMdd"));

// Результат: число вида 20260315

Форматную строку можно менять под задачу. Например, ДФ=yyyyMMddЧЧммсс даст число с точностью до секунды — такой код удобен для уникальных идентификаторов, сортировки по времени и ключей в соответствиях. Вариант ДФ=yyMMdd даёт более короткое число, но теряет информацию о веке.

Важный нюанс: если нужна именно строка-идентификатор, а не число, остановитесь на результате Формат() без обёртки в Число(). Строка сохраняет ведущие нули и предсказуемо сортируется, а число удобнее для арифметики и сравнения диапазонов.

bsl
ЧислоДаты = Число(Формат(ТекущаяДата(), "ДФ=yyyyMMdd"));
ЧислоССекундами = Число(Формат(ТекущаяДата(), "ДФ=yyyyMMddЧЧммсс"));

Способ 2: разность дат — число секунд между датами

Если под переводом даты в число понимается получение интервала, достаточно простого вычитания. Операция «Дата1 − Дата2» возвращает число — количество секунд между двумя моментами:

РазницаВСекундах = ДатаОкончания - ДатаНачала;

РазницаВДнях = РазницаВСекундах / 86400;

Чтобы получить дни, часы или минуты, результат делят на соответствующий коэффициент: 86400 секунд в сутках, 3600 в часе, 60 в минуте. Для целого числа дней применяют функцию Цел() или Окр() в зависимости от того, нужно отбрасывать дробную часть или округлять.

Обратный приём тоже работает: прибавив к дате число, вы смещаете её на указанное количество секунд. Так удобно сдвигать даты в расчётах графиков и сроков.

Способ 3: извлечение числовых частей даты

Когда нужен не код даты целиком, а отдельный компонент, используются встроенные функции: Год(Дата), Месяц(Дата), День(Дата), Час(Дата), Минута(Дата), Секунда(Дата). Все они возвращают значения типа «Число»:

НомерГода = Год(ДатаДокумента);   // например, 2026

НомерМесяца = Месяц(ДатаДокумента); // от 1 до 12

НомерДня = День(ДатаДокумента); // от 1 до 31

Дополнительно полезны НеделяГода(Дата) и ДеньНедели(Дата) — они тоже возвращают числа и часто применяются в отчётах по неделям и в проверках рабочих дней.

Из отдельных чисел можно собрать составной код арифметикой: Год(Д) 10000 + Месяц(Д) 100 + День(Д) даст тот же результат, что и приём с Формат(). Этот вариант работает быстрее в массовых циклах, так как не использует строковые операции.

Преобразование даты в число в запросах

В языке запросов 1С свои инструменты. Функции ГОД(), МЕСЯЦ(), ДЕНЬ(), ЧАС(), МИНУТА(), СЕКУНДА() возвращают числовые части даты непосредственно в выборке:

ВЫБРАТЬ

ГОД(Продажи.Дата) КАК Год,

МЕСЯЦ(Продажи.Дата) КАК Месяц

ИЗ

Документ.РеализацияТоваровУслуг КАК Продажи

Для вычисления интервалов в запросе служит функция РАЗНОСТЬДАТ(Дата1, Дата2, Единица), где единица — СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, МЕСЯЦ или ГОД. Она сразу возвращает число в нужной размерности, что избавляет от ручного деления секунд.

Получить число вида ГГГГММДД прямо в запросе можно выражением ГОД(Дата) 10000 + МЕСЯЦ(Дата) 100 + ДЕНЬ(Дата). Такой приём используют, когда результат запроса выгружается во внешнюю систему, ожидающую числовой код даты.

Сравнение способов

Число(Формат(Дата))

Универсально и читаемо; подходит для кодов дат. Минус — строковые операции медленнее в больших циклах.

Арифметика Год*10000+Месяц*100+День

Быстрее в массовых обработках и работает в запросах; код чуть менее очевиден.

Вычитание дат

Единственный способ получить интервал; результат всегда в секундах, требует пересчёта в дни.

РАЗНОСТЬДАТ в запросе

Сразу даёт число в нужной единице; доступна только в языке запросов.

Практические сценарии применения

Уникальный числовой код по дате и времени

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

Сортировка и сравнение

Числовое представление ГГГГММДД корректно сортируется как обычное число — это удобно при передаче данных в системы, не понимающие тип «Дата». Порядок сортировки числа совпадает с хронологическим порядком только при формате от старшего разряда к младшему (год-месяц-день), но не наоборот.

Расчёт сроков и просрочек

Классическая задача — вычислить просрочку оплаты в днях: Цел((ТекущаяДата() - ДатаОплаты) / 86400). Положительное число означает просрочку, отрицательное — дни до наступления срока. Такой код легко выводится в отчёты и используется в условиях рассылки уведомлений.

Порядок действий
  1. 1
    Определите, какое число нужно: код даты, интервал или отдельная часть даты.
  2. 2
    Для кода даты используйте Число(Формат(Дата, "ДФ=yyyyMMdd")) или арифметику Год/Месяц/День.
  3. 3
    Для интервала вычтите даты и при необходимости разделите секунды на 86400.
  4. 4
    В запросах применяйте ГОД(), МЕСЯЦ(), ДЕНЬ() и РАЗНОСТЬДАТ().
  5. 5
    Проверьте результат на контрольной дате с известным значением.

Проверка результата и типичные ошибки

Проверять преобразование удобно на заведомо известной дате. Например, для 15 марта 2026 года числовой код должен быть 20260315, а разница между полуночью двух соседних дней — ровно 86400 секунд. Отклонение от этих значений сразу указывает на ошибку в форматной строке или в коэффициенте пересчёта.

Самая частая ошибка — неверная форматная строка: ДФ=ddMMyyyy вместо ДФ=yyyyMMdd даёт число, которое сортируется не по хронологии. Вторая типичная проблема — потеря времени: если дата содержит время, а формат включает только день, числа для разных моментов одних суток совпадут.

Типичные ошибки
01
Передача даты напрямую в Число() — ошибка преобразования типа и остановка кода.
02
Формат ddMMyyyy вместо yyyyMMdd — числовая сортировка ломает хронологический порядок.
03
Деление секунд на 24 вместо 86400 — завышенный в 3600 раз результат в «днях».
04
Игнорирование времени в дате — совпадение кодов для разных моментов одних суток.
05
Использование кода даты как уникального идентификатора при пакетной обработке — дубли в пределах одной секунды.
Контрольные точки

Как проверить результат

Код даты для 15.03.2026
Норма

Число 20260315

Тревожный признак

15032026 или другое значение — неверная форматная строка

Разница соседних суток
Норма

Ровно 86400 секунд

Тревожный признак

Другое значение — проблема с часовыми поясами

Сортировка числовых кодов
Норма

Порядок совпадает с хронологией

Тревожный признак

Младшие месяцы идут раньше старших — перепутан формат

Ограничения и когда число не подходит

Числовое представление даты теряет часть информации: из числа 20260315 нельзя восстановить время, часовой пояс и исходный тип данных. Если дату нужно будет обратно превратить в значение типа «Дата», надёжнее хранить её в строковом формате ISO (ГГГГ-ММ-ДД) или в виде универсальной даты в миллисекундах при обмене с веб-сервисами.

Обратное преобразование из числа ГГГГММДД выполняется через разбор числа на части и функцию Дата(Год, Месяц, День). При этом стоит проверять корректность входных данных: число 20260230 даст ошибку, так как 30 февраля не существует.

Итог

Что важно запомнить

Прямого Число(Дата) в 1С нет. Код даты получают через Формат() или арифметику Год/Месяц/День, интервал — вычитанием дат с пересчётом секунд, в запросах — функциями ГОД(), МЕСЯЦ(), ДЕНЬ() и РАЗНОСТЬДАТ(). Формат yyyyMMdd обязателен для корректной сортировки, а для уникальности число даты не подходит.

Частые вопросы

Как из числа 20260315 обратно получить дату?

Разделите число на части: год — Цел(Число / 10000), месяц — Цел((Число % 10000) / 100), день — Число % 100. Затем соберите дату функцией Дата(Год, Месяц, День). Перед этим проверьте, что месяц в диапазоне 1–12, а день не превышает число дней в месяце.

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

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

Работает ли Формат() с ДФ=yyyyMMdd на английском интерфейсе?

Да, коды форматной строки ДФ зависят от встроенного языка конфигурации, а не от языка интерфейса пользователя. Если конфигурация разработана на русском встроенном языке, используйте русские коды (ДФ, ЧЧ), на английском — DF и HH.

Как перевести дату в число в СКД для сортировки?

В наборе данных СКД добавьте вычисляемое поле с выражением ГОД(Дата) 10000 + МЕСЯЦ(Дата) 100 + ДЕНЬ(Дата) и сортируйте по нему. Либо используйте функцию РАЗНОСТЬДАТ от фиксированной опорной даты — число секунд тоже корректно сортируется.

Можно ли сложить дату и число в 1С?

Да, операция «Дата + Число» допустима и возвращает новую дату, сдвинутую на указанное количество секунд. Например, Дата + 86400 даст тот же момент следующих суток. Для сдвига на месяцы и годы надёжнее использовать функцию ДобавитьМесяц(), так как длительность месяцев различается.

Почему вычитание дат даёт неожиданно большое число?

Результат вычитания — это секунды, а не дни. Разница в один день равна 86400, в год — более 31 миллиона. Если нужны дни, разделите значение на 86400. Также проверьте, не перепутаны ли операнды местами: отрицательный результат означает, что первая дата раньше второй.