Сегодняшнее число в 1С 8.3: какую функцию вызвать и как показать его пользователю

· 9 мин

Содержание

Чтобы вывести текущую дату в 1С, в коде вызовите ТекущаяДатаСеанса() и отформатируйте результат: Сообщить(Формат(ТекущаяДатаСеанса(), "ДЛФ=D")) покажет пользователю строку вида 09.10.2026. Функция ТекущаяДата() тоже работает, но возвращает время того компьютера, где выполняется код, и в клиент-серверной базе это часто не то время, которое видит пользователь.

В запросе своей функции текущей даты нет: дату передают параметром. Для пользователя без программирования есть календарь платформы и рабочая дата в параметрах. Всё ниже — про платформу 8.3 и интерфейс «Такси», одинаково для БП 3.0, ЗУП 3.1, УТ 11 и самописных конфигураций.

Три функции текущей даты и чем они отличаются

В платформе 8.3 есть несколько способов получить «сейчас». Они возвращают разные значения, и путаница между ними даёт сдвиг на несколько часов.

ФункцияЧто возвращаетГде брать
ТекущаяДата()Дата и время компьютера, на котором выполняется кодУстаревший способ, оставлен для совместимости
ТекущаяДатаСеанса()Дата и время в часовом поясе сеансаОсновной вариант для документов и вывода
ТекущаяУниверсальнаяДата()Время по UTCЖурналы, обмены, сравнение событий из разных поясов
ТекущаяУниверсальнаяДатаВМиллисекундах()Число миллисекунд UTCЗамер длительности операций

ТекущаяДата(): время конкретной машины

Результат зависит от контекста. Код в модуле формы на клиенте вернёт часы рабочего места пользователя. Тот же вызов в общем модуле с флагом «Сервер» вернёт часы сервера 1С.

Пример из практики: сервер 1С стоит на Linux с часовым поясом UTC, бухгалтерия работает в Москве. Документ, созданный в 23:30 по Москве, сервер видит в 20:30. А документ, созданный в 01:30 ночи, «уезжает» в прошлые сутки. Для закрытия месяца это уже проблема.

ТекущаяДатаСеанса(): время с учётом пояса

Функция берёт время в UTC и переводит его в часовой пояс сеанса. Пояс сеанса по умолчанию равен поясу информационной базы. Его можно поменять кодом:

УстановитьЧасовойПоясСеанса("Asia/Yekaterinburg");
Сообщить(ТекущаяДатаСеанса());

Результат одинаков на клиенте и на сервере, поэтому типовые конфигурации заполняют дату документа именно так. В БСП для этого есть обёртки: ОбщегоНазначенияКлиент.ДатаСеанса() на клиенте и ОбщегоНазначения.ТекущаяДатаПользователя() на сервере. Если пишете доработку типовой — используйте их, они учитывают настройки библиотеки.

Пояс самой базы задаётся в конфигураторе или кодом через УстановитьЧасовойПоясИнформационнойБазы(). Текущее значение возвращает ПолучитьЧасовойПоясИнформационнойБазы().

Рабочая дата

Отдельная история — функция РабочаяДата(). Она возвращает дату из параметров пользователя: Главное меню → Сервис → Параметры, поле рабочей даты. Если в настройке стоит использование текущей даты компьютера, функция вернёт сегодняшнее число.

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

Где выполняется ваш код и что нужно получить?

Тип «Дата» и квалификаторы: дата, время или дата со временем

В 1С один примитивный тип — Дата. Он всегда хранит и дату, и время с точностью до секунды. Отдельного типа «ДатаВремя» нет. Разница задаётся квалификатором — ЧастиДаты.

КвалификаторЧто хранится и показываетсяПример
ЧастиДаты.ДатаТолько дата, время обнуляется09.10.2026 0:00:00
ЧастиДаты.ВремяТолько время, дата — 01.01.000101.01.0001 14:25:07
ЧастиДаты.ДатаВремяДата и время09.10.2026 14:25:07

Квалификатор ставится в свойствах реквизита в конфигураторе или в описании типов кодом:

ТипТолькоДата = Новый ОписаниеТипов("Дата", , , Новый КвалификаторыДаты(ЧастиДаты.Дата));

Отсюда частая ловушка. Реквизит «Дата документа» хранит время, а реквизит «Дата рождения» — нет. Сравнить их напрямую через = нельзя: 09.10.2026 14:25:07 не равно 09.10.2026 0:00:00.

Чтобы сравнить по дню, отсекайте время:

Сегодня = НачалоДня(ТекущаяДатаСеанса());
Если НачалоДня(Объект.Дата) = Сегодня Тогда
	Сообщить("Документ создан сегодня");
КонецЕсли;

Ещё полезные функции для работы с текущей датой:

  • 📅 НачалоДня(), КонецДня() — границы суток;
  • 🗓️ НачалоМесяца(), КонецМесяца(), НачалоГода() — границы периода;
  • ➕ ДобавитьМесяц(Дата, 1) — сдвиг на месяц с учётом длины месяца;
  • 🔢 Год(), Месяц(), День(), Час() — отдельные части даты числом;
  • 📆 ДеньНедели() — номер дня недели, понедельник = 1.

Разность двух дат даёт число секунд. Сколько полных дней между датами: (НачалоДня(Дата2) - НачалоДня(Дата1)) / 86400. Прибавить три дня к сегодняшнему числу: ТекущаяДатаСеанса() + 3 * 86400.

Форматирование текущей даты для вывода пользователю

Если просто склеить дату со строкой, платформа подставит представление по умолчанию с секундами. Для пользователя это выглядит неряшливо. Поэтому дату выводят через Формат().

Локальный формат: ДЛФ

Параметр ДЛФ берёт формат из региональных настроек сеанса:

Строка форматаРезультат для 09.10.2026 14:25:07
"ДЛФ=D"09.10.2026
"ДЛФ=DD"9 октября 2026 г.
"ДЛФ=T"14:25:07
"ДЛФ=DT"09.10.2026 14:25:07
"ДЛФ=DDT"9 октября 2026 г. 14:25:07

Произвольный формат: ДФ

Когда нужна своя маска, используйте ДФ. Символы можно писать латиницей или кириллицей:

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

Сообщить(Формат(Сейчас, "ДФ=dd.MM.yyyy"));          // 09.10.2026
Сообщить(Формат(Сейчас, "ДФ='dd MMMM yyyy'"));      // 09 октября 2026
Сообщить(Формат(Сейчас, "ДФ=yyyyMMdd"));            // 20261009
Сообщить(Формат(Сейчас, "ДФ='dd.MM.yyyy HH:mm'"));  // 09.10.2026 14:25
Сообщить(Формат(Сейчас, "ДФ=dddd"));                // пятница

Основные символы маски:

  • d / dd — день без ведущего нуля / с нулём;
  • ddd / dddd — краткое / полное название дня недели;
  • M / MM / MMMM — месяц числом / с нулём / названием;
  • yy / yyyy — год двумя / четырьмя цифрами;
  • H / HH — часы в 24-часовом формате, h / hh — в 12-часовом;
  • mm, ss — минуты и секунды.

Регистр важен: MM — месяц, mm — минуты. Маска dd.mm.yyyy выведет минуты вместо месяца, и ошибку часто замечают только в печатных формах.

Для пустой даты пригодится параметр ДП: Формат(Дата, "ДФ=dd.MM.yyyy; ДП='не указана'"). Без него пустая дата превратится в пустую строку.

Куда выводить

  • 💬 В окно сообщений: Сообщить("Сегодня " + Формат(ТекущаяДатаСеанса(), "ДЛФ=DD")).
  • 🪟 В заголовок формы: ЭтаФорма.Заголовок = "Остатки на " + Формат(ТекущаяДатаСеанса(), "ДЛФ=D").
  • 🖨️ В печатную форму: заполните параметр макета, например Область.Параметры.ДатаПечати = Формат(ТекущаяДатаСеанса(), "ДЛФ=DD").
  • 🔔 В диалог: ПоказатьПредупреждение(, "Сегодня " + Формат(ТекущаяДатаСеанса(), "ДЛФ=D")).

Если нужна строка для имени файла, используйте маску без точек и двоеточий: "ДФ=yyyyMMdd_HHmmss". Двоеточие в имени файла Windows не допускает.

Текущая дата в запросах 1С

В языке запросов нет функции, которая вернула бы «сейчас». Дату вычисляют в коде и передают параметром. Так запрос остаётся детерминированным, а результат легко проверить.

Отбор документов за сегодня:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	Реализация.Ссылка КАК Ссылка,
|	Реализация.Дата КАК Дата
|ИЗ
|	Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
|	Реализация.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&ТекущаяДата, ДЕНЬ)
|		И КОНЕЦПЕРИОДА(&ТекущаяДата, ДЕНЬ)";
Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса());
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	Сообщить(Формат(Выборка.Дата, "ДЛФ=DT"));
КонецЦикла;

Другие частые приёмы:

  • 📌 вывести текущую дату колонкой: ВЫБРАТЬ &ТекущаяДата КАК Сегодня, ...;
  • ⏪ документы за последние 30 дней: ГДЕ Док.Дата >= ДОБАВИТЬКДАТЕ(&ТекущаяДата, ДЕНЬ, -30);
  • 📊 остатки на сегодня с учётом всех движений дня: передайте в виртуальную таблицу КонецДня(ТекущаяДатаСеанса()) или Новый Граница(...), а не голую дату.

Литерал конкретной даты внутри текста запроса пишется как ДАТАВРЕМЯ(2026, 10, 9). Для «сегодня» так делать нельзя: число зашьётся в текст навсегда.

В отчётах на СКД текущую дату удобнее отдавать через параметр типа «Стандартная дата начала» или «Стандартный период». Пользователь выберет вариант вроде «Начало этого дня», и отчёт будет пересчитывать дату при каждом формировании.

Регистры сведений и срез последних

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

Дата в веб-клиенте, тонком клиенте и мобильном приложении

Поведение функций зависит от того, где физически выполняется код.

Режим работыТекущаяДата() на клиентеТекущаяДатаСеанса()
Тонкий клиент, файловая базаЧасы рабочего местаПояс сеанса
Тонкий клиент, сервер 1СЧасы рабочего местаПояс сеанса
Веб-клиент в браузереЧасы устройства пользователяПояс сеанса
Мобильный клиентЧасы телефонаПояс сеанса
Мобильное приложение офлайнЧасы телефонаПояс сеанса на устройстве

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

Для веб-клиента есть ещё один нюанс. Пользователь из Владивостока открывает базу, опубликованную в Москве. Браузер покажет ему время его устройства, сервер — московское. Если документы должны датироваться по местному времени филиала, задайте пояс сеанса при входе пользователя через УстановитьЧасовойПоясСеанса(), а пояс клиента узнайте функцией ЧасовойПояс() на стороне клиента.

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

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

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

  • 🗓️ Календарь в поле даты. Кнопка справа от поля открывает календарь, где сегодняшнее число выделено. Двойной щелчок по нему подставит дату.
  • 📅 Новый документ. Типовые конфигурации заполняют дату нового документа текущей датой сеанса. Если подставляется чужая дата — проверьте рабочую дату в Главное меню → Сервис → Параметры.
  • 🧮 Календарь платформы. В главном меню, в группе сервисных команд, есть калькулятор и календарь. Они работают без привязки к конкретному полю.
В документах подставляется не сегодняшнее число
Выполнено: 0 / 4

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

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

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

Сравнение даты со временем через равенство

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

Склеивание даты со строкой без формата

"Отчёт от " + ТекущаяДатаСеанса() выведет дату с секундами в формате по умолчанию. В печатной форме и имени файла это выглядит как ошибка. Всегда оборачивайте дату в Формат().

Проверка пустой даты числом

Пустая дата в 1С — 01.01.0001 0:00:00, а не ноль и не Неопределено. Проверяйте её через ЗначениеЗаполнено(Дата) или сравнением с Дата(1, 1, 1).

Сервер без настроенного часового пояса

На серверах Linux пояс часто остаётся UTC после установки. ТекущаяДата() на сервере начинает отставать от Москвы на три часа. Лечится настройкой пояса базы и переходом на ТекущаяДатаСеанса(). Менять пояс операционной системы на работающем сервере 1С стоит только в нерабочее время: потребуется перезапуск службы, и сеансы пользователей оборвутся.

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

Как получить только время без даты?
Используйте Формат(ТекущаяДатаСеанса(), "ДЛФ=T") или маску "ДФ=HH:mm". Если нужно значение типа «Дата» с обнулённой датой, вычтите начало дня: Дата(1, 1, 1) + (Сейчас - НачалоДня(Сейчас)).
Как превратить строку «09.10.2026» в дату?
Конструктор Дата() принимает строку только в формате ГГГГММДД или ГГГГММДДччммсс. Разберите строку функцией Сред() на части и соберите: Дата(Число(Сред(С, 7, 4)), Число(Сред(С, 4, 2)), Число(Сред(С, 1, 2))).
Какой диапазон дат поддерживает 1С?
Тип «Дата» хранит значения от 1 января 0001 года до 31 декабря 3999 года. Дату вне этого диапазона записать в реквизит не получится.
Можно ли получить текущую дату в миллисекундах?
Самой даты с миллисекундами в платформе нет, точность — секунда. Для замеров используйте ТекущаяУниверсальнаяДатаВМиллисекундах(): она возвращает число, разность двух вызовов — длительность в миллисекундах.
Как узнать номер текущей недели?
Функция НеделяГода(ТекущаяДатаСеанса()) вернёт номер недели в году числом. Для дня недели есть ДеньНедели(): понедельник — 1, воскресенье — 7.