Сегодняшнее число в 1С 8.3: какую функцию вызвать и как показать его пользователю
Содержание
Чтобы вывести текущую дату в 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.0001 | 01.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С, нужен код. Пользователю чаще нужно быстро вставить сегодняшнее число в поле или проверить, какая дата у программы.
- 🗓️ Календарь в поле даты. Кнопка справа от поля открывает календарь, где сегодняшнее число выделено. Двойной щелчок по нему подставит дату.
- 📅 Новый документ. Типовые конфигурации заполняют дату нового документа текущей датой сеанса. Если подставляется чужая дата — проверьте рабочую дату в
Главное меню → Сервис → Параметры. - 🧮 Календарь платформы. В главном меню, в группе сервисных команд, есть калькулятор и календарь. Они работают без привязки к конкретному полю.
Типичные ошибки при работе с текущей датой
Вызов ТекущаяДата() на клиенте для записи в базу
Дата документа, заполненная на клиенте через ТекущаяДата(), зависит от часов конкретного компьютера. У двух кассиров с рассинхронизированными часами чеки встанут в неправильном порядке. Заполняйте дату на сервере или через ТекущаяДатаСеанса().
Сравнение даты со временем через равенство
Если Объект.Дата = ТекущаяДатаСеанса() Тогда почти никогда не сработает: секунды не совпадут. Сравнивайте НачалоДня() обеих дат или используйте диапазон.
Склеивание даты со строкой без формата
"Отчёт от " + ТекущаяДатаСеанса() выведет дату с секундами в формате по умолчанию. В печатной форме и имени файла это выглядит как ошибка. Всегда оборачивайте дату в Формат().
Проверка пустой даты числом
Пустая дата в 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, воскресенье — 7.