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

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

Как хранится дата в 1С

Как хранится дата в 1С: внутренний формат, тип Дата, дата и время, пустая дата, работа с датами в запросах, коде и при обмене данными.

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

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

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

Внутреннее представление даты в платформе 1С

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

Точность хранения — до секунды. Диапазон допустимых значений начинается с 01.01.0001 00:00:00 и заканчивается 31.12.3999 23:59:59. Значения за пределами этого диапазона платформа не принимает: попытка записать такую дату вызовет ошибку.

При работе с клиент-серверной базой данных важно понимать: платформа сама преобразует дату в формат СУБД (MS SQL Server, PostgreSQL, Oracle, IBM DB2). Разработчику не нужно заботиться, как именно значение лежит в таблице SQL — все операции выполняются через механизмы платформы, и прямой доступ к таблицам СУБД в обход платформы не рекомендуется и не поддерживается.

Тип «Дата» и состав даты в реквизитах

В конфигураторе у реквизита типа «Дата» есть свойство «Состав даты», которое определяет, какая часть значения будет использоваться при вводе и отображении. Доступны три варианта: «Дата», «Время» и «Дата и время».

Важный нюанс: состав даты влияет на ввод и отображение, но внутреннее значение всё равно содержит и дату, и время. Если состав установлен «Дата», время при вводе обнуляется; если «Время» — обнуляется дата (устанавливается 01.01.0001). Это нужно учитывать при сравнении значений в коде.

Состав датыЧто вводит пользовательЧто хранится внутриТипичное применение
ДатаЧисло, месяц, годДата + 00:00:00Дата рождения, дата начала действия договора
ВремяЧасы, минуты, секунды01.01.0001 + времяВремя начала смены, расписания
Дата и времяПолное значениеДата + времяДата документа, отметки в регистрах

У документов стандартный реквизит «Дата» по умолчанию имеет состав «Дата и время». Это сделано намеренно: по дате документа платформа определяет его позицию в последовательности проведения, и время здесь играет роль порядка внутри дня.

Пустая дата и её особенности

Пустая дата — это значение 01.01.0001 00:00:00. Именно оно подставляется в реквизит типа «Дата», пока пользователь ничего не ввёл. В интерфейсе пустая дата обычно отображается как пустое поле, но при выгрузке или программной обработке можно увидеть именно «01.01.0001».

Для проверки даты на пустоту в коде используют функцию ЗначениеЗаполнено() или сравнение с пустой датой через литерал '00010101':

Если Не ЗначениеЗаполнено(ДатаОкончания) Тогда

Сообщить("Дата окончания не указана");

КонецЕсли;

Если ДатаОкончания = '00010101' Тогда

// Дата пустая

КонецЕсли;

Распространённая ошибка — проверять дату на NULL. В таблицах 1С реквизит типа «Дата» практически никогда не содержит NULL (NULL появляется только в результатах соединений в запросах). Проверка Дата = NULL на пустую дату не сработает — нужно сравнивать именно с 01.01.0001.

Работа с датами в коде встроенного языка

Во встроенном языке 1С даты создаются несколькими способами: литералом в одинарных кавычках, функцией Дата() и получением текущей даты сеанса. Литерал записывается в формате ГГГГММДД с необязательным временем: '20260315143000' — 15 марта 2026 года, 14:30:00.

Для получения текущего момента в серверном коде используется ТекущаяДатаСеанса(), а не ТекущаяДата(). Разница принципиальна: дата сеанса вычисляется с учётом часового пояса сеанса и корректна в клиент-серверном режиме, тогда как ТекущаяДата() возвращает время компьютера, где выполняется код, что на сервере может отличаться от времени пользователя.

НачалоСегодня = НачалоДня(ТекущаяДатаСеанса());

КонецСегодня = КонецДня(ТекущаяДатаСеанса());

ЧерезНеделю = ТекущаяДатаСеанса() + 7 24 60 * 60; // дата + 7 дней в секундах

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

Типичные ошибки при работе с датами
01
Использование ТекущаяДата() в серверном коде — время сервера может не совпадать со временем пользователя; используйте ТекущаяДатаСеанса().
02
Сравнение дат через «равно» без учёта времени — 15.03.2026 00:00:00 не равно 15.03.2026 14:30:00, хотя день один; применяйте НачалоДня() и КонецДня().
03
Проверка пустой даты на NULL — пустая дата это 01.01.0001, а не NULL.
04
Сложение дней умножением на 30 при расчёте месяцев — месяцы имеют разную длину, используйте ДобавитьМесяц().

Даты в запросах 1С

В языке запросов даты передаются через параметры или литералы. Литерал даты записывается ключевым словом ДАТАВРЕМЯ: ДАТАВРЕМЯ(2026, 3, 15, 14, 30, 0). Пустая дата в запросе — ДАТАВРЕМЯ(1, 1, 1).

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

ВЫБРАТЬ

Реализация.Ссылка,

Реализация.Дата

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

ГДЕ

Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода

Для периодичности в запросах используются функции НАЧАЛОПЕРИОДА() и КОНЕЦПЕРИОДА() с указанием единицы: ДЕНЬ, МЕСЯЦ, КВАРТАЛ, ГОД. Они позволяют группировать данные по периодам без ручного вычисления границ.

Как корректно отобрать документы за период
  1. 1
    Вычислите в коде НачалоДня(ДатаНачала) и КонецДня(ДатаОкончания).
  2. 2
    Передайте оба значения в запрос как параметры &НачалоПериода и &КонецПериода.
  3. 3
    Используйте условие МЕЖДУ &НачалоПериода И &КонецПериода.
  4. 4
    Проверьте результат: документы за последний день периода с ненулевым временем должны попасть в выборку.

Хранение дат в регистрах и документах

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

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

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

Даты при обмене данными и интеграции

При выгрузке в XML и JSON дата сериализуется в формате ISO 8601: 2026-03-15T14:30:00. Этот формат однозначен и не зависит от региональных настроек, поэтому именно он используется в планах обмена, веб-сервисах и HTTP-интерфейсах.

Главная проблема интеграций — часовые пояса. Если внешняя система передаёт дату со смещением (например, 2026-03-15T14:30:00+03:00), а 1С интерпретирует её как локальную, возможны сдвиги на несколько часов и даже на сутки у значений около полуночи. Согласуйте с контрагентом по интеграции, в каком часовом поясе передаются даты, и при необходимости выполняйте явное преобразование.

Ещё одна типичная ситуация — «съехавшая» дата при загрузке из Excel или CSV, где дата записана строкой в формате, отличном от ожидаемого (ДД.ММ.ГГГГ против ММ/ДД/ГГГГ). Перед массовой загрузкой всегда проверяйте несколько распознанных значений глазами: день и месяц, перепутанные местами, на первых числах месяца заметить сложно.

Маршрут решения

Как выбрать подход к датам при интеграции

Внешняя система передаёт даты в ISO 8601 с указанием смещенияПреобразуйте значение к часовому поясу сеанса 1С перед записью в объекты
Даты приходят строкой в национальном форматеЯвно разберите строку по известному шаблону, не полагаясь на автоматическое распознавание
Обмен идёт между двумя базами 1СИспользуйте штатную сериализацию (XDTO, планы обмена) — проблем с форматом не будет
В данных встречаются даты около полуночи и они «уезжают» на суткиПроверьте обработку часовых поясов и перехода на летнее время на обеих сторонах

Отображение дат и региональные настройки

Формат отображения даты в интерфейсе зависит от региональных настроек информационной базы и от свойства «Формат» у элемента формы или поля отчёта. Одна и та же хранимая дата может показываться как «15.03.2026», «15 марта 2026 г.» или «03/15/2026» — на хранимое значение это никак не влияет.

Для программного форматирования используется функция Формат() с строкой формата: Формат(ДатаДокумента, "ДЛФ=D") выведет длинную дату, а Формат(Дата, "ДФ=yyyy-MM-dd") — машиночитаемый вид. Настройка формата — правильный способ изменить представление даты; преобразовывать дату в строку ради отображения и хранить её как строку — грубая ошибка, лишающая возможности сортировки и сравнения.

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

Как проверить корректность работы с датами

Пустой реквизит типа «Дата»
Норма

Значение равно 01.01.0001 00:00:00, ЗначениеЗаполнено() возвращает Ложь

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

Проверка на NULL или сравнение с пустой строкой

Отбор документов за период
Норма

В выборку попадают все документы последнего дня независимо от времени

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

Документы последнего дня с ненулевым временем теряются

Даты после обмена с внешней системой
Норма

День, месяц и год совпадают с источником, время соответствует согласованному поясу

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

Даты смещены на часы или сутки, перепутаны день и месяц

Текущая дата в серверном коде
Норма

Используется ТекущаяДатаСеанса()

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

Используется ТекущаяДата() — возможны расхождения у пользователей в других поясах

Часто задаваемые вопросы

Почему пустая дата в 1С отображается как 01.01.0001?

Потому что тип «Дата» не имеет состояния «ничего нет» — это всегда конкретное значение. Платформа использует минимально возможную дату 01.01.0001 00:00:00 как признак незаполненности. В формах такое значение скрывается, но при выгрузке или программной обработке оно видно явно.

Можно ли хранить в 1С только дату без времени?

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

Чем ТекущаяДата() отличается от ТекущаяДатаСеанса()?

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

Как прибавить к дате месяц или год?

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

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

Скорее всего, в параметр конца периода передана дата без времени, что означает 00:00:00 этого дня. Документы, проведённые позже полуночи, в условие не попадают. Решение — передавать КонецДня(ДатаОкончания) или использовать условие «меньше начала следующего дня».

В каком формате даты передаются при обмене через веб-сервисы?

Стандартный формат — ISO 8601, например 2026-03-15T14:30:00, с возможным указанием смещения часового пояса. При интеграции заранее договоритесь с другой стороной о часовом поясе и проверьте несколько тестовых значений, особенно даты около полуночи.

Итог

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

Дата в 1С всегда содержит дату и время с точностью до секунды; пустая дата — 01.01.0001 00:00:00. Состав даты влияет только на ввод и отображение, хранимое значение полное. В серверном коде используйте ТекущаяДатаСеанса(), в запросах — границы периода через НачалоДня и КонецДня, а при интеграциях заранее согласовывайте формат и часовой пояс.