Разработка и Конфигурация · 11 мин
Как перевести дату в число в 1С
Как перевести дату в число в 1С: функции Число(), Формат(), разность дат в секундах, преобразование в запросах. Примеры кода, ошибки и проверка результата.
Задача перевести дату в число возникает в 1С регулярно: при формировании уникальных кодов, сортировке данных, обмене с внешними системами, расчёте интервалов и построении ключей в соответствиях. Встроенный язык платформы не имеет одной универсальной функции «дата в число», поэтому используется несколько рабочих приёмов — выбор зависит от того, какое именно число нужно получить.
Чаще всего под «перевести дату в число» понимают одну из трёх задач: получить числовое представление даты в формате ГГГГММДД (например, 20260315), вычислить количество секунд или дней между двумя датами, либо извлечь из даты отдельный числовой компонент — год, месяц или день. Каждая задача решается своим инструментом.
Ниже разобраны основные способы с примерами кода, ограничения каждого подхода и типичные ошибки, которые приводят к неверным результатам в отчётах и обменах данными.
Почему нельзя просто написать Число(Дата)
Встроенная функция Число() в 1С преобразует только строковые и булевы значения. Если передать в неё значение типа «Дата», платформа выдаст ошибку «Преобразование значения к типу Число не может быть выполнено». Это принципиальное ограничение: у даты нет единственного «правильного» числового эквивалента, поэтому разработчик сам выбирает способ представления.
По той же причине не работают и неявные преобразования: попытка сложить дату со строкой или присвоить дату числовой переменной приведёт либо к ошибке, либо к неожиданному результату. Все преобразования нужно выполнять явно, контролируя формат.
Способ 1: дата в число формата ГГГГММДД через Формат()
Самый распространённый приём — сначала превратить дату в строку нужного формата, а затем строку в число. Для этого используется функция Формат() с параметром форматной строки:
ДатаДокумента = ТекущаяДата();
ЧислоДаты = Число(Формат(ДатаДокумента, "ДФ=yyyyMMdd"));
// Результат: число вида 20260315
Форматную строку можно менять под задачу. Например, ДФ=yyyyMMddЧЧммсс даст число с точностью до секунды — такой код удобен для уникальных идентификаторов, сортировки по времени и ключей в соответствиях. Вариант ДФ=yyMMdd даёт более короткое число, но теряет информацию о веке.
Важный нюанс: если нужна именно строка-идентификатор, а не число, остановитесь на результате Формат() без обёртки в Число(). Строка сохраняет ведущие нули и предсказуемо сортируется, а число удобнее для арифметики и сравнения диапазонов.
ЧислоДаты = Число(Формат(ТекущаяДата(), "ДФ=yyyyMMdd"));
ЧислоССекундами = Число(Формат(ТекущаяДата(), "ДФ=yyyyMMddЧЧммсс"));Способ 2: разность дат — число секунд между датами
Если под переводом даты в число понимается получение интервала, достаточно простого вычитания. Операция «Дата1 − Дата2» возвращает число — количество секунд между двумя моментами:
РазницаВСекундах = ДатаОкончания - ДатаНачала;
РазницаВДнях = РазницаВСекундах / 86400;
Чтобы получить дни, часы или минуты, результат делят на соответствующий коэффициент: 86400 секунд в сутках, 3600 в часе, 60 в минуте. Для целого числа дней применяют функцию Цел() или Окр() в зависимости от того, нужно отбрасывать дробную часть или округлять.
Обратный приём тоже работает: прибавив к дате число, вы смещаете её на указанное количество секунд. Так удобно сдвигать даты в расчётах графиков и сроков.
Способ 3: извлечение числовых частей даты
Когда нужен не код даты целиком, а отдельный компонент, используются встроенные функции: Год(Дата), Месяц(Дата), День(Дата), Час(Дата), Минута(Дата), Секунда(Дата). Все они возвращают значения типа «Число»:
НомерГода = Год(ДатаДокумента); // например, 2026
НомерМесяца = Месяц(ДатаДокумента); // от 1 до 12
НомерДня = День(ДатаДокумента); // от 1 до 31
Дополнительно полезны НеделяГода(Дата) и ДеньНедели(Дата) — они тоже возвращают числа и часто применяются в отчётах по неделям и в проверках рабочих дней.
Из отдельных чисел можно собрать составной код арифметикой: Год(Д) 10000 + Месяц(Д) 100 + День(Д) даст тот же результат, что и приём с Формат(). Этот вариант работает быстрее в массовых циклах, так как не использует строковые операции.
Преобразование даты в число в запросах
В языке запросов 1С свои инструменты. Функции ГОД(), МЕСЯЦ(), ДЕНЬ(), ЧАС(), МИНУТА(), СЕКУНДА() возвращают числовые части даты непосредственно в выборке:
ВЫБРАТЬ
ГОД(Продажи.Дата) КАК Год,
МЕСЯЦ(Продажи.Дата) КАК Месяц
ИЗ
Документ.РеализацияТоваровУслуг КАК Продажи
Для вычисления интервалов в запросе служит функция РАЗНОСТЬДАТ(Дата1, Дата2, Единица), где единица — СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, МЕСЯЦ или ГОД. Она сразу возвращает число в нужной размерности, что избавляет от ручного деления секунд.
Получить число вида ГГГГММДД прямо в запросе можно выражением ГОД(Дата) 10000 + МЕСЯЦ(Дата) 100 + ДЕНЬ(Дата). Такой приём используют, когда результат запроса выгружается во внешнюю систему, ожидающую числовой код даты.
Сравнение способов
Универсально и читаемо; подходит для кодов дат. Минус — строковые операции медленнее в больших циклах.
Быстрее в массовых обработках и работает в запросах; код чуть менее очевиден.
Единственный способ получить интервал; результат всегда в секундах, требует пересчёта в дни.
Сразу даёт число в нужной единице; доступна только в языке запросов.
Практические сценарии применения
Уникальный числовой код по дате и времени
Для генерации кодов в обменах часто берут число из даты с точностью до секунды. Учтите: две операции в одну секунду дадут одинаковое число, поэтому для гарантированной уникальности добавляют порядковый номер или используют Новый УникальныйИдентификатор вместо даты.
Сортировка и сравнение
Числовое представление ГГГГММДД корректно сортируется как обычное число — это удобно при передаче данных в системы, не понимающие тип «Дата». Порядок сортировки числа совпадает с хронологическим порядком только при формате от старшего разряда к младшему (год-месяц-день), но не наоборот.
Расчёт сроков и просрочек
Классическая задача — вычислить просрочку оплаты в днях: Цел((ТекущаяДата() - ДатаОплаты) / 86400). Положительное число означает просрочку, отрицательное — дни до наступления срока. Такой код легко выводится в отчёты и используется в условиях рассылки уведомлений.
- 1Определите, какое число нужно: код даты, интервал или отдельная часть даты.
- 2Для кода даты используйте Число(Формат(Дата, "ДФ=yyyyMMdd")) или арифметику Год/Месяц/День.
- 3Для интервала вычтите даты и при необходимости разделите секунды на 86400.
- 4В запросах применяйте ГОД(), МЕСЯЦ(), ДЕНЬ() и РАЗНОСТЬДАТ().
- 5Проверьте результат на контрольной дате с известным значением.
Проверка результата и типичные ошибки
Проверять преобразование удобно на заведомо известной дате. Например, для 15 марта 2026 года числовой код должен быть 20260315, а разница между полуночью двух соседних дней — ровно 86400 секунд. Отклонение от этих значений сразу указывает на ошибку в форматной строке или в коэффициенте пересчёта.
Самая частая ошибка — неверная форматная строка: ДФ=ddMMyyyy вместо ДФ=yyyyMMdd даёт число, которое сортируется не по хронологии. Вторая типичная проблема — потеря времени: если дата содержит время, а формат включает только день, числа для разных моментов одних суток совпадут.
Как проверить результат
Число 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. Также проверьте, не перепутаны ли операнды местами: отрицательный результат означает, что первая дата раньше второй.