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

Часто пользователи и разработчики сталкиваются с необходимостью жестко зафиксировать конкретный момент времени, игнорируя текущее системное время или значения по умолчанию. Это требуется при переносе данных из legacy-систем, проведении регламентных операций задним числом или тестировании алгоритмов. Неправильное указание временной метки может привести к тому, что документ «потеряется» в периоде или попадет не в тот интервал закрытия месяца.

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

Синтаксические конструкции для задания даты в коде

В языке запросов и встроенном языке платформы существует несколько способов явного объявления даты. Самый распространенный и читаемый вариант — использование конструктора даты. Синтаксис требует указания года, месяца, дня и, опционально, времени в круглых скобках. Например, запись Дата(2026, 01, 15) создаст объект, соответствующий 15 января 2026 года с временем 00:00:00.

Если требуется указать конкретное время суток, необходимо добавить часы, минуты и секунды. Конструкция Дата(2026, 12, 31, 23, 59, 59) укажет на последнюю секунду уходящего года. Использование строк в этих позициях вызовет ошибку синтаксиса на этапе компиляции модуля.

Альтернативный способ — использование строкового представления с функцией преобразования. Хотя это менее производительно, иногда это необходимо при динамическом формировании запросов. Функция Дата() может принимать строку в формате «ГГГГ-ММ-ДД ЧЧ:ММ:СС». Однако такой подход чувствителен к региональным настройкам операционной системы, где выполняется код.

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

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

💡

Используйте конструктор даты Дата(Г, М, Д) вместо преобразования из строки — это работает быстрее и не зависит от настроек локали операционной системы.

Методы глобального контекста для работы с периодами

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

Функция НачалоПериода(Период, Период) возвращает дату начала указанного интервала. В качестве аргумента Период можно использовать предопределенные значения, такие как Период.День, Период.Месяц или Период.Год. Например, вызов НачалоПериода(ТекущаяДата(), Период.Месяц) вернет первое число текущего месяца.

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

  • 📅 НачалоДня(Дата) — устанавливает время в 00:00:00.
  • 🌙 КонецДня(Дата) — устанавливает время в 23:59:59.
  • 🗓️ НачалоМесяца(Дата) — возвращает 1-е число месяца.
  • 🏁 КонецМесяца(Дата) — возвращает последний день месяца.

Существуют также методы для работы с кварталами и полугодиями, что упрощает регламентную отчетность. Использование этих функций делает код более читаемым и защищенным от ошибок, связанных с ручным расчетом дней. Вы можете быть уверены, что КонецГода всегда вернет 31 декабря, независимо от того, в каком году выполняется код.

📊 Какой метод вы используете чаще всего?
НачалоДня
КонецМесяца
ТекущаяДата
Дата(конструктор)

Особенности хранения даты в базе данных SQL

Внутри платформы 1С тип Дата является универсальным, но при сохранении в СУБД он преобразуется в специфичный для базы данных тип. В MS SQL Server это обычно datetime или datetime2, а в PostgreSQLtimestamp. Понимание этого различия важно при написании прямых SQL-запросов или оптимизации производительности.

Точность хранения времени в 1С составляет до секунды. Миллисекунды, которые могут присутствовать в некоторых СУБД, при записи из 1С обычно отсекаются или округляются. Это означает, что две даты, отличающиеся на миллисекунду, в системе 1С будут считаться равными. Это свойство используется при сравнении дат в условиях отборов.

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

Платформа 1С Тип в MS SQL Тип в PostgreSQL Точность
8.3 и выше datetime2 timestamp До секунды
8.2 (устар.) datetime timestamp До секунды
7.7 (файл) N/A N/A До секунды

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

Почему даты в SQL могут отличаться от 1С?

Если сервер 1С и сервер БД находятся в разных часовых поясах, при прямом чтении таблиц через SQL-менеджер вы увидите время UTC. 1С автоматически конвертирует его при получении данных.

Форматирование даты для вывода пользователю

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

Самый простой формат — ДФ="dd.MM.yyyy". Он выведет дату как 15.01.2026. Если нужно добавить время, используют ДФ="dd.MM.yyyy HH:mm:ss". Буквенные обозначения регистрозависимы: MM обозначает месяц, а mm — минуты. Ошибка в регистре приведет к тому, что вместо месяца отобразятся минуты.

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

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

⚠️ Внимание: Не используйте жестко заданные строковые форматы в коде для сравнения дат. Сравнивайте объекты типа Дата напрямую, а форматируйте их только в момент вывода на экран или в печатную форму.

Проблемы совместимости и версии платформы

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

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

Особое внимание следует уделить миграции данных. При выгрузке и загрузке данных в формате XML или DataProcessor форматы дат должны строго соответствовать стандарту ISO 8601, чтобы избежать ошибок парсинга. Несоответствие формата может привести к сдвигу дат на один день.

☑️ Проверка работы с датами

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

Практические примеры использования в запросах

В языке запросов 1С явное указание даты часто необходимо в параметрах отборов. Синтаксис предполагает использование символа & для параметров, значение которых передается из кода. Однако можно использовать и константы прямо в тексте запроса, если дата фиксирована.

Рассмотрим пример выборки документов за конкретный период. В тексте запроса мы можем явно прописать границы: ГДЕ Документ.Дата МЕЖДУ Дата(2026, 01, 01) И Дата(2026, 01, 31, 23, 59, 59). Такой подход гарантирует, что будут выбраны все документы, созданные в январе, включая самые поздние.

Частая ошибка новичков — указание конца периода как Дата(2026, 02, 01). Это исключит документы, созданные 31 января после 00:00:00, если они вдруг попали в базу с будущим временем (что маловероятно, но возможно при сбоях). Правильнее использовать КонецДня или явно указывать 23:59:59.

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

💡

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

Можно ли указать дату в формате «15.01.2026» прямо в коде?

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

Что произойдет, если указать несуществующую дату, например 30 февраля?

Платформа 1С выбросит исключение «Неверное значение даты» на этапе выполнения кода или при компиляции, если конструктор даты используется с константными неверными значениями. Валидация даты происходит автоматически.

Как получить дату в формате UNIX timestamp в 1С?

В 1С нет встроенной функции для прямого получения UNIX-времени, но его можно вычислить, найдя разницу в секундах между нужной датой и датой 01.01.1970. Для этого используют функцию РазницаДат с параметром ЕдиницаВремени.Секунда.

Влияет ли летнее время на хранение дат в 1С?

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