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

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

Как создать дату в 1С: способы, функции и примеры

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

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

Во встроенном языке 1С дата хранится с точностью до секунды и содержит одновременно и календарную часть, и время. Это важно: если вы создаёте дату без указания времени, время будет равно 00:00:00, и сравнение такой даты с датой документа, у которой время отлично от полуночи, даст «не равно».

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

Литерал даты — самый простой способ

Литерал даты записывается прямо в коде в одинарных кавычках в формате ГГГГММДД. Это удобно, когда дата известна заранее и не меняется — например, дата начала применения нового алгоритма расчёта.

ДатаНачала = '20260115';        // 15 января 2026, время 00:00:00

ДатаСоВременем = '20260115143000'; // 15.01.2026 14:30:00

Формат литерала: четыре цифры года, две цифры месяца, две цифры дня, далее опционально часы, минуты и секунды. Если время не указано, оно равно нулю. Разделители в литерале не используются — запись '15.01.2026' будет воспринята как строка, а не как дата.

Проверить тип значения можно функцией ТипЗнч(): ТипЗнч('20260115') = Тип("Дата") вернёт Истина. Это полезно при отладке, когда непонятно, что именно лежит в переменной.

Функция Дата() — сборка даты из чисел

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

Год = 2026;

Месяц = 3;

День = 25;

НоваяДата = Дата(Год, Месяц, День); // 25.03.2026 0:00:00

ДатаСВременем = Дата(2026, 3, 25, 18, 30, 0); // 25.03.2026 18:30:00

Функция строга к диапазонам: месяц от 1 до 12, день — в пределах количества дней конкретного месяца. Вызов Дата(2026, 2, 30) вызовет ошибку исполнения, потому что 30 февраля не существует. Если данные приходят извне (из файла, формы, обмена), перед вызовом стоит проверять их корректность.

Также функция Дата() умеет принимать строку: Дата("20260325"). Но этот вариант менее очевиден и чувствителен к формату, поэтому для строк надёжнее использовать подход из раздела про преобразование.

Текущая дата: ТекущаяДатаСеанса и ТекущаяДата

Для получения текущего момента в серверном коде используйте ТекущаяДатаСеанса(). Она возвращает дату и время компьютера, на котором выполняется сеанс, с учётом часового пояса сеанса. В клиент-серверном режиме это единственный корректный способ узнать «сейчас» на сервере.

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

// Серверный контекст

Сейчас = ТекущаяДатаСеанса();

// Клиентский контекст (толстый/тонкий клиент)

СейчасНаКлиенте = ТекущаяДата();

Преобразование строки в дату

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

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

НоваяДата = Дата(

Число(Сред(СтрокаДаты, 7, 4)), // год

Число(Сред(СтрокаДаты, 4, 2)), // месяц

Число(Лев(СтрокаДаты, 2))); // день

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

В запросах преобразование делает функция ДАТАВРЕМЯ(год, месяц, день): ДАТАВРЕМЯ(2026, 1, 15). Передать строку напрямую в параметр запроса, где ожидается дата, нельзя — сначала преобразуйте её в коде.

Типичные ошибки при работе со строками
01
Сравнение строки с датой: '15.01.2026' = ДатаДокумента всегда ложно, потому что типы разные
02
Разбор строки без проверки формата: строка «2026-01-15» ломает позиции Сред() и даёт неверную дату или ошибку
03
Передача строки в параметр запроса вместо даты — запрос либо падает, либо возвращает пустой результат

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

Пустая дата в 1С — это значение '00010101' (1 января года 1, время 00:00:00). Именно она хранится в незаполненных реквизитах типа «Дата». Проверка на пустоту выполняется функцией ЗначениеЗаполнено() или прямым сравнением:

Если Не ЗначениеЗаполнено(ДатаОплаты) Тогда

Сообщить("Дата оплаты не указана");

КонецЕсли;

Если ДатаОплаты = '00010101' Тогда

// дата пустая

КонецЕсли;

В запросах пустую дату передают параметром &ПустаяДата со значением '00010101' или сравнивают с ДАТАВРЕМЯ(1, 1, 1). Ошибка новичков — проверять дату на Неопределено или пустую строку: реквизит типа «Дата» никогда не принимает таких значений.

Арифметика дат и границы периодов

К дате можно прибавлять и вычитать секунды: Завтра = ТекущаяДатаСеанса() + 86400. Для сдвига на месяцы и годы есть функции ДобавитьМесяц(Дата, 1) и комбинации с НачалоМесяца(), КонецМесяца().

Для отборов по периоду критично правильно задать границы. Если пользователь выбрал период «с 1 по 31 марта», то условие Дата <= '20260331' захватит только записи ровно в 00:00:00 31 марта — все документы за день выпадут. Правильно использовать КонецДня(ДатаОкончания), который возвращает 23:59:59.

НачалоПериода = НачалоДня(ДатаНачала);      // 00:00:00

КонецПериода = КонецДня(ДатаОкончания); // 23:59:59

Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);

Запрос.УстановитьПараметр("КонецПериода", КонецПериода);

Для отборов по регистрам сведений и накопления вместо КонецДня() часто применяют объект Граница с видом «Включая» — это важно, когда позиция документа определяется не только датой, но и ссылкой внутри одной секунды.

Как создать дату и проверить результат
  1. 1
    Выберите способ: литерал '20260115', Дата(год, месяц, день) или ТекущаяДатаСеанса()
  2. 2
    Если данные из строки — проверьте формат и соберите дату через Дата() с Число()
  3. 3
    Для периода оберните границы в НачалоДня() и КонецДня()
  4. 4
    Проверьте результат: выведите дату через Сообщить() или посмотрите в отладчике — тип должен быть «Дата», время — ожидаемым
  5. 5
    Для отбора в запросе убедитесь, что параметр имеет тип Дата, а не Строка

Сравнение способов создания даты

СпособКогда применятьОграничения
Литерал '20260115'Фиксированная дата, известная на этапе разработкиНельзя подставить переменные
Дата(год, месяц, день)Компоненты даты в переменных или из строкиОшибка при несуществующей дате (30.02)
ТекущаяДатаСеанса()Текущий момент на сервере, запись данныхТолько серверный контекст
ТекущаяДата()Интерфейсные задачи на клиентеЗависит от часов пользователя
ДАТАВРЕМЯ() в запросеКонстантная дата прямо в тексте запросаТолько числовые аргументы-константы
Итог

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

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

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

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

Используйте НачалоДня(ИсходнаяДата) — время станет 00:00:00. Полностью «отрезать» время нельзя: тип «Дата» всегда его содержит. Для отображения без времени применяйте Формат(Дата, "ДЛФ=D").

Почему сравнение двух одинаковых на вид дат даёт «не равно»?

Почти всегда причина в разном времени: 15.01.2026 00:00:00 не равно 15.01.2026 10:25:00. Перед сравнением приведите обе даты через НачалоДня() либо сравнивайте попадание в диапазон.

Как прибавить к дате месяц или год?

Функцией ДобавитьМесяц(Дата, КоличествоМесяцев) — она корректно обрабатывает переход через год и разную длину месяцев. Для прибавления лет вызовите ДобавитьМесяц(Дата, 12 * КоличествоЛет).

Чему равна пустая дата и как её задать явно?

Пустая дата — '00010101' (01.01.0001 00:00:00). Чтобы очистить реквизит, присвойте ему это значение: Объект.ДатаОплаты = '00010101'.

Можно ли создать дату из строки «2026-01-15» напрямую?

Функция Дата() надёжно распознаёт строку формата ГГГГММДД без разделителей. Строку с дефисами сначала обработайте: удалите разделители через СтрЗаменить() или разберите по позициям и соберите через Дата(год, месяц, день).

Какая функция вернёт текущую дату в фоновом задании?

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