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

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

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

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

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

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

Ниже разобраны рабочие способы преобразования: через функцию Формат(), через разбор даты на составляющие, через вычисление разности дат, а также варианты для запросов и СКД. Для каждого способа указаны ограничения и типичные ошибки.

Что означает «преобразовать дату в число» в 1С

Тип «Дата» в платформе 1С:Предприятие содержит календарную дату и время с точностью до секунды. Внутреннее представление недоступно разработчику напрямую, поэтому «число из даты» всегда получают преобразованием через строковый формат или арифметику дат.

На практике встречаются четыре типовые постановки задачи:

  • получить числовое представление даты целиком, например 20260315 для 15 марта 2026 года — для нумерации, ключей, выгрузок;
  • извлечь отдельную часть даты как число — год, месяц, день, час;
  • вычислить количество дней или секунд между двумя датами;
  • получить порядковый номер дня в году или в неделе.

Способ 1: преобразование через функцию Формат()

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

ДатаДокумента = Дата(2026, 3, 15);

СтрокаДаты = Формат(ДатаДокумента, "ДФ=yyyyMMdd");

// Результат: "20260315"

ЧислоДаты = Число(СтрокаДаты);

// Результат: 20260315 (число)

Такой формат удобен для генерации уникальных ключей и сортировки: числа вида yyyyMMdd корректно упорядочиваются хронологически, потому что старшие разряды соответствуют более крупным единицам времени. Если нужна большая точность, добавьте часы, минуты и секунды: "ДФ=yyyyMMddHHmmss".

Обратите внимание: при преобразовании в число ведущие нули теряются, поэтому для дат, где важна фиксированная ширина поля (например, при обмене с банковскими системами), лучше хранить и передавать значение как строку, а не как число.

Способ 2: извлечение частей даты функциями Год(), Месяц(), День()

Когда нужно не целое числовое представление, а конкретная часть даты, используются штатные функции встроенного языка. Все они возвращают значения типа «Число»:

  • Год(Дата) — год, например 2026;
  • Месяц(Дата) — номер месяца от 1 до 12;
  • День(Дата) — день месяца от 1 до 31;
  • Час(Дата), Минута(Дата), Секунда(Дата) — компоненты времени;
  • ДеньГода(Дата) — порядковый номер дня с начала года;
  • ДеньНедели(Дата) — номер дня недели от 1 (понедельник) до 7;
  • НеделяГода(Дата) — номер недели в году.
ДатаДокумента = Дата(2026, 3, 15, 14, 30, 0);

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

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

ЧасДня = Час(ДатаДокумента); // 14

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

Способ 3: число как разность дат

В 1С допустима операция вычитания дат: результатом будет число — количество секунд между двумя моментами. Это стандартный способ получить длительность интервала.

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

ДатаОкончания = Дата(2026, 3, 15);

СекундМежду = ДатаОкончания - ДатаНачала;

// 1209600 секунд

ДнейМежду = СекундМежду / 86400;

// 14 дней

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

Тот же приём позволяет получить «абсолютное» число даты — количество секунд или дней от условной точки отсчёта. Например, вычитая из даты начало года, получают порядковый номер дня, а вычитая фиксированную опорную дату — значение, пригодное для сравнения и индексации в произвольных структурах.

bsl
СекундМежду = ДатаОкончания - ДатаНачала;
ДнейМежду = Цел((НачалоДня(ДатаОкончания) - НачалоДня(ДатаНачала)) / 86400);

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

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

ВЫБРАТЬ

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

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

СУММА(Продажи.Сумма) КАК Сумма

ИЗ

РегистрНакопления.Продажи КАК Продажи

СГРУППИРОВАТЬ ПО

ГОД(Продажи.Период),

МЕСЯЦ(Продажи.Период)

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

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

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

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

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

Год(), Месяц(), День()

Подходит для извлечения отдельных частей. Самый надёжный вариант, не зависит от настроек сеанса.

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

Подходит для длительностей и порядковых номеров. Даёт секунды — требуется пересчёт в нужные единицы.

Функции запроса

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

Типичные ошибки и ограничения

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

Вторая типичная проблема — работа с пустой датой. Пустая дата (значение '00010101') при форматировании даст строку с нулевым годом, а при вычитании — огромные отрицательные числа. Перед преобразованием проверяйте значение функцией ЗначениеЗаполнено() или сравнением с пустой датой.

Третья ошибка — использование регионально-зависимых форматов. Строка, полученная через Строка(Дата) или Формат() без параметра ДФ, зависит от настроек сеанса и может выглядеть как «15.03.2026» или «03/15/2026». Преобразование такой строки в число даст непредсказуемый результат. Всегда задавайте явный формат "ДФ=yyyyMMdd".

Типичные ошибки
01
Вызов Число(Дата) напрямую — ошибка преобразования типа, код останавливается.
02
Форматирование без параметра ДФ — строка зависит от региональных настроек, разбор даёт неверное число.
03
Игнорирование пустых дат — вычитание из '00010101' даёт огромные отрицательные значения и портит расчёты.
04
Деление разности дат на 86400 без Цел() — дробный результат при наличии времени в датах.
05
Хранение числового ключа даты как числа при обмене — теряются ведущие нули и нарушается формат внешней системы.

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

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

ЧислоДаты = Число(Формат(ИсходнаяДата, "ДФ=yyyyMMdd"));

// Обратная проверка

СтрокаЧисла = Формат(ЧислоДаты, "ЧГ=0");

Проверка = Дата(

Число(Лев(СтрокаЧисла, 4)),

Число(Сред(СтрокаЧисла, 5, 2)),

Число(Сред(СтрокаЧисла, 7, 2)));

Если НачалоДня(Проверка) <> НачалоДня(ИсходнаяДата) Тогда

ВызватьИсключение "Ошибка преобразования даты";

КонецЕсли;

Для разности дат контролируйте знак результата (отрицательное значение означает, что даты перепутаны местами) и диапазон: число дней между реальными бизнес-датами редко выходит за пределы нескольких тысяч. Аномально большие значения — признак пустой даты в одном из операндов.

Контрольные точки

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

Числовой ключ даты (yyyyMMdd)
Норма

Ровно 8 цифр, год в старших разрядах

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

7 цифр или меньше — потерян разряд, неверный формат

Разность дат в днях
Норма

Целое неотрицательное число в разумном диапазоне

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

Отрицательное, дробное или огромное значение — перепутан порядок дат или есть пустая дата

Извлечённый месяц/день
Норма

Месяц от 1 до 12, день от 1 до 31

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

Ноль или значение вне диапазона — дата пустая или повреждена

Итог

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

Прямого приведения даты к числу в 1С нет. Для числового ключа используйте Формат(Дата; "ДФ=yyyyMMdd"), для отдельных частей — Год(), Месяц(), День(), для интервалов — вычитание дат или РАЗНОСТЬДАТ() в запросе. Всегда проверяйте дату на заполненность и задавайте явный формат.

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

Можно ли получить Unix timestamp из даты в 1С?

Штатной функции нет, но значение вычисляется вычитанием опорной даты 1 января 1970 года: ЧислоСекунд = УниверсальноеВремя(Дата) - Дата(1970, 1, 1);. Важно использовать универсальное время (UTC), иначе результат будет смещён на часовой пояс сеанса.

Почему Число(Формат(Дата; "ДФ=ddMMyyyy")) даёт не то, что ожидалось?

Формат ddMMyyyy ставит день впереди, поэтому полученное число не сортируется хронологически и теряет ведущий ноль для дней 01–09. Для числовых ключей и сравнений используйте порядок yyyyMMdd — он сохраняет хронологический порядок при числовом сравнении.

Как посчитать количество месяцев между датами?

В запросе используйте РАЗНОСТЬДАТ(Дата1; Дата2; МЕСЯЦ). В коде встроенного языка прямой функции нет — вычисляют как (Год(Д2) - Год(Д1)) * 12 + Месяц(Д2) - Месяц(Д1), при необходимости корректируя на день месяца, если нужны полные календарные месяцы.

Что вернёт вычитание дат, если в них задано время?

Точное число секунд между моментами, включая время. Например, разность между 15 марта 14:00 и 14 марта 10:00 составит 100800 секунд (1 день 4 часа). При делении на 86400 получится 1,166..., поэтому для целых дней предварительно применяйте НачалоДня() к обеим датам.

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

Разбейте число на составляющие строковыми функциями и передайте их в конструктор Дата(Год; Месяц; День). Например, для числа 20260315: год — Лев(Строка; 4), месяц — Сред(Строка; 5; 2), день — Сред(Строка; 7; 2). Перед созданием даты убедитесь, что компоненты попадают в допустимые диапазоны, иначе будет вызвана ошибка.

Работает ли преобразование даты в число в тонком и веб-клиенте?

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