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

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

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

Как в запросе 1С преобразовать дату в число: функции ГОД, МЕСЯЦ, ДЕНЬ, РАЗНОСТЬДАТ, форматирование даты строкой и приёмы сортировки. Примеры кода и типичные ошибки.

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

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

Ниже разобраны рабочие приёмы с примерами кода на языке запросов 1С: от простого извлечения года до составного числового ключа даты и расчёта разности дат. Все примеры применимы в конструкторе запросов, консоли запросов и встроенном языке.

Какие функции языка запросов 1С извлекают числа из даты

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

Все эти функции принимают один аргумент — поле или выражение типа Дата. Результат можно использовать в выборке, условиях ГДЕ, группировках и упорядочивании. Например, запрос ВЫБРАТЬ ГОД(Документ.Дата) КАК ГодДокумента ИЗ Документ.РеализацияТоваровУслуг вернёт числовой год каждого документа.

Важно понимать, что результат — обычное число, и над ним выполняются любые арифметические операции. Это позволяет строить выражения вроде ГОД(Дата) * 12 + МЕСЯЦ(Дата) — удобный линейный номер месяца для сравнения периодов без привязки к году.

Извлечение года, месяца и дня: базовые примеры

Типовой запрос, выводящий дату документа разложенной на числовые части, выглядит так:

ВЫБРАТЬ

Реализация.Ссылка КАК Документ,

ГОД(Реализация.Дата) КАК Год,

МЕСЯЦ(Реализация.Дата) КАК Месяц,

ДЕНЬ(Реализация.Дата) КАК День

ИЗ

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

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

Для фильтрации по компоненту даты условие записывается напрямую: ГДЕ ГОД(Реализация.Дата) = &Год И МЕСЯЦ(Реализация.Дата) = &Месяц. Учтите, что такой фильтр не использует индекс по полю Дата — на больших таблицах предпочтительнее сравнивать саму дату с границами периода через ДОБАВИТЬКДАТЕ или параметры начала и конца периода.

Составной числовой ключ даты: как получить число вида 20260115

Если нужно единое число, однозначно кодирующее дату (для выгрузки, сравнения или сортировки), его собирают арифметическим выражением. Классическая формула: год умножается на 10000, месяц — на 100, день добавляется как есть:

ВЫБРАТЬ

ГОД(Реализация.Дата) * 10000

+ МЕСЯЦ(Реализация.Дата) * 100

+ ДЕНЬ(Реализация.Дата) КАК ДатаЧислом

ИЗ

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

Для 15 января 2026 года результатом будет число 20260115. Такой ключ монотонно возрастает вместе с датой, поэтому по нему корректно работают сортировка и сравнения «больше/меньше». Это удобно при обмене с системами, где дата хранится в формате YYYYMMDD.

Если нужен ключ с точностью до минут или секунд, формулу расширяют: (ГОД(Дата) 10000 + МЕСЯЦ(Дата) 100 + ДЕНЬ(Дата)) 10000 + ЧАС(Дата) 100 + МИНУТА(Дата). Следите за разрядностью: результат превышает 10 знаков, поэтому при выводе в числовое поле проверьте, что точности типа Число хватает — в 1С число поддерживает до 38 разрядов, проблема возможна только при выгрузке во внешние форматы с ограничениями.

bsl
ВЫБРАТЬ ГОД(Док.Дата) <em> 10000 + МЕСЯЦ(Док.Дата) </em> 100 + ДЕНЬ(Док.Дата) КАК ДатаЧислом ИЗ Документ.РеализацияТоваровУслуг КАК Док

Разность дат числом: сроки, просрочка, стаж

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

ВЫБРАТЬ

Счет.Ссылка КАК Счет,

РАЗНОСТЬДАТ(Счет.ДатаОплаты, &ТекущаяДата, ДЕНЬ) КАК ДнейПросрочки

ИЗ

Документ.СчетНаОплатуПокупателю КАК Счет

ГДЕ

РАЗНОСТЬДАТ(Счет.ДатаОплаты, &ТекущаяДата, ДЕНЬ) > 0

Функция возвращает целое число полных единиц между датами. Если вторая дата раньше первой, результат будет отрицательным — это удобно для определения просрочки: положительное значение означает, что срок наступил и прошёл.

Нюанс с единицей МЕСЯЦ и ГОД: считаются полные календарные единицы. Разность между 31 января и 1 февраля в месяцах равна нулю, хотя прошёл день. Для расчёта стажа или возраста это стандартное поведение, но для точных расчётов в днях всегда используйте единицу ДЕНЬ.

Дата как строка и обратно: когда числа недостаточно

Иногда «выразить дату» означает представить её текстом в заданном формате — например, для печатной формы или файла обмена. В языке запросов для этого есть функция ПРЕДСТАВЛЕНИЕ(Дата), но она возвращает строку в формате по умолчанию, зависящем от региональных настроек, и управлять форматом не позволяет.

Для произвольного формата строку собирают из числовых компонентов с дополнением нулями. Поскольку в запросе нет функции Формат, применяют приём с ВЫБОР и ПОДСТРОКА, либо конкатенацию с условием:

ВЫБРАТЬ

ВЫБОР

КОГДА МЕСЯЦ(Док.Дата) < 10

ТОГДА "0" + МЕСЯЦ(Док.Дата)

ИНАЧЕ ВЫРАЗИТЬ(МЕСЯЦ(Док.Дата) КАК СТРОКА(2))

КОНЕЦ КАК МесяцСтрокой

ИЗ

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

Если форматирование сложное, практичнее вернуть из запроса саму дату и обработать её во встроенном языке функцией Формат(Дата, "ДФ=yyyyMMdd") — это проще и надёжнее, чем собирать строку в запросе. Запрос должен отдавать данные, а оформление — задача кода или СКД, где есть собственные настройки формата полей.

Способы представить дату числом

ГОД / МЕСЯЦ / ДЕНЬ

Отдельные числовые компоненты. Подходит для группировок и фильтров, но не даёт единого значения даты.

Составной ключ ГОД*10000+МЕСЯЦ*100+ДЕНЬ

Единое число YYYYMMDD для выгрузки и сортировки. Требует контроля разрядности при экспорте.

РАЗНОСТЬДАТ

Числовой интервал между датами. Не представляет саму дату, только разность.

Формат() во встроенном языке

Гибкое строковое представление вне запроса. Не работает внутри текста запроса.

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

После написания запроса проверьте результат в консоли запросов на небольшой выборке. Убедитесь, что числовой ключ соответствует исходной дате: для документа от 5 марта значение Месяц должно быть 3, а составной ключ должен заканчиваться на 0305, а не на 35.

Частая проблема — пустая дата (01.01.0001). Функции ГОД, МЕСЯЦ, ДЕНЬ от пустой даты вернут 1, 1 и 1, а составной ключ даст 10101, что может исказить сортировку и выгрузку. Добавляйте условие ГДЕ Док.Дата <> ДАТАВРЕМЯ(1, 1, 1) или обрабатывайте такие записи через ВЫБОР.

Ещё одна ошибка — использование конкатенации числа со строкой без явного приведения типа. В выражении "0" + МЕСЯЦ(Дата) платформа неявно преобразует число в строку, но результат зависит от настроек; надёжнее писать ВЫРАЗИТЬ(МЕСЯЦ(Дата) КАК СТРОКА(2)). Также помните, что ВЫРАЗИТЬ числа в строку дополняет значение пробелами слева до заданной длины — учитывайте это при сравнении строк.

Типичные ошибки
01
Фильтр ГДЕ ГОД(Дата) = &Год на большой таблице — отключается индекс, запрос выполняется долго. Замените на диапазон дат.
02
Игнорирование пустой даты 01.01.0001 — в выгрузку попадает ключ 10101. Отфильтруйте или обработайте через ВЫБОР.
03
Ожидание, что РАЗНОСТЬДАТ в месяцах считает дни — функция возвращает только полные календарные месяцы.
04
Конкатенация числа со строкой без ВЫРАЗИТЬ — непредсказуемый формат и лишние пробелы в результате.
Контрольные точки

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

Составной ключ даты
Норма

Для 05.03.2026 ключ равен 20260305

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

Ключ вида 202635 — потеряны ведущие нули месяца и дня

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

Знак соответствует порядку аргументов, целое число полных единиц

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

Дробная часть или неожиданный знак — перепутан порядок дат

Пустые даты
Норма

Записи с 01.01.0001 исключены или обработаны

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

В результате строки с ключом 10101

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

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

Штатной функции нет. Приближённо timestamp в секундах можно вычислить как РАЗНОСТЬДАТ(ДАТАВРЕМЯ(1970, 1, 1), Дата, СЕКУНДА), но без учёта часового пояса. Для корректного обмена обычно считают значение во встроенном языке с учётом смещения времени.

Как отсортировать документы по дате, если дата хранится строкой?

Строковая сортировка дат в формате ДД.ММ.ГГГГ работает неправильно. Либо преобразуйте строку в дату на этапе записи данных, либо соберите из подстрок составной числовой ключ через ПОДСТРОКА и ВЫРАЗИТЬ в число, а затем сортируйте по нему.

Почему РАЗНОСТЬДАТ между 31 января и 1 февраля в месяцах даёт 0?

Функция считает только полные календарные единицы. Между этими датами не прошло полного месяца, поэтому результат — ноль. Для точных расчётов используйте единицу ДЕНЬ.

Можно ли передать единицу измерения в РАЗНОСТЬДАТ параметром?

Нет, третий аргумент — только ключевое слово (ДЕНЬ, МЕСЯЦ и т.д.). Если единица выбирается пользователем, формируйте текст запроса программно или используйте несколько веток через ВЫБОР с отдельными вызовами функции.

Как в СКД вывести дату числом без изменения запроса?

В схеме компоновки данных для поля можно задать выражение ресурса или вычисляемое поле с теми же функциями ГОД, МЕСЯЦ, ДЕНЬ. Также доступно оформление поля с форматной строкой, если нужно только визуальное представление.

Что вернёт ГОД от значения NULL?

NULL — функции извлечения компонентов даты от NULL возвращают NULL. Это типично при левых соединениях. Обрабатывайте через ЕСТЬNULL(ГОД(Дата), 0), чтобы избежать пустых значений в числовых полях.

Итог

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

Прямого преобразования даты в число в запросе 1С нет: используйте ГОД, МЕСЯЦ, ДЕНЬ для компонентов, РАЗНОСТЬДАТ для интервалов и составной ключ ГОД*10000+МЕСЯЦ*100+ДЕНЬ для единого числа. Следите за пустыми датами, NULL и производительностью при фильтрации по компонентам даты.