Разработка и Конфигурация · 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.
Получение даты документа, элемента справочника и реквизитов
В прикладном коде дату чаще всего не создают, а читают из объектов базы. У документа дата — стандартный реквизит, доступный напрямую через точку:
ДатаДок = ДокументОбъект.Дата; // у объекта
ДатаДок = ДокументСсылка.Дата; // у ссылки (обращение к базе)
При обращении к реквизитам через ссылку платформа выполняет скрытый запрос к базе данных. В циклах по тысячам ссылок это заметно замедляет работу — правильнее получать даты одним запросом:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка КАК Ссылка,
| РеализацияТоваровУслуг.Дата КАК Дата
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Дата МЕЖДУ &Начало И &Конец";
Если нужна только дата без времени (например, для группировки по дням), применяйте функцию НачалоПериода(ДатаДокумента, День) — она сбрасывает время к 0:00:00.
Получение даты в запросах
Язык запросов 1С имеет собственные средства работы с датами, и они не совпадают с функциями встроенного языка. Текущую дату в запросе получить напрямую нельзя — её передают параметром, заранее вычислив в коде:
Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса());
Для создания конкретной даты прямо в тексте запроса используется литерал ДАТАВРЕМЯ с аргументами год, месяц, день и опционально время:
"ВЫБРАТЬ
| Заказы.Ссылка
|ИЗ
| Документ.ЗаказКлиента КАК Заказы
|ГДЕ
| Заказы.Дата >= ДАТАВРЕМЯ(2026, 1, 1)"
Дополнительно в запросах доступны функции ГОД(), МЕСЯЦ(), ДЕНЬ(), НАЧАЛОПЕРИОДА(), КОНЕЦПЕРИОДА() и ДОБАВИТЬКДАТЕ(). Они позволяют, например, сгруппировать данные по месяцам или вычислить дату окончания срока действия договора, не выгружая данные в код.
Сравнение вариантов
Текущее время с учётом сеанса. Стандарт для прикладного кода, работает на клиенте и сервере
Время компьютера, где выполняется код. Подходит для технологических задач, рискованна при разных часовых поясах
Создание конкретной даты в коде. Не принимает строки с разделителями
Литерал даты внутри текста запроса. Только для запросов, в коде недоступен
Работа с датой на форме и в полях ввода
Когда пользователь вводит дату в поле формы, платформа сама заботится о преобразовании: реквизит формы типа «Дата» уже хранит готовое значение, и никакого ручного разбора строки не требуется. Достаточно объявить реквизит с нужным типом и связать его с элементом формы.
Если нужно подставить текущую дату в поле по умолчанию — например, при создании нового документа — это делают в обработчике ПриСозданииНаСервере или в событии ОбработкаЗаполнения объекта:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
Если Не ЗначениеЗаполнено(Дата) Тогда
Дата = ТекущаяДатаСеанса();
КонецЕсли;
КонецПроцедуры
У документов дата подставляется автоматически при создании, поэтому переопределять её вручную нужно только при нестандартной логике — например, когда документ должен создаваться вчерашним днём или на начало месяца.
- 1Определите источник: текущее время, конкретная дата, строка или реквизит объекта
- 2Для текущего времени вызовите ТекущаяДатаСеанса(), для конкретной даты — Дата(год, месяц, день)
- 3Для строки используйте ОписаниеТипов и проверьте результат на пустую дату '00010101'
- 4Проверьте результат через Сообщить() или отладчик: убедитесь, что время соответствует ожиданиям
- 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) прямо в тексте запроса. Текущую дату литералом получить нельзя — её вычисляют в коде через ТекущаяДатаСеанса() и передают в запрос параметром.