К статье
Практический материал

Разработка и Конфигурация · 10 мин

Миллисекунды в 1С: точность дат, замер времени и обходные пути

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

Запрос «в 1С миллисекунд сколько» обычно означает одно из двух: либо разработчик хочет узнать, поддерживает ли платформа 1С хранение и обработку времени с точностью до миллисекунд, либо ему нужно измерить длительность операции в миллисекундах — например, при оптимизации запроса или обмена данными. Короткий ответ: тип «Дата» в 1С хранит время с точностью до секунды, и миллисекунды в стандартном типе даты не предусмотрены. Однако измерять интервалы с точностью до миллисекунд можно — для этого в платформе есть специальные средства.

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

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

Какая точность у типа «Дата» в 1С

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

То же ограничение действует на уровне хранения: реквизиты документов и справочников с типом «Дата», поля регистров сведений, параметры запросов — везде точность обрезается до секунды. Если присвоить переменной значение, полученное из внешней системы с миллисекундами (например, из JSON в формате ISO 8601), дробная часть будет отброшена при преобразовании в тип «Дата».

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

Как измерить время выполнения кода в миллисекундах

Для замеров производительности платформа предоставляет функцию ТекущаяУниверсальнаяДатаВМиллисекундах(). Она возвращает число — количество миллисекунд, прошедших с полуночи 1 января 0001 года по универсальному времени (UTC). Само по себе это число как дата не используется, но разность двух замеров даёт длительность операции в миллисекундах.

Типовой шаблон замера выглядит так: зафиксировать значение до начала операции, выполнить код, зафиксировать значение после и вычесть. Результат удобно выводить в журнал регистрации или в сообщение при отладке.

1c
НачалоЗамера = ТекущаяУниверсальнаяДатаВМиллисекундах();
// ... измеряемый код, например выполнение запроса ...
Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоЗамера;
Сообщить("Выполнено за " + Длительность + " мс");

Важно замерять именно разность, а не пытаться интерпретировать абсолютное значение. Также учитывайте, что первый прогон кода часто медленнее из-за кэширования данных СУБД — для честной оценки производительности замер повторяют несколько раз и смотрят среднее или минимальное значение.

Чем отличаются ТекущаяДата, ТекущаяУниверсальнаяДата и замер в миллисекундах

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

ФункцияТип результатаТочностьНазначение
ТекущаяДата()ДатасекундаЛокальное время сеанса
ТекущаяУниверсальнаяДата()ДатасекундаВремя UTC для сопоставления между часовыми поясами
ТекущаяУниверсальнаяДатаВМиллисекундах()ЧисломиллисекундаЗамер длительности операций

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

Как хранить миллисекунды, если они действительно нужны

Иногда доли секунды нужны не для замеров, а как данные: метки событий с оборудования, интеграция с системами, где время задано в Unix-формате с миллисекундами, высокочастотное логирование. Поскольку тип «Дата» их не вмещает, применяют обходные подходы.

Первый вариант — хранить полную метку времени в реквизите типа «Число» достаточной разрядности (например, миллисекунды с начала эпохи Unix). Второй — хранить дату с точностью до секунды в стандартном реквизите «Дата», а миллисекунды (0–999) — в отдельном числовом реквизите. Третий — хранить строку в формате ISO 8601 вида «2026-01-15T14:30:25.123Z», если данные используются в основном для обмена.

Способы хранения долей секунды

Число (миллисекунды с эпохи)

Компактно и точно сортируется, но нечитаемо без преобразования и требует функций конвертации в обе стороны

Дата + отдельное поле миллисекунд

Совместимо со штатными отчётами по дате, но усложняет сравнение и запросы

Строка ISO 8601

Удобно для интеграций и читаемо, но сортировка и фильтрация работают только как по строке

Выбор зависит от сценария: для интеграций обычно удобнее строка или число эпохи, для внутреннего учёта с отчётностью — связка «дата плюс миллисекунды». Заранее продумайте, как будет выполняться сортировка и поиск по такому полю, потому что штатные механизмы запросов работают с типом «Дата» и об ограничении до секунд «не знают».

Замер производительности запросов и процедур: практический порядок

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

Порядок замера длительности
  1. 1
    Выделите измеряемый фрагмент кода — одну процедуру, запрос или обмен
  2. 2
    Поставьте ТекущаяУниверсальнаяДатаВМиллисекундах() до и после фрагмента
  3. 3
    Выведите разность в сообщение или журнал регистрации с понятной меткой
  4. 4
    Повторите прогон 3–5 раз на типовых данных и сравните значения
  5. 5
    После изменений кода повторите замер в тех же условиях и сопоставьте

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

Типичные ошибки при работе с миллисекундами в 1С

Наиболее частая ошибка — попытка получить миллисекунды через форматирование даты: разработчик пишет шаблон с «fff» или подобным суффиксом и ожидает дробную часть. Форматные строки 1С такого разряда не поддерживают, и в лучшем случае символы выведутся как литерал, в худшем — результат будет неверно истолкован.

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

Типичные ошибки
01
Замер быстрых операций через ТекущаяДата() — результат всегда 0 секунд, выводы о производительности неверны
02
Ожидание миллисекунд от Формат() — дробная часть не хранится в типе «Дата» и не выводится
03
Сравнение замеров, снятых на клиенте и на сервере, — разные часы дают бессмысленную разность
04
Использование даты как уникального ключа событий при частоте выше одного события в секунду — коллизии и потеря порядка
05
Хранение миллисекунд эпохи Unix в поле «Дата» — число не преобразуется автоматически, значение теряется

Как проверить, что решение работает правильно

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

Контрольные точки

Как проверить результат

Замер известной задержки
Норма

Измеренная длительность близка к фактической с допуском в десятки миллисекунд

Тревожный признак

Замер показывает 0 или значение на порядки отличается от ожидаемого

Сохранение метки с миллисекундами
Норма

После записи и чтения дробная часть совпадает с исходной

Тревожный признак

Миллисекунды обнулились или значение искажено

Сортировка событий
Норма

События в пределах одной секунды упорядочены по миллисекундам

Тревожный признак

Порядок событий внутри секунды случайный

FAQ

Сколько миллисекунд в одной секунде и как перевести?

В одной секунде ровно 1000 миллисекунд. Чтобы перевести миллисекунды в секунды, разделите на 1000; чтобы получить минуты — на 60 000. В 1С такие пересчёты выполняются обычной арифметикой над числом, возвращаемым функцией замера.

Можно ли вывести миллисекунды через Формат() в 1С?

Нет. Тип «Дата» хранит время только до секунды, поэтому ни Формат(), ни форматные строки даты не содержат разряда для миллисекунд. Если нужно отобразить доли секунды, храните их отдельно и выводите как число или строку.

Чем замерить длительность запроса в 1С?

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

Почему два замера подряд показывают разную длительность одной операции?

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

Как хранить время с оборудования, где есть миллисекунды?

Используйте числовой реквизит для миллисекунд с начала эпохи или пару полей: стандартная «Дата» плюс число 0–999 для дробной части. Первый вариант проще для сортировки, второй удобнее для штатных отчётов по датам.

Есть ли в 1С тип данных с точностью выше секунды?

Нет, штатного типа даты-времени с долями секунды в платформе нет. Точность до миллисекунд доступна только как числовое значение функции ТекущаяУниверсальнаяДатаВМиллисекундах(), предназначенной для замеров интервалов.

Итог

Что важно запомнить

Тип «Дата» в 1С ограничен секундой, и миллисекунды в нём не хранятся. Для измерения длительности используйте разность значений ТекущаяУниверсальнаяДатаВМиллисекундах(), для хранения долей секунды — числовое поле или строку. Замеры выполняйте в одном контексте и повторяйте несколько раз, прежде чем делать выводы о производительности.