Текущая дата в 1С: рабочая дата, код и часовые пояса
Содержание
Чтобы установить текущую дату в 1С, ничего переводить на компьютере не нужно. Пользователю достаточно открыть Главное меню → Сервис → Параметры и в блоке «Рабочая дата» включить флажок «Использовать текущую дату компьютера». В коде текущую дату получают функцией ТекущаяДатаСеанса(), а не ТекущаяДата().
Частая ошибка — менять системные часы Windows, чтобы «провести документ вчерашним числом». Это сбивает журнал регистрации, обмены и время на сервере. Для работы задним числом в 1С есть рабочая дата, а для программиста — параметры запроса и часовой пояс сеанса.
Рабочая дата пользователя: как поставить нужное число
Рабочая дата — это число, которое программа подставляет в новые документы и использует как дату по умолчанию в отчётах. По умолчанию она равна дате компьютера.
Вернуть текущую дату
- Откройте главное меню (кнопка с тремя полосками в левом верхнем углу).
- Выберите
Сервис → Параметры. - В блоке «Рабочая дата» поставьте флажок «Использовать текущую дату компьютера».
- Нажмите «Применить» или «ОК».
Поставить другую дату
Если нужно ввести пачку документов прошлым месяцем:
- В том же окне снимите флажок «Использовать текущую дату компьютера».
- Укажите нужное число в поле даты.
- Сохраните настройку и создавайте документы — они получат эту дату.
Рабочая дата сохраняется в настройках пользователя. Если её не вернуть, через неделю новые документы будут по-прежнему создаваться «старым» числом. После работы задним числом снова включите текущую дату компьютера.
💡 Для одного документа рабочую дату трогать не нужно. Дату и время можно исправить прямо в шапке документа перед проведением.
Сверьте часы на компьютере и сервере
Все функции 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) И &ТекущаяДата
Система компоновки данных
В СКД параметр можно не заполнять из кода. Есть два способа:
- Во вкладке «Параметры» схемы задайте у параметра выражение, например
НачалоПериода(ТекущаяДата(), "День"). - Для периода отчёта используйте тип «Стандартная дата начала» — пользователь выберет «Начало этого дня» или «Начало этого месяца», и значение пересчитается при каждом формировании.
💡 Второй способ удобнее для сохранённых вариантов отчётов. Отчёт, сохранённый в мае с вариантом «Начало этого месяца», в октябре покажет октябрь, а не май.
Клиент, сервер и часовые пояса
Здесь чаще всего возникают сдвиги на несколько часов. Сотрудник из Новосибирска работает в базе на сервере в Москве — и видит документы «на 4 часа назад».
Как устроено
- 🌐 Часовой пояс информационной базы задаёт администратор. В нём живут все даты базы.
- 👤 Часовой пояс сеанса определяет, что вернёт
ТекущаяДатаСеанса(). Обычно он совпадает с поясом базы. - 🖥️ Пояс операционной системы влияет только на
ТекущаяДата().
В типовых конфигурациях на БСП часовой пояс базы задают в разделе Администрирование → Общие настройки. В коде для этого есть методы УстановитьЧасовойПоясИнформационнойБазы() и УстановитьЧасовойПоясСеанса(), а прочитать текущий пояс сеанса можно функцией ЧасовойПоясСеанса().
Если филиалы в разных поясах
Есть два рабочих подхода:
| Подход | Плюсы | Минусы |
|---|---|---|
| Единый пояс базы (например, московский) | Все даты сопоставимы, отчёты не «плывут» | Филиалы видят время головного офиса |
| Пояс сеанса по месту пользователя | Каждый видит местное время | Документы разных филиалов за «один день» могут перекрываться |
Для учёта чаще выбирают первый подход: бухгалтерский день один для всей базы. Для событий, где важен точный момент (обмены, логи, интеграции), храните ТекущаяУниверсальнаяДата() — UTC не зависит ни от каких настроек.
Смену часового пояса базы делайте в нерабочее время и после проверки на копии. Меняется смысл «текущего момента» для всех пользователей, а регламентные задания, привязанные к расписанию, могут сработать в другой час.
Ошибки с датой и как их устранить
Про перевод часов Windows
Иногда документ задним числом пытаются создать, переведя системную дату. Последствия:
- журнал регистрации получает записи с перепутанным временем, расследовать инциденты потом сложно;
- обмены с банком, ЭДО и сайтом могут отклонить сообщения с неверной меткой времени;
- в клиент-серверной базе это вообще не сработает: серверный код берёт время сервера, а не вашего компьютера.
Рабочая дата и ручная правка даты в шапке документа решают ту же задачу без этих побочных эффектов.