Разработка и Конфигурация · 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 разрядов, проблема возможна только при выгрузке во внешние форматы с ограничениями.
ВЫБРАТЬ ГОД(Док.Дата) <em> 10000 + МЕСЯЦ(Док.Дата) </em> 100 + ДЕНЬ(Док.Дата) КАК ДатаЧислом ИЗ Документ.РеализацияТоваровУслуг КАК ДокРазность дат числом: сроки, просрочка, стаж
Когда требуется не сама дата, а интервал между двумя датами в числовом виде, используется функция РАЗНОСТЬДАТ. Третий параметр задаёт единицу измерения: ДЕНЬ, МЕСЯЦ, ГОД, ЧАС, МИНУТА, СЕКУНДА.
ВЫБРАТЬ
Счет.Ссылка КАК Счет,
РАЗНОСТЬДАТ(Счет.ДатаОплаты, &ТекущаяДата, ДЕНЬ) КАК ДнейПросрочки
ИЗ
Документ.СчетНаОплатуПокупателю КАК Счет
ГДЕ
РАЗНОСТЬДАТ(Счет.ДатаОплаты, &ТекущаяДата, ДЕНЬ) > 0
Функция возвращает целое число полных единиц между датами. Если вторая дата раньше первой, результат будет отрицательным — это удобно для определения просрочки: положительное значение означает, что срок наступил и прошёл.
Нюанс с единицей МЕСЯЦ и ГОД: считаются полные календарные единицы. Разность между 31 января и 1 февраля в месяцах равна нулю, хотя прошёл день. Для расчёта стажа или возраста это стандартное поведение, но для точных расчётов в днях всегда используйте единицу ДЕНЬ.
Дата как строка и обратно: когда числа недостаточно
Иногда «выразить дату» означает представить её текстом в заданном формате — например, для печатной формы или файла обмена. В языке запросов для этого есть функция ПРЕДСТАВЛЕНИЕ(Дата), но она возвращает строку в формате по умолчанию, зависящем от региональных настроек, и управлять форматом не позволяет.
Для произвольного формата строку собирают из числовых компонентов с дополнением нулями. Поскольку в запросе нет функции Формат, применяют приём с ВЫБОР и ПОДСТРОКА, либо конкатенацию с условием:
ВЫБРАТЬ
ВЫБОР
КОГДА МЕСЯЦ(Док.Дата) < 10
ТОГДА "0" + МЕСЯЦ(Док.Дата)
ИНАЧЕ ВЫРАЗИТЬ(МЕСЯЦ(Док.Дата) КАК СТРОКА(2))
КОНЕЦ КАК МесяцСтрокой
ИЗ
Документ.РеализацияТоваровУслуг КАК Док
Если форматирование сложное, практичнее вернуть из запроса саму дату и обработать её во встроенном языке функцией Формат(Дата, "ДФ=yyyyMMdd") — это проще и надёжнее, чем собирать строку в запросе. Запрос должен отдавать данные, а оформление — задача кода или СКД, где есть собственные настройки формата полей.
Способы представить дату числом
Отдельные числовые компоненты. Подходит для группировок и фильтров, но не даёт единого значения даты.
Единое число YYYYMMDD для выгрузки и сортировки. Требует контроля разрядности при экспорте.
Числовой интервал между датами. Не представляет саму дату, только разность.
Гибкое строковое представление вне запроса. Не работает внутри текста запроса.
Проверка результата и типичные ошибки
После написания запроса проверьте результат в консоли запросов на небольшой выборке. Убедитесь, что числовой ключ соответствует исходной дате: для документа от 5 марта значение Месяц должно быть 3, а составной ключ должен заканчиваться на 0305, а не на 35.
Частая проблема — пустая дата (01.01.0001). Функции ГОД, МЕСЯЦ, ДЕНЬ от пустой даты вернут 1, 1 и 1, а составной ключ даст 10101, что может исказить сортировку и выгрузку. Добавляйте условие ГДЕ Док.Дата <> ДАТАВРЕМЯ(1, 1, 1) или обрабатывайте такие записи через ВЫБОР.
Ещё одна ошибка — использование конкатенации числа со строкой без явного приведения типа. В выражении "0" + МЕСЯЦ(Дата) платформа неявно преобразует число в строку, но результат зависит от настроек; надёжнее писать ВЫРАЗИТЬ(МЕСЯЦ(Дата) КАК СТРОКА(2)). Также помните, что ВЫРАЗИТЬ числа в строку дополняет значение пробелами слева до заданной длины — учитывайте это при сравнении строк.
Как проверить результат
Для 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 и производительностью при фильтрации по компонентам даты.