Работа с временными метками является фундаментом для любого учета в платформе 1С:Предприятие. Будь то формирование платежного поручения, расчет зарплаты за отработанный период или просто установка фильтра в отчете — знание того, как корректно извлечь текущий момент времени, критически важно. Ошибки в обработке дат часто приводят к тому, что документы попадают не в тот период, а отчеты показывают неверные остатки.
В этой статье мы детально разберем механизмы получения текущей даты в различных контекстах: от простейших запросов в консоли до сложных алгоритмов в управляемых формах. Вы узнаете не только о базовой функции, но и о том, как правильно «обрезать» время, чтобы получить именно начало суток, и как избежать типичных ловушек при сравнении значений.
Базовая функция ТекущаяДата в коде
Самый простой и распространенный способ узнать, какое сегодня число — использовать встроенную функцию языка запросов или встроенного языка платформы. В коде это выглядит как вызов метода ТекущаяДата(). Эта функция возвращает значение типа Дата, которое включает в себя не только день, месяц и год, но и точное время с секундами и миллисекундами.
Однако новички часто совершают ошибку, полагая, что эта функция возвращает только дату. На самом деле, если вы присвоите результат этой функции переменной и выведете её в отладчик, то увидите что-то вроде 25.10.2023 14:35:12. Это важно учитывать при сравнении дат, так как прямое сравнение «дата с временем» и «дата без времени» может дать неожиданный результат.
Для получения именно сегодняшней даты без учета времени часто используют комбинацию с функцией НачалоДня(). Это позволяет отсечь часовую часть и работать с чистыми сутками, что особенно актуально для бухгалтерских регистров, где учет ведется по дням.
⚠️ Внимание: Функция
ТекущаяДата()возвращает время сервера 1С, а не время вашего локального компьютера. Если сервер находится в другом часовом поясе, полученное значение может отличаться от того, что вы видите на своих часах.
Для отладки логики работы со временем используйте панель «Отладка» и следите за типом возвращаемого значения, чтобы убедиться, что оно действительно является Датой, а не Строкой.
Получение даты в запросах и СКД
Когда речь заходит о выборке данных из базы, синтаксис немного меняется. В языке запросов 1С для получения текущего момента используется ключевое слово &Сейчас или функция ТЕКУЩАЯДАТА() внутри текста запроса. Это позволяет динамически фильтровать документы, созданные сегодня, или рассчитывать возрастающие итоги на текущий момент.
В системах компоновки данных (СКД), которые лежат в основе большинства современных отчетов, параметры даты часто устанавливаются автоматически. Вы можете настроить поле отбора так, чтобы оно по умолчанию принимало значение НачалоДня(ТекущаяДата()). Это избавляет пользователя от необходимости каждый раз вручную выбирать период в форме отчета.
Рассмотрим пример структуры запроса, где мы выбираем все документы, проведенные сегодня. Здесь важно правильно использовать операторы сравнения, чтобы захватить весь диапазон от 00:00:00 до 23:59:59.
ВЫБРАТЬ
Документ.РеализацияТоваровУслуг.Ссылка КАК Ссылка,
Документ.РеализацияТоваровУслуг.Дата КАК ДатаДокумента
ИЗ
Документ.РеализацияТоваровУслуг
ГДЕ
Документ.РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоДня И &КонецДня
В параметрах такого запроса необходимо передать значения, полученные программно. Обычно это делается через объект Структура или Массив значений параметров. Использование диапазона МЕЖДУ является более производительным решением по сравнению с множественными условиями «больше или равно» и «меньше или равно».
Работа с датой в управляемых формах
В интерфейсе так называемой «управляемой формы» (Тонкий клиент) работа с датами имеет свои особенности, связанные с асинхронностью и контекстом выполнения. Часто требуется установить значение поля ввода даты равным сегодняшнему числу при открытии формы или по нажатию кнопки.
Для этого в обработчиках событий, таких как ПриСозданииНаСервере или ОбработкаОповещения, используется стандартный вызов. Однако важно помнить о контексте: на клиенте время может отличаться от серверного, поэтому критически важные для учета даты лучше получать на сервере и передавать клиенту.
Если вам нужно отобразить дату в конкретном формате, например, только день и месяц, это делается через свойства элемента формы или с помощью функции Формат(). Это позволяет гибко настраивать отображение информации для пользователя без изменения хранимых данных.
| Метод получения | Контекст выполнения | Точность | Применение |
|---|---|---|---|
ТекущаяДата() |
Сервер / Клиент | До секунд | Логирование, штампы времени |
НачалоДня() |
Сервер / Клиент | До суток (00:00) | Группировки, периоды отчетов |
&Сейчас |
Язык запросов | До секунд | Отборы в запросах |
Сеанс.ТекущаяДата |
Сервер | До секунд | Системные настройки |
Всегда стремитесь выполнять расчеты, зависящие от текущей даты, на стороне сервера, чтобы исключить расхождения из-за разных часовых поясов пользователей.
Форматирование и вывод даты пользователю
Часто «сырая» дата в формате DD.MM.YYYY HH:MM:SS не подходит для вывода в печатные формы или сообщения пользователю. В таких случаях на помощь приходит мощная функция Формат(). Она позволяет превратить значение даты в строку нужного вида, используя специальные строки формата.
Например, чтобы получить дату в виде «25 октября 2023 г.», необходимо использовать спецификатор ДФ='dd MMMM yyyy \'г\.'. Это особенно полезно при генерации сопроводительных писем или заголовков отчетов, где требуется «человеческое» написание даты.
Также стоит упомянуть о локализации. Платформа 1С автоматически подстраивает названия месяцев и дней недели под язык интерфейса пользователя. Если у вас стоит английский интерфейс, то функция форматирования выдаст «October», а если русский — «октября». Это избавляет разработчика от необходимости писать собственные словари.
⚠️ Внимание: При сохранении даты в строковые поля базы данных (что не рекомендуется) теряется возможность сортировки и математических операций. Всегда храните даты в полях типа Дата.
Секреты строки формата
Используйте символ «;» для разделения частей формата. Например, «ДФ='dd.MM.yy'; БФ=''» позволит задать формат и пустой формат для нуля.
Типичные ошибки и разница во времени
Одной из самых коварных проблем при работе с датами является рассинхронизация времени между клиентским местом и сервером 1С. Пользователь может создать документ в 23:55 по своему времени, но если сервер живет по UTC или другому поясу, документ может «улететь» на завтра или остаться вчера.
Это критично для закрытия периодов. Бухгалтер может видеть, что сегодня 31-е число, и проводить документы, а система сочтет их относящимися к следующему месяцу. Решением является использование времени сервера как эталонного для всех критических операций учета.
Еще одна ошибка — сравнение дат с разным уровнем детализации. Сравнение Дата1 = Дата2 вернет Ложь, если у одной даты время 10:00:00, а у другой 10:00:01. Для проверки «одного ли они дня» нужно использовать функцию НачалоДня() для обоих сравниваемых значений.
☑️ Проверка корректности даты
Продвинутые техники: сдвиги и интервалы
Платформа 1С предоставляет удобный инструментарий для манипуляций с датами. Вам не нужно вручную складывать дни или месяцы. Функции ДобавитьКДате() и РазностьДат() позволяют легко вычислять сроки оплаты, даты завершения проектов или возраст сотрудников.
Например, чтобы найти дату «вчера», достаточно вычесть один день из текущей даты. А чтобы найти последний день месяца, можно использовать хитрый прием: взять первый день следующего месяца и вычесть один день. Это универсальный алгоритм, работающий для любого месяца, включая високосные годы.
При расчете периодов часто требуется получить интервал. Например, «текущая неделя» или «предыдущий квартал». Для этого существуют функции НачалоНедели(), КонецКвартала() и другие. Они значительно упрощают код и делают его более читаемым по сравнению с ручными вычислениями.
⚠️ Внимание: Интерфейсы и названия функций могут незначительно отличаться в разных конфигурациях (Бухгалтерия, УТ, ЗУП). Всегда сверяйтесь с синтаксис-помощником вашей конкретной версии платформы.
Используйте константу «КонецВечности» с осторожностью. В новых версиях платформы лучше использовать максимально возможную дату, поддерживаемую типом данных, чтобы избежать ошибок переполнения.
FAQ: Частые вопросы по датам в 1С
Как получить только год или месяц из текущей даты?
Для этого используйте функции Год(), Месяц() или День(). Например, Год(ТекущаяДата()) вернет число 2023. Эти функции извлекают соответствующую часть из полного значения даты.
Почему при сравнении дат результат неверный?
Скорее всего, вы сравниваете даты с разным временем. Одна дата может быть «25.10.2023 00:00:00», а другая «25.10.2023 15:30:00». Приведите обе даты к началу дня с помощью НачалоДня() перед сравнением.
Можно ли изменить системную дату в 1С программно?
Нет, изменять системное время сервера или клиента из кода 1С в целях учета запрещено и технически ограничено. Вы можете только хранить свои «виртуальные» даты в реквизитах документов, если это требует бизнес-логика.
Как узнать количество дней между двумя датами?
Используйте функцию РазностьДат(Дата1, Дата2, "День"). Она вернет целое число, показывающее разницу. Обратите внимание на порядок аргументов, чтобы получить положительное или отрицательное значение.
Что делать, если дата попадает на выходной день?
В типовых конфигурациях есть производственные календари. Используйте функцию ПроизводственныйКалендарь.СмещениеРабочейДаты(), чтобы сдвинуть дату на ближайший рабочий день вперед или назад.