Работа с временными метками является фундаментальной задачей при разработке конфигураций на платформе 1С:Предприятие. Корректная фиксация момента хозяйственной операции критически важна для построения достоверной отчетности и проведения регламентных расчетов. Ошибки в типах данных или неверное понимание механизма хранения времени могут привести к серьезным искажениям в учетных регистрах.

В этой статье мы детально разберем синтаксис создания объектов типа Дата, особенности работы с временными зонами и методы приведения типов. Вы узнаете, как избежать распространенных ловушек при сравнении временных интервалов и как правильно использовать встроенные функции платформы для манипуляций с календарем.

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

Синтаксис создания даты в коде 1С

Для явного задания даты в коде разработчика используется специальная конструкция, заключающая строковое представление времени в символы '#'. Платформа автоматически распознает такой литерал и преобразует его в объект типа Дата на этапе компиляции модуля. Это наиболее быстрый и надежный способ фиксации статических временных точек.

Формат строки внутри решеток должен строго соответствовать шаблону 'ГГГГММДДЧЧММСС', где каждая группа цифр отвечает за соответствующую компоненту времени. Отсутствие разделителей (тире, двоеточий, пробелов) является обязательным требованием синтаксического анализатора 1С. Нарушение формата приведет к ошибке компиляции с сообщением о неверном формате даты.

Если вам необходимо задать только дату без указания времени, платформа автоматически дополнит отсутствующие компоненты нулями, что соответствует началу суток (00:00:00). Однако для повышения читаемости кода и избежания двусмысленности рекомендуется всегда указывать время явно, даже если оно равно нулю.

В ситуациях, когда дата формируется динамически на основе пользовательского ввода или данных из внешних источников, использование литералов невозможно. В таких случаях применяется конструктор объекта или функция Дата(), принимающая числовые аргументы. Это позволяет гибко управлять каждой компонентой времени отдельно.

⚠️ Внимание: При использовании конструктора Новый Дата(Год, Месяц, День) помните, что нумерация месяцев начинается с единицы, а не с нуля, как это принято в некоторых других языках программирования. Передача значения 0 или 13 вызовет исключительную ситуацию.

💡

Используйте литералы даты (#20230101#) для hardcoded значений в коде — это ускоряет выполнение по сравнению с динамическим созданием объектов в циклах.

Работа с текущим системным временем

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

При выполнении кода на клиентской машине (в тонком клиенте или веб-клиенте) функция вернет время локального компьютера пользователя. Это может привести к рассинхронизации данных в многопользовательской среде, если часы на рабочих станциях настроены неверно. Для критически важных операций, таких как проведение документов, всегда используйте серверное время.

Чтобы получить время сервера 1С, необходимо вызывать метод ТекущаяДатаСервера() внутри серверного контекста выполнения. Этот подход гарантирует единую временную шкалу для всех пользователей независимо от их географического расположения и настроек локальных часов. Рекомендуется оборачивать логику проведения документов в серверные процедуры.

📊 Где вы чаще всего получаете текущую дату?
На клиенте
На сервере
Из регистра сведений
Через внешний источник

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

Манипуляции с компонентами даты

Платформа 1С предоставляет богатый набор встроенных функций для арифметических операций и извлечения отдельных частей даты. Разработчик может легко добавлять или вычитать годы, месяцы, дни, часы и минуты, используя функции семейства ДобавитьМесяц, ДобавитьДень и другие.

При добавлении месяцев система автоматически учитывает количество дней в месяце и високосные годы. Например, добавление одного месяца к дате 31 января корректно приведет к последнему дню февраля (28 или 29), а не к несуществующей дате. Это избавляет программиста от необходимости писать сложные проверки границ календаря.

Для извлечения конкретных компонентов используются функции Год(), Месяц(), День(), Час(), Минута() и Секунда(). Эти функции возвращают целочисленные значения, которые можно использовать в логических условиях или математических расчетах. Они работают одинаково эффективно как с клиентскими, так и с серверными датами.

  • 📅 Функция НачалоДня(Дата) обрезает время до 00:00:00, что удобно для группировки данных по суткам.
  • 🌙 Функция КонецДня(Дата) устанавливает время на 23:59:59, охватывая весь текущий календарный день.
  • ⏳ Функция РазностьДат(Дата1, Дата2, ТипЕдиницы) позволяет точно рассчитать интервал между двумя моментами времени в заданных единицах.

Особое внимание следует уделить функции НачалоПериода и КонецПериода, которые позволяют быстро получить границы стандартных интервалов: месяца, квартала или года. Это существенно упрощает код при формировании периодических отчетов и регламентных заданий.

Как работает високосный год в 1С?

Платформа автоматически определяет високосный год по григорианскому календарю. Год является високосным, если он делится на 4, но не делится на 100, за исключением случаев, когда он делится на 400. Встроенные функции учитывают это правило при расчете дат.

Сравнение дат и временные интервалы

Сравнение объектов типа Дата в 1С выполняется по их числовому представлению, где большая дата соответствует более позднему моменту времени. Операторы сравнения (=, <>, <, >, <=, >=) работают интуитивно понятно, однако требуют учета временной компоненты.

Частой ошибкой является попытка сравнить дату документа (например, 15.10.2023 14:30) с датой среза регистра, установленной на начало дня (15.10.2023 00:00). В таком случае условие "Больше или Равно" может сработать некорректно, если логика предполагает включение всего дня. Всегда явно приводите даты к единому уровню точности перед сравнением.

Для проверки попадания даты в интервал удобно использовать конструкцию Между в запросах или логические выражения в коде. При формировании условий отбора в запросах помните, что правая граница интервала в операторе Между включается в выборку полностью, с учетом времени 23:59:59.

⚠️ Внимание: При сравнении дат из разных временных зон (например, при интеграции с веб-сервисами) обязательно приводите их к единому стандарту UTC или локальному времени сервера 1С. Иначе возможны сдвиги на несколько часов, критичные для оперативного учета.

Если требуется проверить, наступила ли определенная дата, игнорируя время, используйте функцию НачалоДня() для обоих операндов. Это гарантирует, что сравнение будет происходить строго по календарным суткам, исключая влияние часов, минут и секунд.

Преобразование типов и форматирование

В процессе обработки данных часто возникает необходимость преобразовать строку, полученную от пользователя или из файла, в тип Дата. Для этого используется функция Дата() с одним строковым аргументом или метод ПолучитьДату() у объекта ЧтениеJSON. Система попытается распознать формат автоматически, но лучше явно указывать ожидаемый шаблон.

Обратная операция — форматирование даты в строку для вывода на печать или в интерфейс — выполняется функцией Формат(). Эта функция поддерживает широкий спектр форматов, определяемых символьными строками. Например, формат "ДФ='dd.MM.yyyy'" превратит дату в привычный вид 31.12.2023.

При работе с внешними системами, использующими стандарт ISO 8601, может потребоваться специфическое форматирование. В таких случаях удобно использовать формат "ДФ='yyyy-MM-ddTHH:mm:ss'", который обеспечивает совместимость с большинством современных API и баз данных.

Функция / Метод Назначение Возвращаемый тип
ТекущаяДата() Получение текущего времени клиента Дата
Дата(Строка) Преобразование строки в дату Дата
Формат(Дата, ФорматнаяСтрока) Преобразование даты в строку Строка
Строка(Дата) Быстрое преобразование в строку (стандартный формат) Строка
💡

Всегда используйте функцию Формат() для вывода дат пользователю, так как она учитывает региональные настройки клиента и обеспечивает единообразие отображения.

Типичные ошибки и способы их устранения

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

Другая частая ошибка связана с неявным приведением типов в условиях отбора. Если поле в базе имеет тип ДатаВремя, а вы сравниваете его с датой без времени, система может не найти нужные записи. Явно используйте функции НачалоДня или КонецДня для нормализации границ поиска.

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

☑️ Чек-лист проверки работы с датами

Выполнено: 0 / 5

Для отладки сложных случаев рекомендуется выводить внутреннее числовое представление даты (количество секунд от начала эры) с помощью функции Число(Дата). Это позволяет увидеть скрытые различия между датами, которые при обычном отображении выглядят идентично.

Как задать дату в запросе 1С?

В тексте запроса дату можно задать двумя способами. Первый — использовать параметр запроса, передав в него значение из кода. Второй — написать литерал даты прямо в тексте запроса, заключив его в кавычки и обрамив символами #, например: ВЫБРАТЬ ... ГДЕ ДатаДокумента МЕЖДУ #20230101# И #20231231#.

В чем разница между Датой и ДатойВремя?

В платформе 1С существует единый тип данных Дата, который всегда хранит и дату, и время. Понятия "ДатаВремя" как отдельного типа не существует, это лишь смысловое различие. Однако в метаданных можно ограничить точность хранения до дней, игнорируя время, но внутри объект все равно остается типом Дата.

Что делать, если дата приходит в неверном формате из Excel?

При выгрузке из Excel даты часто приходят в виде строк или чисел (серийных номеров Excel). Используйте функцию Дата() для парсинга строк или специальную формулу пересчета для чисел Excel (учитывая разницу в базовой дате отсчета 1900/1904 года).

Можно ли хранить дату до 1900 года?

Тип данных Дата в 1С поддерживает диапазон значений от 1 января 1000 года до 31 декабря 9999 года. Однако при работе с некоторыми внешними СУБД или старыми форматами файлов могут возникать ограничения. Всегда проверяйте совместимость при интеграции с системами, имеющими меньший диапазон поддерживаемых дат.