Разработка и Конфигурация · 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Присвойте значение: ДатаПроверка = Дата(2026, 5, 20)
- 2Выведите значение: Сообщить(ДатаПроверка) — должно отобразиться 20.05.2026 0:00:00
- 3Проверьте тип: Сообщить(ТипЗнч(ДатаПроверка)) — ожидается «Дата»
- 4Проверьте заполненность: ЗначениеЗаполнено(ДатаПроверка) должно вернуть Истина
- 5Если дата из пользовательского ввода — убедитесь, что время не мешает сравнению, при необходимости примените НачалоДня()
Сравнение дат и типичные ошибки
Даты сравниваются обычными операторами =, <>, >, <. Главный подводный камень — скрытое время: две «одинаковые» календарные даты с разным временем не равны друг другу.
Ещё одна ошибка — попытка сравнить дату с пустой ссылкой или строкой. Перед сравнением убедитесь, что оба операнда имеют тип Дата, например через ТипЗнч() в отладчике.
Что важно запомнить
Переменная типа Дата создаётся функцией Дата(), ТекущаяДатаСеанса() или разбором строки. Тип всегда содержит время — отсекайте его через НачалоДня() при сравнениях. Пустая дата — Дата(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); КонецФункции.
Как прибавить к дате один рабочий день с учётом календаря?
Встроенная арифметика дат не знает о праздниках и выходных. Нужно использовать регистр сведений с производственным календарём (в типовых конфигурациях он есть) и в цикле сдвигать дату, проверяя вид дня по календарю.