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

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

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

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

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

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

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

Объявление даты литералом

Литерал даты — это значение, записанное непосредственно в коде в одинарных кавычках. Формат строго фиксированный: 'ГГГГММДД' для даты без времени и 'ГГГГММДДЧЧММСС' для даты со временем. Разделители (точки, дефисы, слэши) в литерале не допускаются.

ДатаОтчета = '20260315';            // 15 марта 2026 года

ДатаВремя = '20260315143000'; // 15 марта 2026 года, 14:30:00

НачалоПериода = '20260101'; // 1 января 2026 года

Порядок в литерале всегда один: год, месяц, день, затем часы, минуты, секунды. Это отличается от привычного пользовательского формата «дд.мм.гггг», и перепутывание порядка — самая частая причина ошибок. Запись '15032026' не будет датой 15 марта — платформа попытается интерпретировать её как год 1503, месяц 20, что вызовет ошибку.

Литерал удобен, когда дата известна заранее и не меняется: границы периодов в отчётах, даты начала учёта, фиксированные константы в алгоритмах. Если дата вычисляется или приходит извне — используйте функции.

Объявление даты функцией Дата()

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

ДатаДокумента = Дата(2026, 3, 15);            // 15.03.2026 0:00:00

ДатаСоВременем = Дата(2026, 3, 15, 14, 30, 0); // 15.03.2026 14:30:00

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

Если передать недопустимые значения (месяц 13, день 32), платформа выдаст ошибку исполнения. Поэтому при получении чисел из внешних источников стоит проверять их диапазоны до вызова функции.

Получение текущей даты

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

Сегодня = ТекущаяДатаСеанса();

НачалоСегодня = НачалоДня(ТекущаяДатаСеанса());

КонецСегодня = КонецДня(ТекущаяДатаСеанса());

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

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

Пустая (незаполненная) дата в 1С — это значение '00010101', то есть 1 января года 1. Она возникает, когда реквизит типа «Дата» не заполнен, и часто становится причиной ошибок в отчётах и запросах, если её не обработать.

ПустаяДата = '00010101';

// или эквивалентно:

ПустаяДата = Дата(1, 1, 1);

Если Не ЗначениеЗаполнено(РеквизитДата) Тогда

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

КонецЕсли;

Для проверки используйте функцию ЗначениеЗаполнено() — она корректно определяет пустую дату, пустую строку, ноль и неопределённую ссылку. Прямое сравнение Если РеквизитДата = '00010101' Тогда тоже работает, но менее читаемо и не универсально.

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

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

// Строка в формате ГГГГММДД

ДатаИзСтроки = Дата("20260315");

// Строка в формате дд.мм.гггг

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

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

ДатаИзСтроки = Дата(Число(Части[2]), Число(Части[1]), Число(Части[0]));

При разборе строк из внешних источников всегда оборачивайте преобразование в Попытка...Исключение и проверяйте количество частей после разделения. Иначе некорректная строка остановит выполнение обработки.

Безопасное преобразование строки в дату
  1. 1
    Проверьте, что строка не пустая и имеет ожидаемую длину
  2. 2
    Разделите строку по разделителю и убедитесь, что получилось три части
  3. 3
    Преобразуйте части в числа внутри блока Попытка...Исключение
  4. 4
    Проверьте диапазоны: месяц 1–12, день 1–31
  5. 5
    Вызовите Дата(Год, Месяц, День) и проверьте результат через ЗначениеЗаполнено()

Объявление даты в запросе

В тексте запроса дату передают двумя способами: параметром (рекомендуется) или литералом ДАТАВРЕМЯ. Параметр безопаснее и позволяет переиспользовать запрос с разными значениями.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Продажи.Номенклатура

|ИЗ

| РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи";

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

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

Литерал внутри текста запроса записывается так: ДАТАВРЕМЯ(2026, 3, 15, 14, 30, 0). Время можно опустить — тогда подставится начало дня. Помните, что при периодичности «по документу» или при сравнении с датами документов границу конца периода лучше задавать через КонецДня(), иначе документы последнего дня не попадут в выборку.

bsl
Запрос.Текст = "ВЫБРАТЬ Т.Ссылка ИЗ Документ.Реализация КАК Т ГДЕ Т.Дата МЕЖДУ ДАТАВРЕМЯ(2026,1,1) И ДАТАВРЕМЯ(2026,3,31,23,59,59)";

Частые ошибки при работе с датами

Большинство проблем с датами в 1С сводится к нескольким повторяющимся ситуациям. Знание их заранее экономит время на отладке.

Типичные ошибки
01
Запись литерала как '15.03.2026' — это строка, а не дата; сравнение и отборы работают неверно
02
Перепутанный порядок в литерале: '15032026' вместо '20260315' — ошибка преобразования или неверный год
03
Сравнение ТекущаяДата() с датой документа без учёта времени — документы «сегодня» не попадают в условие
04
Игнорирование пустой даты '00010101' — в отчётах появляются строки с несуществующим периодом
05
Использование ТекущаяДата() на клиенте в клиент-серверном режиме — расхождение данных из-за часовых поясов

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

Итог

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

Дата объявляется литералом 'ГГГГММДД', функцией Дата(Год, Месяц, День) или ТекущаяДатаСеанса(). Пустая дата — '00010101'. В запросах используйте параметры или ДАТАВРЕМЯ(). Всегда учитывайте время при сравнениях и проверяйте заполненность даты перед использованием.

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

Как объявить переменную типа «Дата» без значения?

Просто присвойте пустую дату: ПеременнаяДата = '00010101';. В 1С нет отдельного объявления типа переменной — тип определяется присвоенным значением. Пока значение не присвоено, переменная имеет значение Неопределено.

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

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

Как из даты убрать время?

Используйте функцию НачалоДня(Дата) — она возвращает ту же дату со временем 0:00:00. Для конца дня применяйте КонецДня(Дата) — время 23:59:59.

Почему сравнение дат даёт неверный результат?

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

Как задать дату в формате, отличном от ГГГГММДД?

Литерал поддерживает только формат ГГГГММДД(ЧЧММСС). Для других форматов разбирайте строку через СтрРазделить() и собирайте дату функцией Дата(Год, Месяц, День). Форматировать дату для вывода пользователю можно функцией Формат(Дата, "ДЛФ=D").