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

Разработка и Конфигурация · 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' вызовет синтаксическую ошибку при проверке модуля.

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

bsl
ДатаНачала = '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. 1
    Получите год, месяц и день как числа — из реквизитов или вычислением.
  2. 2
    Вызовите Дата(Год, Месяц, День) — при необходимости добавьте часы, минуты, секунды.
  3. 3
    Проверьте результат через Формат(Результат, "ДЛФ=D") — должна вывестись ожидаемая дата.

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

Строка вида «15.03.2026» не является датой — это текст. Для преобразования строки в дату в типовых конфигурациях используют функции общих модулей (например, СтроковыеФункцииКлиентСервер.СтрокаВДату() в составе БСП), которые контролируют корректность ввода. Прямое присваивание строки реквизиту типа «Дата» сработает только если строка строго соответствует ожидаемому формату, и такой подход ненадёжен.

Обратное преобразование выполняется функцией Формат() с строкой формата: Формат(ТекущаяДата(), "ДЛФ=D") вернёт дату в виде «15.03.2026», а "ДЛФ=DD" — длинный формат с названием месяца. Для вывода в произвольном виде используют конструкцию ДФ='дд.ММ.гггг' внутри строки формата.

При передаче дат во внешние системы (веб-сервисы, JSON, XML) применяют канонический формат ISO: Формат(Дата, "ДФ=гггг-ММ-дд") для даты и ДФ='гггг-ММ-ддTЧЧ:мм:сс' для даты со временем. Формат с точками «дд.ММ.гггг» внешние системы обычно не понимают.

Сравнение дат и работа с пустой датой

Даты сравниваются обычными операторами <, >, =, но из-за временной составляющей сравнение на равенство часто обманывает. Если нужно проверить, что два значения относятся к одному календарному дню, сравнивайте НачалоДня(Дата1) = НачалоДня(Дата2).

Пустая дата — это значение '00010101' (1 января года 1). Проверка выполняется сравнением: Если ДатаДокумента = '00010101' Тогда ... или через Не ЗначениеЗаполнено(ДатаДокумента). Функция ЗначениеЗаполнено() предпочтительнее в универсальном коде, так как корректно обрабатывает и другие типы.

Типовая задача — проверка попадания даты в период. Правильный шаблон: Дата >= НачалоДня(НачалоПериода) И Дата <= КонецДня(КонецПериода). Использование КонецДня() (23:59:59) гарантирует, что документы за последний день периода не выпадут из выборки.

Типичные ошибки
01
Запись даты с разделителями '15.03.2026' в литерале — синтаксическая ошибка модуля.
02
Сравнение дат на равенство без отсечения времени — условие не срабатывает, хотя день совпадает.
03
Использование <= ДатаОкончания без КонецДня() — документы последнего дня теряются.
04
Сравнение дат, преобразованных в строки функцией Формат(), — неверный порядок сортировки.
05
Вызов ТекущаяДата() на клиенте в клиент-серверном режиме — время пользователя расходится с серверным.

Арифметика дат: прибавление и разность

К дате можно прибавлять и вычитать число — оно интерпретируется как количество секунд. Поэтому «прибавить один день» записывается как Дата + 86400 (24 × 60 × 60 секунд). Для читаемости часто пишут Дата + 24 60 60.

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

Разность двух дат даёт число секунд между ними. Чтобы получить разницу в днях, делят на 86400: РазностьДней = (Дата2 - Дата1) / 86400;. При наличии времени результат будет дробным — при необходимости округлите или приведите обе даты к НачалоДня() перед вычитанием.

Маршрут решения

Как выбрать способ задания даты

Нужна фиксированная дата-константа в алгоритмеИспользуйте литерал '20260315' прямо в коде
Нужна текущая дата и времяВызовите ТекущаяДатаСеанса() — она согласована с часовым поясом сеанса
Части даты приходят из разных источниковСоберите значение функцией Дата(Год, Месяц, День)
Дату вводит пользователь строкойПреобразуйте через функции строковых функций БСП с проверкой корректности
Дату нужно показать пользователю или выгрузитьПреобразуйте в строку функцией Формат() с нужной строкой формата

Даты в запросах

В тексте запроса дату передают через параметр: Запрос.УстановитьПараметр("Период", ДатаОтчета); и в тексте ГДЕ Документ.Дата >= &Период. Вставлять дату в текст запроса конкатенацией строк нельзя — это приводит к ошибкам формата и риску некорректной подстановки.

Если дату всё же нужно указать литералом в тексте запроса, используется синтаксис ДАТАВРЕМЯ(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'), собирается функцией Дата(), а текущее значение берётся через ТекущаяДатаСеанса(). Помните о временной составляющей: сравнивайте дни через НачалоДня(), периоды замыкайте КонецДня(), а для вывода и обмена преобразуйте дату функцией Формат().