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

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

Как указать дату в коде 1С

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

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

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

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

Литерал даты — самый быстрый способ задать дату в коде

Литерал даты записывается в одинарных кавычках в формате ГГГГММДД. Это встроенный синтаксис языка: платформа сама распознаёт такую строку как значение типа «Дата», без вызова каких-либо функций.

ДатаОтчета = '20260115'; // 15 января 2026 года, время 00:00:00

ДатаСВременем = '20260115143000'; // 15 января 2026, 14:30:00

Порядок частей в литерале фиксированный: четыре цифры года, две цифры месяца, две цифры дня. При необходимости добавляются часы, минуты и секунды — тоже по две цифры каждая. Разделители (точки, дефисы, пробелы) в литерале не допускаются.

Если время не указано, оно считается равным 00:00:00 — началу дня. Это важно при сравнениях: условие ДатаДокумента = '20260115' будет истинным только для документов, записанных ровно в полночь, а не в течение всего дня.

Функция Дата() — задание даты из переменных

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

Год = 2026;

Месяц = 3;

День = 28;

НужнаяДата = Дата(Год, Месяц, День); // 28 марта 2026

// С временем:

ДатаВремя = Дата(2026, 3, 28, 15, 45, 0); // 28.03.2026 15:45:00

Функция принимает от трёх до шести параметров: год, месяц, день и опционально часы, минуты, секунды. Все параметры — целые числа. Если передать только три параметра, время будет 00:00:00.

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

Текущая дата: ТекущаяДата() и ТекущаяДатаСеанса()

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

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

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

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

Функции НачалоДня(), КонецДня(), НачалоМесяца(), КонецМесяца(), НачалоГода(), КонецКвартала() и аналогичные позволяют быстро получить границы периода — это стандартный приём при построении отборов и отчётов.

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

Дата из строки и из реквизитов объектов

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

// Строка вида "15.03.2026"

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

День = Число(Сред(СтрокаДаты, 1, 2));

Месяц = Число(Сред(СтрокаДаты, 4, 2));

Год = Число(Сред(СтрокаДаты, 7, 4));

Результат = Дата(Год, Месяц, День);

Если дата приходит в формате ISO 8601 (например, из JSON или REST-сервиса), удобно использовать объект ЗаписьДатыJSON либо разбор через XMLЗначение с типом «dateTime» — платформа корректно преобразует такую строку в дату.

Получение даты из реквизита объекта или ссылки — самая рутинная операция: ДатаДокумента = ДокументОбъект.Дата;. У ссылки дату получают через запрос или через ОбщегоНазначения.ЗначениеРеквизитаОбъекта() в типовых конфигурациях, чтобы не выгружать весь объект.

Порядок действий при разборе строки с датой
  1. 1
    Определите формат входной строки: ДД.ММ.ГГГГ, ГГГГ-ММ-ДД или ISO 8601
  2. 2
    Проверьте длину строки и наличие разделителей до разбора
  3. 3
    Извлеките числовые части через Сред() или СтрРазделить()
  4. 4
    Соберите дату функцией Дата(Год, Месяц, День)
  5. 5
    Проверьте результат: дата не должна быть пустой ('00010101')
  6. 6
    При ошибке разбора зафиксируйте проблемную строку в журнале регистрации

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

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

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

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

"ВЫБРАТЬ

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

| СУММА(Продажи.Сумма) КАК Сумма

|ИЗ

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

|ГДЕ

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

|СГРУППИРОВАТЬ ПО

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

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

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

Обратите внимание на границы интервала: для конца периода используется КонецДня() (23:59:59), иначе записи за последний день с ненулевым временем не попадут в выборку. Альтернатива — условие Период < &СледующийДень, что иногда работает быстрее на больших таблицах.

В тексте запроса также доступны функции работы с датой: НАЧАЛОПЕРИОДА(Период, ДЕНЬ), КОНЕЦПЕРИОДА(Период, МЕСЯЦ), ДОБАВИТЬКДАТЕ(), РАЗНОСТЬДАТ() — они выполняются на стороне СУБД.

Форматирование и вывод даты пользователю

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

ТекстСообщения = "Отчёт сформирован за " + Формат(ДатаОтчета, "ДЛФ=D");

// Результат: "Отчёт сформирован за 15.01.2026"

ДлинныйФормат = Формат(ДатаОтчета, "ДЛФ=DD");

// "15 января 2026 г."

СВременем = Формат(ТекущаяДатаСеанса(), "ДЛФ=DT");

// "15.01.2026 14:30:00"

Основные шаблоны: ДЛФ=D — короткая дата, ДЛФ=DD — длинная с названием месяца, ДЛФ=DT — дата со временем, ДЛФ=T — только время. Для нестандартных представлений есть конструкция ДФ='дд.ММ.гггг' с произвольным шаблоном.

Избегайте ручной сборки строки вида "" + День(Д) + "." + Месяц(Д) — при таком подходе теряются ведущие нули, и вместо «05.03.2026» легко получить «5.3.2026», что ломает сортировку и внешний вид документов.

Сравнение и арифметика дат

Даты в 1С сравниваются обычными операторами =, <>, <, >, <=, >=. Вычитание двух дат даёт разность в секундах, к дате можно прибавлять число секунд.

РазницаВСекундах = Дата2 - Дата1;

РазницаВДнях = (Дата2 - Дата1) / 86400;

// Прибавить 7 дней:

НоваяДата = Дата1 + 7 * 86400;

// Корректнее через функцию:

НоваяДата = ДобавитьМесяц(Дата1, 1);

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

Типичные ошибки
01
Сравнение даты с литералом без учёта времени — записи за день с ненулевым временем не попадают в условие
02
Прибавление месяца через секунды (30 * 86400) — смещение результата из-за разной длины месяцев
03
Конкатенация даты в текст запроса вместо параметра — ошибки формата и риск некорректной интерпретации
04
Использование ТекущаяДата() на сервере вместо ТекущаяДатаСеанса() — неверное время при разных часовых поясах
05
Ручная сборка строки даты без ведущих нулей — нарушение формата в печатных формах и обменах
Контрольные точки

Как проверить результат

Значение даты после присваивания
Норма

Дата соответствует ожидаемой, время задано явно или равно 00:00:00

Тревожный признак

Пустая дата '00010101' или неожиданное время

Отбор по периоду в запросе
Норма

В выборку попадают все записи за последний день периода

Тревожный признак

Записи последнего дня с ненулевым временем отсутствуют

Вывод даты пользователю
Норма

Формат соответствует региональным настройкам, ведущие нули на месте

Тревожный признак

Вид '5.3.2026' или английский формат даты

Итог

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

Константную дату задавайте литералом 'ГГГГММДД', вычисляемую — функцией Дата(), текущую — ТекущаяДатаСеанса(). В запросах передавайте даты параметрами, конец периода берите через КонецДня(), месяцы добавляйте функцией ДобавитьМесяц(), а для вывода используйте Формат().

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

Как задать пустую дату в коде 1С?

Пустая дата — это литерал '00010101'. Присвойте его переменной или реквизиту, чтобы «очистить» дату. Проверить пустоту можно сравнением с этим литералом или функцией ЗначениеЗаполнено(), которая вернёт Ложь для пустой даты.

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

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

Как получить только дату без времени?

Используйте НачалоДня(ИсходнаяДата) — функция вернёт ту же дату с временем 00:00:00. Это стандартный приём перед сравнением дат, когда время не имеет значения.

Как преобразовать строку «15.03.2026» в дату?

Встроенной функции прямого преобразования нет. Разберите строку через Сред() или СтрРазделить(), извлеките числовые части и соберите дату функцией Дата(Год, Месяц, День). Для строк в формате ISO 8601 подойдёт XMLЗначение(Тип("Дата"), Строка).

Как прибавить к дате месяц или год?

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

Почему запрос с условием по дате возвращает не все записи?

Чаще всего причина во времени: условие Период = &Дата сработает только для записей с точно таким же временем. Используйте диапазон МЕЖДУ НачалоДня(&Дата) И КонецДня(&Дата) или сравнение с границами дня.