Текущая дата в 1С: рабочая дата, код и часовые пояса

· 9 мин

Содержание

Чтобы установить текущую дату в 1С, ничего переводить на компьютере не нужно. Пользователю достаточно открыть Главное меню → Сервис → Параметры и в блоке «Рабочая дата» включить флажок «Использовать текущую дату компьютера». В коде текущую дату получают функцией ТекущаяДатаСеанса(), а не ТекущаяДата().

Частая ошибка — менять системные часы Windows, чтобы «провести документ вчерашним числом». Это сбивает журнал регистрации, обмены и время на сервере. Для работы задним числом в 1С есть рабочая дата, а для программиста — параметры запроса и часовой пояс сеанса.

Рабочая дата пользователя: как поставить нужное число

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

Вернуть текущую дату

  1. Откройте главное меню (кнопка с тремя полосками в левом верхнем углу).
  2. Выберите Сервис → Параметры.
  3. В блоке «Рабочая дата» поставьте флажок «Использовать текущую дату компьютера».
  4. Нажмите «Применить» или «ОК».

Поставить другую дату

Если нужно ввести пачку документов прошлым месяцем:

  1. В том же окне снимите флажок «Использовать текущую дату компьютера».
  2. Укажите нужное число в поле даты.
  3. Сохраните настройку и создавайте документы — они получат эту дату.

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

💡 Для одного документа рабочую дату трогать не нужно. Дату и время можно исправить прямо в шапке документа перед проведением.

Сверьте часы на компьютере и сервере

Все функции 1С берут время у операционной системы. Если часы на компьютере ушли на 15 минут, 1С честно покажет неправильное время. Поэтому первым делом проверьте источник.

Что проверить

  • 🕒 Компьютер пользователя. В файловой базе именно он задаёт время.
  • 🖥️ Сервер 1С. В клиент-серверной базе серверный код берёт время сервера.
  • 🗄️ Сервер СУБД. Важен, если у вас обработки с прямыми запросами к SQL.
  • 🌍 Часовой пояс ОС. Правильное время в неправильном поясе даёт сдвиг на целые часы.

Команды для проверки

На Windows состояние синхронизации времени показывает служба w32time:

w32tm /query /status
w32tm /resync

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

На Linux-сервере 1С:

timedatectl

Команда выводит местное время, часовой пояс и признак синхронизации по NTP.

Расхождение даже в пару минут между клиентом и сервером заметно: документ, созданный «сейчас», может получить время из будущего относительно соседнего документа. Синхронизацию NTP настраивайте на всех машинах сразу.

ТекущаяДата() и ТекущаяДатаСеанса(): какую функцию выбрать

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

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

Главная проблема ТекущаяДата() — она зависит от места выполнения. На клиенте это часы пользователя, на сервере — часы сервера. Один и тот же код в разных контекстах вернёт разное время.

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

Пример

&НаСервере
Процедура ЗаполнитьСрокОплаты()

	Сегодня = НачалоДня(ТекущаяДатаСеанса());
	Объект.СрокОплаты = Сегодня + 10 * 86400; // плюс 10 дней

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

Дата в 1С хранится с точностью до секунды, поэтому прибавление числа — это прибавление секунд. 10 дней = 10 × 86 400 = 864 000 секунд. Для месяцев используйте ДобавитьМесяц(Дата, 1): она корректно обработает 31-е число.

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

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

В конфигураторе у реквизита есть свойство «Значение заполнения». Но туда можно записать только постоянное значение. «Сегодня» там не задать — дату заполняют кодом.

Вариант 1. В модуле объекта при заполнении

Обработчик ОбработкаЗаполнения срабатывает при создании нового объекта, в том числе на основании:

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

	Если НЕ ЗначениеЗаполнено(ДатаНачала) Тогда
		ДатаНачала = НачалоДня(ТекущаяДатаСеанса());
	КонецЕсли;

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

Плюс этого варианта: дата заполнится и при интерактивном создании, и при создании объекта из кода.

Вариант 2. В форме при открытии нового объекта

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

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

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

Вариант 3. Перед записью

Если дату нужно фиксировать в момент записи (например, «Дата изменения»), используйте ПередЗаписью в модуле объекта:

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

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

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

Вариант 4. При копировании документа

Когда пользователь копирует старый документ клавишей F9, вместе с остальными реквизитами копируются и даты. Новый документ «наследует» число месячной давности, и это легко пропустить. Обновите даты в обработчике ПриКопировании модуля объекта:

Процедура ПриКопировании(ОбъектКопирования)

	ДатаНачала = НачалоДня(ТекущаяДатаСеанса());
	ДатаИзменения = Дата(1, 1, 1);

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

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

Регистры сведений: поле «Период»

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

Какой вариант выбрать

ЗадачаГде писать код
Значение по умолчанию для нового объектаОбработкаЗаполнения в модуле объекта
Подсказка только в форме, без влияния на загрузкиПриСозданииНаСервере формы
Отметка времени последней записиПередЗаписью
Свежие даты в скопированном документеПриКопировании

Не ставьте дату в типовые объекты прямой правкой конфигурации. Обработчик проще добавить в расширение: типовое обновление тогда пройдёт без ручного сравнения.

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

В языке запросов 1С нет функции «текущая дата». Это частый сюрприз для тех, кто пришёл из SQL с его GETDATE(). Дату передают в запрос параметром.

Обычный запрос

Запрос = Новый Запрос;
Запрос.Текст =
	"ВЫБРАТЬ
	|	Договоры.Ссылка,
	|	Договоры.СрокДействия
	|ИЗ
	|	Справочник.ДоговорыКонтрагентов КАК Договоры
	|ГДЕ
	|	Договоры.СрокДействия < &ТекущаяДата
	|	И Договоры.СрокДействия <> ДАТАВРЕМЯ(1, 1, 1)";

Запрос.УстановитьПараметр("ТекущаяДата", НачалоДня(ТекущаяДатаСеанса()));
Результат = Запрос.Выполнить().Выгрузить();

Второе условие отсекает договоры с незаполненным сроком: пустая дата — это 1 января 0001 года, и она всегда «меньше» сегодняшней.

Внутри запроса с датой можно работать функциями НАЧАЛОПЕРИОДА, КОНЕЦПЕРИОДА, ДОБАВИТЬКДАТЕ и РАЗНОСТЬДАТ. Например, «последние 30 дней»:

ГДЕ Документ.Дата МЕЖДУ ДОБАВИТЬКДАТЕ(&ТекущаяДата, ДЕНЬ, -30) И &ТекущаяДата

Система компоновки данных

В СКД параметр можно не заполнять из кода. Есть два способа:

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

💡 Второй способ удобнее для сохранённых вариантов отчётов. Отчёт, сохранённый в мае с вариантом «Начало этого месяца», в октябре покажет октябрь, а не май.

Клиент, сервер и часовые пояса

Здесь чаще всего возникают сдвиги на несколько часов. Сотрудник из Новосибирска работает в базе на сервере в Москве — и видит документы «на 4 часа назад».

Как устроено

  • 🌐 Часовой пояс информационной базы задаёт администратор. В нём живут все даты базы.
  • 👤 Часовой пояс сеанса определяет, что вернёт ТекущаяДатаСеанса(). Обычно он совпадает с поясом базы.
  • 🖥️ Пояс операционной системы влияет только на ТекущаяДата().

В типовых конфигурациях на БСП часовой пояс базы задают в разделе Администрирование → Общие настройки. В коде для этого есть методы УстановитьЧасовойПоясИнформационнойБазы() и УстановитьЧасовойПоясСеанса(), а прочитать текущий пояс сеанса можно функцией ЧасовойПоясСеанса().

Если филиалы в разных поясах

Есть два рабочих подхода:

ПодходПлюсыМинусы
Единый пояс базы (например, московский)Все даты сопоставимы, отчёты не «плывут»Филиалы видят время головного офиса
Пояс сеанса по месту пользователяКаждый видит местное времяДокументы разных филиалов за «один день» могут перекрываться

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

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

Ошибки с датой и как их устранить

Диагностика: выберите симптом

Про перевод часов Windows

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

  • журнал регистрации получает записи с перепутанным временем, расследовать инциденты потом сложно;
  • обмены с банком, ЭДО и сайтом могут отклонить сообщения с неверной меткой времени;
  • в клиент-серверной базе это вообще не сработает: серверный код берёт время сервера, а не вашего компьютера.

Рабочая дата и ручная правка даты в шапке документа решают ту же задачу без этих побочных эффектов.

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

Можно ли запретить пользователю менять рабочую дату?
Средствами платформы — нет, это личная настройка. Ограничивают не рабочую дату, а последствия: дату запрета изменения данных и права на изменение даты в документах.
Почему в обработке ТекущаяДата() показывает правильное время, а в документе — другое?
Скорее всего, обработка выполняет код на клиенте, а документ заполняется на сервере. Часы этих компьютеров различаются. Перейдите на ТекущаяДатаСеанса() — результат станет одинаковым.
Как получить дату без времени?
Используйте НачалоДня(ТекущаяДатаСеанса()). Для проверки «сегодня ли это» сравнивайте НачалоДня обеих дат, а не сами даты.
Как вывести текущую дату в печатной форме?
Передайте её параметром макета из кода: Формат(ТекущаяДатаСеанса(), “ДЛФ=D”) даст дату в виде 07.10.2026, а “ДЛФ=DD” — с названием месяца прописью.
Влияет ли рабочая дата на регламентные задания?
Нет. Регламентные задания выполняются на сервере по своему расписанию и берут время сервера, а рабочая дата — настройка конкретного пользователя.