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

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

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

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

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

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

Функции День, Месяц, Год — основной способ

Если у вас уже есть значение типа «Дата» (реквизит документа, переменная, результат функции ТекущаяДата()), то отдельные числовые компоненты извлекаются встроенными функциями. Каждая из них принимает дату и возвращает целое число:

ДатаДокумента = Документ.Дата; // например, 15.03.2026 10:30:00

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

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

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

Аналогично работают функции Час(), Минута() и Секунда() — они извлекают компоненты времени. Все эти функции доступны и на сервере, и на клиенте, работают в тонком, толстом и веб-клиенте, поэтому переносимость кода не вызывает проблем.

Обратите внимание: функции возвращают именно числа, без ведущих нулей. День(Дата(2026, 3, 5)) вернёт число 5, а не строку «05». Если ведущий ноль нужен для печатной формы, его добавляют через функцию Формат() — об этом ниже.

Формат() — дата как строка с нужным видом

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

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

СтрокаДень = Формат(ДатаДокумента, "ДФ=dd"); // "05"

СтрокаМесяц = Формат(ДатаДокумента, "ДФ=MM"); // "03"

СтрокаГод = Формат(ДатаДокумента, "ДФ=yyyy"); // "2026"

ДеньМесяц = Формат(ДатаДокумента, "ДФ='dd.MM'"); // "05.03"

ПолнаяДата = Формат(ДатаДокумента, "ДЛФ=D"); // "05.03.2026"

Если полученную строку нужно вернуть обратно в число (например, для сравнения или расчёта), применяется функция Число(): Число(Формат(ДатаДокумента, "ДФ=dd")) даст число 5. Однако в большинстве случаев такая двойная конверсия избыточна — проще сразу использовать День().

Формат() незаменим при формировании печатных форм, наименований файлов, представлений в отчётах, где требуется строго определённый вид даты: с ведущими нулями, с разделителями, с текстовым названием месяца (шаблон ДЛФ=DD даёт длинный формат вида «5 марта 2026 г.»).

Извлечение даты из строки

Вторая частая ситуация — дата хранится или приходит извне как строка: из файла обмена, CSV, веб-сервиса, пользовательского ввода. Здесь есть несколько подходов разной надёжности.

Конструктор Дата() из строки

Функция Дата() умеет принимать строку в формате «ГГГГММДДччммсс» (время можно опустить). Это быстрый способ, если вы контролируете формат источника:

СтрокаИзФайла = "20260315";

ДатаЗначение = Дата(СтрокаИзФайла); // 15.03.2026 0:00:00

Если строка не соответствует ожидаемому формату, платформа выдаст ошибку преобразования. Поэтому вызов стоит оборачивать в Попытка/Исключение, когда данные приходят из внешнего источника.

Разбор строки вручную

Когда дата записана в произвольном виде («15.03.2026», «15/03/2026»), строку разбирают по разделителю и собирают дату из числовых компонентов:

СтрокаДаты = "15.03.2026";

Части = СтрРазделить(СтрокаДаты, ".");

Если Части.Количество() = 3 Тогда

ДатаЗначение = Дата(Число(Части[2]), Число(Части[1]), Число(Части[0]));

КонецЕсли;

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

XMLЗначение для формата ISO

Данные, приходящие из XML, веб-сервисов и стандартных механизмов обмена, обычно содержат дату в формате ISO 8601 («2026-03-15T10:30:00»). Для таких строк предназначена функция XMLЗначение с указанием типа:

СтрокаISO = "2026-03-15T10:30:00";

ДатаЗначение = XMLЗначение(Тип("Дата"), СтрокаISO);

Это самый надёжный способ для интеграционных сценариев, так как формат ISO строго определён и не зависит от региональных настроек.

Маршрут решения

Как выбрать способ

Есть значение типа «Дата», нужен день, месяц или год как числоИспользуйте День(), Месяц(), Год()
Нужна строка заданного вида для печати или файлаИспользуйте Формат() с шаблоном ДФ или ДЛФ
Дата пришла строкой вида «ГГГГММДД»Используйте Дата(Строка)
Дата пришла строкой в произвольном форматеРазберите через СтрРазделить() и соберите Дата(год, месяц, день)
Дата пришла из XML или веб-сервиса в формате ISOИспользуйте XMLЗначение(Тип("Дата"), Строка)

Отбрасывание времени и сравнение дат

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

ДатаВремя = ТекущаяДата();           // например, 15.03.2026 14:25:30

ТолькоДата = НачалоДня(ДатаВремя); // 15.03.2026 0:00:00

Это критично при сравнении дат: две даты одного и того же дня, но с разным временем, не равны друг другу при обычном сравнении. Если проверка «документ выписан сегодня» построена как ДатаДокумента = ТекущаяДата(), она почти никогда не сработает. Правильный вариант — НачалоДня(ДатаДокумента) = НачалоДня(ТекущаяДата()).

Аналогично работают функции КонецДня(), НачалоМесяца(), КонецМесяца(), НачалоГода(), КонецГода() — они удобны для построения периодов отбора в отчётах и запросах.

Типичные ошибки
01
Сравнение дат без НачалоДня() — условие не срабатывает из-за различий во времени
02
Передача строки в День() или Месяц() — ошибка выполнения из-за несоответствия типа
03
Ожидание ведущего нуля от функции День() — она возвращает число 5, а не «05», для строки нужен Формат()
04
Разбор строки без проверки количества частей и диапазонов — ошибка на некорректных данных из внешнего файла
05
Путаница порядка дня и месяца при разборе строк из зарубежных источников

Получение компонентов даты в запросе

В языке запросов 1С извлечение компонентов даты выполняется собственными функциями, которые работают на уровне СУБД и не требуют выборки данных в код:

ВЫБРАТЬ

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

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

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

ИЗ

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

Дополнительно в запросах доступны функции НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА, позволяющие привести дату к началу или концу указанного периода (день, неделя, месяц, квартал, год). Это стандартный способ группировки данных по периодам в отчётах: например, НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ) позволяет сгруппировать продажи по месяцам.

Использовать функции запроса предпочтительнее, чем выбирать даты целиком и извлекать компоненты в коде: вычисления выполняются на сервере базы данных, объём передаваемых данных меньше, а группировка по периодам выполняется одним запросом.

bsl
// Комплексный пример: из даты получаем числа и строки
Д = ТекущаяДата();
ДеньЧислом = День(Д);                    // число
МесяцЧислом = Месяц(Д);                  // число
ГодЧислом = Год(Д);                      // число
ДеньСтрокой = Формат(Д, "ДФ=dd");       // "05"
Представление = Формат(Д, "ДЛФ=DD");    // длинный формат
БезВремени = НачалоДня(Д);               // дата без времени

Проверка корректности результата

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

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

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

Тип значения после обработки
Норма

ТипЗнч() возвращает «Дата» или «Число» — в зависимости от задачи

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

Значение осталось строкой, дальнейшие сравнения и расчёты работают неверно

Пустая дата
Норма

Значение 01.01.0001 обрабатывается осознанно — как признак незаполненности

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

Пустая дата попадает в расчёты и даёт день 1, месяц 1, год 1

Сравнение дат
Норма

Используется НачалоДня() с обеих сторон сравнения

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

Сравниваются даты с временем, условие не срабатывает

Разбор строки из файла
Норма

Проверено количество частей и диапазоны: месяц 1–12, день 1–31

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

Любая строка передаётся в Дата() без проверки, возможна ошибка выполнения

Отдельного внимания заслуживает пустая дата. В 1С незаполненное значение типа «Дата» — это 01.01.0001 0:00:00, а не NULL и не пустая строка. Функции День() и Месяц() от такой даты вернут единицу, что может незаметно исказить отчёт. Перед извлечением компонентов проверяйте заполненность: Если ЗначениеЗаполнено(ДатаЗначение) Тогда ... КонецЕсли.

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

Как получить из даты строку «05» вместо числа 5?

Используйте Формат(ДатаЗначение, "ДФ=dd") — шаблон dd гарантирует двузначное представление дня с ведущим нулём. Аналогично MM для месяца и yyyy для четырёхзначного года. Функция День() возвращает только число без форматирования.

Как узнать день недели по дате?

Функция ДеньНедели(ДатаЗначение) возвращает число от 1 (понедельник) до 7 (воскресенье). Для текстового представления дня недели используйте Формат(ДатаЗначение, "ДФ=dddd").

Как преобразовать строку «15.03.2026» в дату без ошибок?

Разбейте строку через СтрРазделить(СтрокаДаты, "."), проверьте, что получилось ровно три части и каждая состоит из цифр, затем соберите дату: Дата(Число(Части[2]), Число(Части[1]), Число(Части[0])). Весь блок разместите внутри Попытка/Исключение.

Чем отличается ТекущаяДата() от ТекущаяДатаСеанса()?

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

Как в запросе отобрать документы только за конкретный день?

Приведите дату документа к началу дня и сравните с нужной датой: ГДЕ НАЧАЛОПЕРИОДА(Документ.Дата, ДЕНЬ) = &НужнаяДата, а параметр передайте как НачалоДня(ТребуемаяДата). Либо используйте условие Документ.Дата МЕЖДУ &НачалоДня И &КонецДня.

Можно ли получить число из даты без кода, в пользовательском режиме?

Да, в отчётах на СКД и в настройках динамических списков доступны те же функции языка выражений: День, Месяц, Год, НачалоПериода. Добавьте вычисляемое поле с нужной функцией — и компонент даты появится в отчёте без доработки конфигурации.

Итог

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

Компоненты даты извлекаются функциями День(), Месяц(), Год(); строковое представление формируется через Формат(); строки преобразуются в дату через Дата(), разбор по разделителю или XMLЗначение(). Перед сравнением дат отбрасывайте время через НачалоДня() и всегда проверяйте значение на пустую дату.