Разработка и Конфигурация · 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Определите формат входной строки: ДД.ММ.ГГГГ, ГГГГ-ММ-ДД или ISO 8601
- 2Проверьте длину строки и наличие разделителей до разбора
- 3Извлеките числовые части через Сред() или СтрРазделить()
- 4Соберите дату функцией Дата(Год, Месяц, День)
- 5Проверьте результат: дата не должна быть пустой ('00010101')
- 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 января результатом будет последний день февраля.
Как проверить результат
Дата соответствует ожидаемой, время задано явно или равно 00:00:00
Пустая дата '00010101' или неожиданное время
В выборку попадают все записи за последний день периода
Записи последнего дня с ненулевым временем отсутствуют
Формат соответствует региональным настройкам, ведущие нули на месте
Вид '5.3.2026' или английский формат даты
Что важно запомнить
Константную дату задавайте литералом 'ГГГГММДД', вычисляемую — функцией Дата(), текущую — ТекущаяДатаСеанса(). В запросах передавайте даты параметрами, конец периода берите через КонецДня(), месяцы добавляйте функцией ДобавитьМесяц(), а для вывода используйте Формат().
Частые вопросы
Как задать пустую дату в коде 1С?
Пустая дата — это литерал '00010101'. Присвойте его переменной или реквизиту, чтобы «очистить» дату. Проверить пустоту можно сравнением с этим литералом или функцией ЗначениеЗаполнено(), которая вернёт Ложь для пустой даты.
Чем отличается ТекущаяДата() от ТекущаяДатаСеанса()?
ТекущаяДата() возвращает время того компьютера, на котором выполняется код: на сервере — серверное, на клиенте — клиентское. ТекущаяДатаСеанса() учитывает часовой пояс сеанса пользователя и корректна для серверного кода в распределённых системах. В типовых конфигурациях рекомендуется именно второй вариант.
Как получить только дату без времени?
Используйте НачалоДня(ИсходнаяДата) — функция вернёт ту же дату с временем 00:00:00. Это стандартный приём перед сравнением дат, когда время не имеет значения.
Как преобразовать строку «15.03.2026» в дату?
Встроенной функции прямого преобразования нет. Разберите строку через Сред() или СтрРазделить(), извлеките числовые части и соберите дату функцией Дата(Год, Месяц, День). Для строк в формате ISO 8601 подойдёт XMLЗначение(Тип("Дата"), Строка).
Как прибавить к дате месяц или год?
Используйте ДобавитьМесяц(Дата, КоличествоМесяцев) — для года передайте 12, 24 и т.д. Функция корректно обрабатывает концы месяцев. Прибавлять секунды вручную нельзя: длина месяцев различается, и результат сместится на несколько дней.
Почему запрос с условием по дате возвращает не все записи?
Чаще всего причина во времени: условие Период = &Дата сработает только для записей с точно таким же временем. Используйте диапазон МЕЖДУ НачалоДня(&Дата) И КонецДня(&Дата) или сравнение с границами дня.