Разработка и Конфигурация · 9 мин
Как написать дату в коде 1С
Как задать дату в коде 1С: литерал даты, функции Дата(), ТекущаяДата(), Формат(), работа с составными частями и типичные ошибки при сравнении дат.
В языке 1С дата — это отдельный примитивный тип данных, у которого есть собственный синтаксис записи. Разработчик может задать дату литералом прямо в коде, получить её функциями встроенного языка, вычислить из составных частей или преобразовать из строки. Каждый способ имеет свои ограничения, и выбор неправильного — частая причина ошибок «Неверный литерал даты» и неверных сравнений.
Дата в 1С всегда содержит и время: тип «Дата» хранит значение с точностью до секунды. Если время не задано, оно равно 00:00:00 — началу дня. Это важно учитывать при сравнениях: дата 15.03.2026 00:00:00 не равна 15.03.2026 14:30:00, хотя календарный день один и тот же.
Литерал даты: как задать дату прямо в коде
Литерал даты записывается в одинарных кавычках (апострофах) и содержит цифры без разделителей в порядке: год (4 знака), месяц (2 знака), день (2 знака), затем опционально часы, минуты и секунды. Пример: ДатаОтчета = '20260315'; — это 15 марта 2026 года, время 00:00:00.
Для указания времени добавляют ещё 6 цифр: НачалоСмены = '20260315083000'; — 15 марта 2026 года, 08:30:00. Разделители внутри литерала недопустимы: запись '2026-03-15' или '15.03.2026' вызовет синтаксическую ошибку при проверке модуля.
Литералы удобны для констант в коде: дат переходных периодов, границ применения алгоритмов, контрольных значений в тестах. Для значений, которые должен менять пользователь, литералы не подходят — такие даты хранят в реквизитах объектов, константах или настройках.
ДатаНачала = '20260101'; // 1 января 2026, 00:00:00
ДатаВремя = '20260101143000'; // 1 января 2026, 14:30:00
ПустаяДата = '00010101'; // пустая дата (1 января года 1)Функции для получения и сборки даты
Функция ТекущаяДата() возвращает дату и время компьютера, на котором выполняется код. В клиент-серверном режиме при вызове на сервере это время сервера, при вызове на клиенте — время пользовательского компьютера, поэтому результаты могут отличаться. В новых разработках рекомендуется ТекущаяДатаСеанса() — она приводит время к часовому поясу сеанса и даёт согласованные значения.
Функция Дата(Год, Месяц, День) собирает дату из числовых частей: Дата(2026, 3, 15). Существует вариант с временем: Дата(2026, 3, 15, 14, 30, 0). Удобно, когда части даты получены вычислением — например, год из реквизита, а месяц и день фиксированы.
Для извлечения частей даты используются функции Год(), Месяц(), День(), Час(), Минута(), Секунда(), а также НачалоДня(), КонецДня(), НачалоМесяца(), КонецМесяца() и аналогичные для квартала, недели и года. Эти функции — стандартный способ получить границы периода для запроса.
- 1Получите год, месяц и день как числа — из реквизитов или вычислением.
- 2Вызовите Дата(Год, Месяц, День) — при необходимости добавьте часы, минуты, секунды.
- 3Проверьте результат через Формат(Результат, "ДЛФ=D") — должна вывестись ожидаемая дата.
Преобразование строки в дату и обратно
Строка вида «15.03.2026» не является датой — это текст. Для преобразования строки в дату в типовых конфигурациях используют функции общих модулей (например, СтроковыеФункцииКлиентСервер.СтрокаВДату() в составе БСП), которые контролируют корректность ввода. Прямое присваивание строки реквизиту типа «Дата» сработает только если строка строго соответствует ожидаемому формату, и такой подход ненадёжен.
Обратное преобразование выполняется функцией Формат() с строкой формата: Формат(ТекущаяДата(), "ДЛФ=D") вернёт дату в виде «15.03.2026», а "ДЛФ=DD" — длинный формат с названием месяца. Для вывода в произвольном виде используют конструкцию ДФ='дд.ММ.гггг' внутри строки формата.
При передаче дат во внешние системы (веб-сервисы, JSON, XML) применяют канонический формат ISO: Формат(Дата, "ДФ=гггг-ММ-дд") для даты и ДФ='гггг-ММ-ддTЧЧ:мм:сс' для даты со временем. Формат с точками «дд.ММ.гггг» внешние системы обычно не понимают.
Сравнение дат и работа с пустой датой
Даты сравниваются обычными операторами <, >, =, но из-за временной составляющей сравнение на равенство часто обманывает. Если нужно проверить, что два значения относятся к одному календарному дню, сравнивайте НачалоДня(Дата1) = НачалоДня(Дата2).
Пустая дата — это значение '00010101' (1 января года 1). Проверка выполняется сравнением: Если ДатаДокумента = '00010101' Тогда ... или через Не ЗначениеЗаполнено(ДатаДокумента). Функция ЗначениеЗаполнено() предпочтительнее в универсальном коде, так как корректно обрабатывает и другие типы.
Типовая задача — проверка попадания даты в период. Правильный шаблон: Дата >= НачалоДня(НачалоПериода) И Дата <= КонецДня(КонецПериода). Использование КонецДня() (23:59:59) гарантирует, что документы за последний день периода не выпадут из выборки.
Арифметика дат: прибавление и разность
К дате можно прибавлять и вычитать число — оно интерпретируется как количество секунд. Поэтому «прибавить один день» записывается как Дата + 86400 (24 × 60 × 60 секунд). Для читаемости часто пишут Дата + 24 60 60.
Для прибавления месяцев простая арифметика не подходит: месяцы имеют разную длину. Используйте функцию ДобавитьМесяц(Дата, КоличествоМесяцев) — она корректно обрабатывает переходы через год и разное число дней в месяцах. Отрицательное значение смещает дату назад.
Разность двух дат даёт число секунд между ними. Чтобы получить разницу в днях, делят на 86400: РазностьДней = (Дата2 - Дата1) / 86400;. При наличии времени результат будет дробным — при необходимости округлите или приведите обе даты к НачалоДня() перед вычитанием.
Как выбрать способ задания даты
Даты в запросах
В тексте запроса дату передают через параметр: Запрос.УстановитьПараметр("Период", ДатаОтчета); и в тексте ГДЕ Документ.Дата >= &Период. Вставлять дату в текст запроса конкатенацией строк нельзя — это приводит к ошибкам формата и риску некорректной подстановки.
Если дату всё же нужно указать литералом в тексте запроса, используется синтаксис ДАТАВРЕМЯ(2026, 3, 15, 0, 0, 0) — аргументы: год, месяц, день, час, минута, секунда. Этот вариант уместен в отчётах на СКД при отладке, но в рабочем коде параметры предпочтительнее.
В запросах доступны функции НАЧАЛОПЕРИОДА(Дата, ДЕНЬ), КОНЕЦПЕРИОДА(Дата, МЕСЯЦ) и ДОБАВИТЬКДАТЕ(Дата, ДЕНЬ, 1) — они позволяют выполнять обработку дат на стороне СУБД без выгрузки данных в код.
Как проверить результат
Модуль проходит синтаксическую проверку, дата читается как ожидаемая
Ошибка «Неверный литерал даты» при проверке модуля
Условие срабатывает для всех документов нужного дня
Документы с ненулевым временем выпадают из условия
Строка в привычном формате дд.ММ.гггг
Значение вида «15.03.2026 0:00:00» или пустая строка
Частые вопросы
Как задать пустую дату в коде 1С?
Пустая дата — это литерал '00010101' (1 января года 1). Проверить значение на пустоту можно сравнением с этим литералом или универсальной функцией ЗначениеЗаполнено(), которая вернёт Ложь для пустой даты.
Почему две даты одного дня не равны при сравнении?
Тип «Дата» хранит время с точностью до секунды. Значения 15.03.2026 00:00:00 и 15.03.2026 09:15:00 различны. Для сравнения по календарному дню приведите оба значения функцией НачалоДня() перед сравнением.
Чем ТекущаяДата() отличается от ТекущаяДатаСеанса()?
ТекущаяДата() возвращает время компьютера, где выполняется код, и на клиенте и сервере значения могут различаться. ТекущаяДатаСеанса() вычисляет время с учётом часового пояса сеанса и даёт единообразный результат — именно её рекомендуется использовать в новых разработках.
Как прибавить к дате один месяц?
Используйте функцию ДобавитьМесяц(Дата, 1). Простое прибавление секунд не подходит, так как месяцы имеют разную длину. Функция корректно обрабатывает переход через год и разное количество дней в месяцах.
Как записать дату в тексте запроса без параметра?
Используйте литерал ДАТАВРЕМЯ(2026, 3, 15, 0, 0, 0) с аргументами год, месяц, день, час, минута, секунда. Однако в рабочем коде предпочтительнее передавать дату через параметр запроса — это надёжнее и исключает ошибки форматирования.
Как вывести дату в формате «гггг-ММ-дд» для обмена?
Примените функцию Формат(Дата, "ДФ=гггг-ММ-дд"). Для даты со временем используйте "ДФ='гггг-ММ-ддTЧЧ:мм:сс'". Результат — строка, подходящая для JSON, XML и веб-сервисов.
Что важно запомнить
Дата в коде 1С задаётся литералом без разделителей ('20260315'), собирается функцией Дата(), а текущее значение берётся через ТекущаяДатаСеанса(). Помните о временной составляющей: сравнивайте дни через НачалоДня(), периоды замыкайте КонецДня(), а для вывода и обмена преобразуйте дату функцией Формат().