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

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

Как получить дату в 1С: все способы с примерами кода

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

Работа с датами — одна из самых частых задач при программировании в 1С: нужно подставить текущее время в документ, сравнить периоды, вычислить срок оплаты или сформировать отчёт за месяц. Встроенный язык 1С предлагает несколько способов получить дату, и у каждого есть свои особенности, которые важно учитывать, чтобы не получить ошибку или неверные данные в отчётах.

Основная путаница у начинающих разработчиков возникает между функциями ТекущаяДата() и ТекущаяДатаСеанса(), а также при попытке преобразовать строку вида «31.12.2026» в тип «Дата». Ниже разобраны все рабочие способы получения даты: от простого вызова функции до работы с датами в запросах и на форме.

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

Самый простой способ получить текущую дату — вызвать функцию без параметров. Возвращается значение типа «Дата» с точностью до секунды:

ТекДата = ТекущаяДатаСеанса();

Сообщить(ТекДата); // например: 15.03.2026 14:32:07

Функция ТекущаяДата() возвращает дату компьютера, на котором выполняется код. Если код выполняется на клиенте, это время пользовательской машины; если на сервере — время сервера. При разнице часовых поясов или неверно настроенных часах у пользователя результаты будут отличаться, что критично для учётных систем.

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

Создание произвольной даты конструктором Дата()

Когда нужна не текущая, а конкретная дата — например, начало отчётного периода или дата договора — используется глобальный конструктор. Он принимает числовые аргументы: год, месяц, день и опционально часы, минуты, секунды:

НачалоГода = Дата(2026, 1, 1);            // 01.01.2026 0:00:00

КонецДня = Дата(2026, 1, 31, 23, 59, 59); // 31.01.2026 23:59:59

Тот же конструктор умеет создавать дату из строки в специальном формате «ГГГГММДДччммсс». Это удобно, когда дата приходит из внешней системы в машинном виде:

ДатаИзСтроки = Дата("20260131235959"); // 31.01.2026 23:59:59

ДатаБезВремени = Дата("20260131"); // 31.01.2026 0:00:00

Обратите внимание: строка «31.01.2026» таким способом не преобразуется — конструктор ожидает именно внутренний формат без разделителей, начиная с года. Передача строки в другом формате приведёт к ошибке выполнения, поэтому пользовательский ввод нужно обрабатывать иначе (об этом ниже).

Получение даты из строки, введённой пользователем

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

Через объект ОписаниеТипов

Универсальный способ — создать описание типа «Дата» и использовать его метод приведения значения. Платформа попытается распознать строку с учётом региональных настроек:

ОписаниеДаты = Новый ОписаниеТипов("Дата");

Результат = ОписаниеДаты.ПривестиЗначение("31.01.2026");

Если Результат = '00010101' Тогда

Сообщить("Не удалось распознать дату");

КонецЕсли;

Неудачное преобразование не вызывает исключение, а возвращает пустую дату '00010101' — это удобно для проверки корректности ввода без обработки ошибок.

Через форматирование и проверку

Для строгого контроля формата строку разбирают вручную: выделяют подстроки функциями Лев(), Сред(), преобразуют в числа и передают в конструктор Дата(), обернув всё в Попытка...Исключение. Это дольше, но даёт полный контроль над форматом, например когда дата приходит в виде «2026-01-31» из JSON.

Типичные ошибки
01
Вызов Дата("31.01.2026") — конструктор не понимает строку с разделителями и падает с ошибкой; строку нужно передавать в формате ГГГГММДД
02
Сравнение даты со строкой: условие ДатаДокумента = "31.01.2026" всегда ложно, потому что сравниваются разные типы
03
Игнорирование времени: дата 31.01.2026 15:00 больше, чем 31.01.2026 0:00:00, из-за чего условие «по дату включительно» отсекает документы за этот день

Получение даты документа, элемента справочника и реквизитов

В прикладном коде дату чаще всего не создают, а читают из объектов базы. У документа дата — стандартный реквизит, доступный напрямую через точку:

ДатаДок = ДокументОбъект.Дата;          // у объекта

ДатаДок = ДокументСсылка.Дата; // у ссылки (обращение к базе)

При обращении к реквизитам через ссылку платформа выполняет скрытый запрос к базе данных. В циклах по тысячам ссылок это заметно замедляет работу — правильнее получать даты одним запросом:

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

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

"ВЫБРАТЬ

| РеализацияТоваровУслуг.Ссылка КАК Ссылка,

| РеализацияТоваровУслуг.Дата КАК Дата

|ИЗ

| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

|ГДЕ

| РеализацияТоваровУслуг.Дата МЕЖДУ &Начало И &Конец";

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

Получение даты в запросах

Язык запросов 1С имеет собственные средства работы с датами, и они не совпадают с функциями встроенного языка. Текущую дату в запросе получить напрямую нельзя — её передают параметром, заранее вычислив в коде:

Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса());

Для создания конкретной даты прямо в тексте запроса используется литерал ДАТАВРЕМЯ с аргументами год, месяц, день и опционально время:

"ВЫБРАТЬ

| Заказы.Ссылка

|ИЗ

| Документ.ЗаказКлиента КАК Заказы

|ГДЕ

| Заказы.Дата >= ДАТАВРЕМЯ(2026, 1, 1)"

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

Сравнение вариантов

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

Текущее время с учётом сеанса. Стандарт для прикладного кода, работает на клиенте и сервере

ТекущаяДата()

Время компьютера, где выполняется код. Подходит для технологических задач, рискованна при разных часовых поясах

Дата(год, месяц, день)

Создание конкретной даты в коде. Не принимает строки с разделителями

ДАТАВРЕМЯ в запросе

Литерал даты внутри текста запроса. Только для запросов, в коде недоступен

Работа с датой на форме и в полях ввода

Когда пользователь вводит дату в поле формы, платформа сама заботится о преобразовании: реквизит формы типа «Дата» уже хранит готовое значение, и никакого ручного разбора строки не требуется. Достаточно объявить реквизит с нужным типом и связать его с элементом формы.

Если нужно подставить текущую дату в поле по умолчанию — например, при создании нового документа — это делают в обработчике ПриСозданииНаСервере или в событии ОбработкаЗаполнения объекта:

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)

Если Не ЗначениеЗаполнено(Дата) Тогда

Дата = ТекущаяДатаСеанса();

КонецЕсли;

КонецПроцедуры

У документов дата подставляется автоматически при создании, поэтому переопределять её вручную нужно только при нестандартной логике — например, когда документ должен создаваться вчерашним днём или на начало месяца.

Порядок действий: получить и проверить дату
  1. 1
    Определите источник: текущее время, конкретная дата, строка или реквизит объекта
  2. 2
    Для текущего времени вызовите ТекущаяДатаСеанса(), для конкретной даты — Дата(год, месяц, день)
  3. 3
    Для строки используйте ОписаниеТипов и проверьте результат на пустую дату '00010101'
  4. 4
    Проверьте результат через Сообщить() или отладчик: убедитесь, что время соответствует ожиданиям
  5. 5
    При сравнении дат без учёта времени приведите обе к началу дня функцией НачалоДня()

Частые операции с полученной датой

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

  • НачалоДня(Дата), КонецДня(Дата) — границы суток, нужны для отбора «за день»;
  • НачалоМесяца(Дата), КонецМесяца(Дата) — границы месяца для периодов отчётов;
  • ДобавитьМесяц(Дата, Количество) — сдвиг на месяцы с корректной обработкой конца месяца;
  • Дата + 86400 — сдвиг на сутки (дата в 1С хранится с точностью до секунды, сутки = 86400 секунд);
  • Формат(Дата, "ДЛФ=D") — представление даты строкой для вывода пользователю.

При сравнении дат помните о составляющей времени. Условие Документ.Дата <= КонецПериода, где конец периода задан как Дата(2026, 1, 31), отсекает все документы после полуночи 31 января. Правильный вариант — использовать КонецДня() или строгое неравенство с началом следующего дня.

Как проверить результат и где искать ошибки

Быстрая проверка полученной даты — вывод через Сообщить() или просмотр в отладчике. Пустая дата всегда отображается как 01.01.0001 0:00:00 и легко узнаваема; для проверки в коде используйте функцию ЗначениеЗаполнено() или сравнение с '00010101'.

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

Контрольные точки

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

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

Дата и время соответствуют ожиданиям, тип — Дата

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

Значение 01.01.0001 0:00:00 — преобразование не сработало

Сравнение дат в условии
Норма

Обе части сравнения имеют тип Дата

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

Одна из частей — строка, условие всегда ложно

Время в полученной дате
Норма

Время совпадает с серверным при использовании ТекущаяДатаСеанса()

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

Сдвиг на часы — использована ТекущаяДата() на клиенте в другом поясе

Итог

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

Для текущей даты используйте ТекущаяДатаСеанса(), для произвольной — конструктор Дата() с числами или строкой в формате ГГГГММДД. Строки от пользователей преобразуйте через ОписаниеТипов с проверкой на пустую дату, а в запросах применяйте литерал ДАТАВРЕМЯ и параметры. При сравнениях всегда учитывайте составляющую времени.

Часто задаваемые вопросы

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

Примените функцию НачалоДня() к имеющемуся значению: НачалоДня(ТекущаяДатаСеанса()) вернёт сегодняшнюю дату с временем 0:00:00. Полностью «время» из типа «Дата» не убирается — он всегда содержит и дату, и время, но нулевое время при выводе через Формат(Дата, "ДЛФ=D") не отображается.

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

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

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

Создайте Новый ОписаниеТипов("Дата") и вызовите метод ПривестиЗначение("31.12.2026"). Если строка не распознана, результатом будет пустая дата 01.01.0001 — проверяйте это значение перед использованием. Для строгих форматов из внешних систем строку разбирают функциями работы со строками и собирают через Дата(год, месяц, день).

Почему условие по дате в запросе не находит документы за последний день?

Потому что дата документа содержит время, а граница периода задана как начало дня. Документ от 31 января 14:00 больше, чем дата 31.01.2026 0:00:00. Передавайте в параметр КонецДня(Дата) или используйте условие «меньше начала следующего дня».

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

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

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

Конкретную дату можно задать литералом ДАТАВРЕМЯ(2026, 1, 31) прямо в тексте запроса. Текущую дату литералом получить нельзя — её вычисляют в коде через ТекущаяДатаСеанса() и передают в запрос параметром.