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

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

Как создать переменную типа Дата в 1С

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

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

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

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

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

В модуле переменная объявляется ключевым словом Перем. Внутри процедуры или функции объявлять переменную необязательно — достаточно присвоить значение, и тип определится автоматически. Явное объявление полезно для переменных уровня модуля и для читаемости кода.

Перем ДатаОтчета; // объявление переменной

Процедура Сформировать()

ДатаОтчета = Дата(2026, 3, 15); // 15 марта 2026, время 00:00:00

ДатаСВременем = Дата(2026, 3, 15, 14, 30, 0); // с указанием времени

КонецПроцедуры

Функция Дата() принимает от трёх до шести числовых аргументов: год, месяц, день и необязательные часы, минуты, секунды. Если время не указано, оно равно началу дня — 00:00:00. Передача некорректных значений (например, месяц 13 или день 32) вызовет ошибку исполнения, поэтому данные из внешних источников стоит проверять до вызова.

Есть и второй вариант синтаксиса — строковый: Дата("20260315143000"). Строка должна содержать 14 цифр в формате ГГГГММДДччммсс либо 8 цифр ГГГГММДД. Такой формат удобен при разборе данных из файлов обмена.

Получение текущей даты: какую функцию выбрать

Для текущего момента времени в платформе есть несколько функций, и их различие принципиально в клиент-серверном режиме.

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

Создание даты из строки и из реквизитов объектов

Частая задача — превратить пользовательский ввод или значение из файла в дату. Универсальной функции «СтрокаВДату» в языке нет, поэтому применяют два подхода.

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

Функция ДатаИзСтроки(Стр) Экспорт

// ожидаем формат ДД.ММ.ГГГГ

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

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

Возврат Дата(1, 1, 1); // пустая дата

КонецЕсли;

Возврат Дата(Число(Части[2]), Число(Части[1]), Число(Части[0]));

КонецФункции

Дату из реквизита документа или элемента справочника получают обычным обращением к свойству: ДатаДок = ДокументОбъект.Дата;. При обращении через ссылку (Ссылка.Дата) платформа выполняет скрытый запрос к базе — в циклах это заметно замедляет код, поэтому массовые данные лучше получать одним запросом.

Дата в запросах: литералы и параметры

В тексте запроса дату задают литералом вида ДАТАВРЕМЯ(2026, 1, 1) или передают параметром. Литерал уместен для фиксированных границ, параметр — для всего остального.

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

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

"ВЫБРАТЬ

| Продажи.Период

|ИЗ

| РегистрНакопления.Продажи КАК Продажи

|ГДЕ

| Продажи.Период МЕЖДУ &Начало И &Конец";

Запрос.УстановитьПараметр("Начало", НачалоМесяца(ТекущаяДатаСеанса()));

Запрос.УстановитьПараметр("Конец", КонецМесяца(ТекущаяДатаСеанса()));

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

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

К дате можно прибавлять и вычитать целые числа — единица измерения одна секунда. Чтобы сдвинуть дату на день, прибавляют 86400, но безопаснее использовать специальные функции, которые корректно обрабатывают переходы месяцев и лет.

  • НачалоДня(Д), КонецДня(Д) — границы суток; КонецДня возвращает 23:59:59.
  • НачалоМесяца(Д), КонецМесяца(Д), НачалоКвартала(Д), НачалоГода(Д) — границы периодов.
  • ДобавитьМесяц(Д, ЧислоМесяцев) — сдвиг на месяцы с учётом разной длины месяцев.
  • Год(Д), Месяц(Д), День(Д), Час(Д), Минута(Д), Секунда(Д) — извлечение частей даты.
  • Формат(Д, "ДЛФ=D") — вывод даты строкой без времени.
СледующийМесяц = ДобавитьМесяц(ДатаОтчета, 1);

ТолькоДата = НачалоДня(ДатаСоВременем); // отсекает время

Как проверить, что переменная создана правильно
  1. 1
    Присвойте значение: ДатаПроверка = Дата(2026, 5, 20)
  2. 2
    Выведите значение: Сообщить(ДатаПроверка) — должно отобразиться 20.05.2026 0:00:00
  3. 3
    Проверьте тип: Сообщить(ТипЗнч(ДатаПроверка)) — ожидается «Дата»
  4. 4
    Проверьте заполненность: ЗначениеЗаполнено(ДатаПроверка) должно вернуть Истина
  5. 5
    Если дата из пользовательского ввода — убедитесь, что время не мешает сравнению, при необходимости примените НачалоДня()

Сравнение дат и типичные ошибки

Даты сравниваются обычными операторами =, <>, >, <. Главный подводный камень — скрытое время: две «одинаковые» календарные даты с разным временем не равны друг другу.

Типичные ошибки при работе с типом Дата
01
Сравнение даты документа с Дата(2026,5,20) без НачалоДня() — условие не срабатывает, потому что у документа есть время
02
Использование ТекущаяДата() на сервере в распределённой базе — расхождение дат по часовым поясам
03
Прибавление дней умножением на 86400 вместо ДобавитьМесяц для месячных сдвигов — ошибка на границах месяцев
04
Передача строки «20.05.2026» параметром запроса вместо значения типа Дата — запрос не находит данные или падает с ошибкой типов
05
Проверка пустой даты сравнением с Неопределено — пустая дата это Дата(1,1,1), а не Неопределено

Ещё одна ошибка — попытка сравнить дату с пустой ссылкой или строкой. Перед сравнением убедитесь, что оба операнда имеют тип Дата, например через ТипЗнч() в отладчике.

Итог

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

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

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

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

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

Чем отличается Дата("20260315") от Дата(2026, 3, 15)?

Результат одинаковый — 15.03.2026 00:00:00. Строковый вариант требует строгого формата ГГГГММДД и удобен при разборе данных из файлов; числовой читается легче и защищает от ошибок порядка дня и месяца.

Как проверить, что переменная имеет тип Дата?

Используйте ТипЗнч(Переменная) = Тип("Дата"). Для проверки заполненности — ЗначениеЗаполнено(Переменная): она вернёт Ложь для пустой даты Дата(1,1,1).

Почему запрос с параметром-датой не возвращает данные?

Чаще всего причина в несовпадении времени: документ записан в 14:30, а параметр содержит 00:00:00, и условие «Период = &Дата» не выполняется. Используйте диапазон МЕЖДУ НачалоДня(&Дата) И КонецДня(&Дата) или функцию запроса НАЧАЛОПЕРИОДА.

Можно ли объявить константу с датой?

Нет, встроенный язык 1С не поддерживает константы. Приём, близкий к константе, — функция, возвращающая фиксированное значение, например Функция ДатаНачалаУчета() Возврат Дата(2020,1,1); КонецФункции.

Как прибавить к дате один рабочий день с учётом календаря?

Встроенная арифметика дат не знает о праздниках и выходных. Нужно использовать регистр сведений с производственным календарём (в типовых конфигурациях он есть) и в цикле сдвигать дату, проверяя вид дня по календарю.