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

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

Как присвоить текущую дату в 1С

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

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

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

Ниже разобраны все рабочие способы: присвоение даты в коде модуля, в форме, при создании документа, а также типичные ошибки, из-за которых дата «съезжает» или не сохраняется.

Какие функции возвращают текущую дату в 1С

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

ТекущаяДата() — устаревший вариант, возвращает дату и время компьютера, на котором выполняется код. В тонком и веб-клиенте это будет время компьютера пользователя, что небезопасно: пользователь может перевести часы и создать документ «задним» или «будущим» числом.

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

ТекущаяУниверсальнаяДата() — возвращает время UTC без привязки к часовому поясу. Применяется при обмене данными между базами в разных регионах, в веб-сервисах и при сравнении меток времени.

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

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

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

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

Стандарт для документов, регистров и любых учётных данных. Работает везде, даёт единое время для всех сеансов.

ТекущаяУниверсальнаяДата()

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

Как присвоить текущую дату реквизиту документа или справочника

Типовой сценарий — записать дату создания объекта при его заполнении. Для этого используется обработчик ОбработкаЗаполнения в модуле объекта. Он срабатывает один раз при создании нового элемента.

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

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

Ответственный = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;

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

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

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

Если Не ЗначениеЗаполнено(ДатаУтверждения) Тогда

ДатаУтверждения = ТекущаяДатаСеанса();

КонецЕсли;

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

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

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

Как присвоить текущую дату в форме и по кнопке

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

&НаКлиенте

Процедура УстановитьТекущуюДату(Команда)

Объект.ДатаОплаты = ТекущаяДатаСеанса();

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

Если нужна только дата без времени (без часов, минут и секунд), обрежьте значение до начала дня функцией НачалоДня():

Объект.ДатаНачала = НачалоДня(ТекущаяДатаСеанса());

Это важно при сравнениях: значение 15.03.2026 14:32:07 не равно 15.03.2026 0:00:00, и условие «дата равна сегодняшнему дню» не сработает без приведения.

Как присвоить текущую дату пользователю без программирования

Если вы не разработчик, а пользователь, текущую дату в поле ввода можно вставить штатными средствами. В поле даты нажмите клавишу F4 или кнопку выбора — откроется календарь, где кнопка «Сегодня» подставляет текущую дату. Во многих полях работает и ввод слова «сегодня» или точки.

В новом документе дата обычно уже заполнена текущей. Чтобы быстро сдвинуть дату на день вперёд или назад, используйте клавиши Ctrl + + и Ctrl + - при фокусе в поле даты.

Периодические отчёты и обработки часто имеют кнопку «Установить период» — там тоже есть вариант «Сегодня», который подставляет текущую дату сеанса в обе границы периода.

Типичные ошибки при работе с текущей датой

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

Вторая ошибка — присвоение даты без проверки заполненности. Если в ПередЗаписью безусловно писать ДатаСогласования = ТекущаяДатаСеанса(), то при каждом перепроведении старого документа дата согласования будет обновляться, искажая историю.

Третья ошибка — сравнение дат без приведения к началу дня. Условие Если Объект.Дата = ТекущаяДатаСеанса() Тогда почти никогда не выполнится, потому что секунды различаются. Сравнивайте НачалоДня(Объект.Дата) = НачалоДня(ТекущаяДатаСеанса()).

Типичные ошибки
01
Использование ТекущаяДата() в клиент-серверной базе — у пользователей расходится время, возможны документы с подменённой датой
02
Безусловное присвоение даты в ПередЗаписью — историческая дата перезаписывается при каждом сохранении
03
Сравнение дат без НачалоДня() — условие не срабатывает из-за разницы в секундах
04
Присвоение даты только в форме — при создании объекта программно или при обмене дата останется пустой

Как проверить, что дата присваивается правильно

После внедрения кода выполните три контрольные проверки. Создайте новый объект и убедитесь, что дата заполнена и соответствует текущему времени сервера, а не рабочей станции. Затем перезапишите тот же объект — дата не должна измениться, если она уже была заполнена.

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

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

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

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

Дата в новом документе
Норма

Совпадает со временем сервера 1С

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

Показывает время локального компьютера пользователя

Перезапись документа
Норма

Ранее установленная дата сохраняется

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

Дата обновляется при каждой записи

Создание объекта программно
Норма

Дата заполняется и без открытия формы

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

Дата пустая — код только в модуле формы

Ответы на частые вопросы

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

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

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

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

Почему дата документа не меняется при копировании?

При копировании платформа переносит дату исходного документа, а затем обработчик ОбработкаЗаполнения может установить текущую. Если этого не происходит, проверьте, не переопределён ли обработчик в модуле объекта и не блокирует ли он стандартное заполнение.

Можно ли запретить пользователю менять дату документа?

Да. Настройте дату запрета изменения данных (раздел «Администрирование» — «Поддержка и обслуживание») или ограничьте доступ к реквизиту через роли. Программно можно заблокировать поле в форме через свойство «ТолькоПросмотр».

Какая функция нужна для обмена между базами в разных часовых поясах?

Используйте ТекущаяУниверсальнаяДата() — она возвращает время UTC, не зависящее от пояса. На принимающей стороне универсальную дату можно преобразовать в локальную функцией МестноеВремя() с указанием нужного часового пояса.

Итог

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

Для присвоения текущей даты в 1С применяйте ТекущаяДатаСеанса() — это единый и безопасный источник времени для всех пользователей. Код размещайте в модуле объекта, а не только в форме, добавляйте проверку заполненности, а при сравнении дат приводите значения через НачалоДня().