Разработка и Конфигурация · 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С выполняется в секундах: прибавление числа к дате сдвигает её на соответствующее количество секунд. Для сдвига на месяцы и годы существует функция ДобавитьМесяц(), поскольку длительность месяца непостоянна и простым сложением её не выразить.
Даты в запросах 1С
В языке запросов даты передаются через параметры или литералы. Литерал даты записывается ключевым словом ДАТАВРЕМЯ: ДАТАВРЕМЯ(2026, 3, 15, 14, 30, 0). Пустая дата в запросе — ДАТАВРЕМЯ(1, 1, 1).
При выборке документов за период правильно задавать границы через начало первого дня и конец последнего дня периода. Если передать в условие просто дату без времени, она будет интерпретирована как 00:00:00, и документы, проведённые в течение этого последнего дня, в выборку не попадут.
ВЫБРАТЬ
Реализация.Ссылка,
Реализация.Дата
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода
Для периодичности в запросах используются функции НАЧАЛОПЕРИОДА() и КОНЕЦПЕРИОДА() с указанием единицы: ДЕНЬ, МЕСЯЦ, КВАРТАЛ, ГОД. Они позволяют группировать данные по периодам без ручного вычисления границ.
- 1Вычислите в коде НачалоДня(ДатаНачала) и КонецДня(ДатаОкончания).
- 2Передайте оба значения в запрос как параметры &НачалоПериода и &КонецПериода.
- 3Используйте условие МЕЖДУ &НачалоПериода И &КонецПериода.
- 4Проверьте результат: документы за последний день периода с ненулевым временем должны попасть в выборку.
Хранение дат в регистрах и документах
Дата документа — ключевое поле: она определяет позицию документа на временной оси и участвует в механизме последовательностей. Изменение даты проведённого документа фактически перемещает его во времени и может потребовать перепроведения зависимых документов, поэтому платформа контролирует такие изменения.
В регистрах сведений с режимом «Подчинение регистратору» и в регистрах накопления дата записи наследуется от документа-регистратора. В периодических регистрах сведений есть собственное поле «Период», которое по умолчанию заполняется датой документа, но может быть изменено вручную — например, когда цена устанавливается «задним числом» или на будущую дату.
Периодичность регистра сведений (в пределах секунды, дня, месяца и т.д.) определяет точность, с которой хранится поле «Период». При периодичности «в пределах дня» время в поле периода отсекается — две записи на один день по одному набору измерений сосуществовать не смогут.
Даты при обмене данными и интеграции
При выгрузке в XML и JSON дата сериализуется в формате ISO 8601: 2026-03-15T14:30:00. Этот формат однозначен и не зависит от региональных настроек, поэтому именно он используется в планах обмена, веб-сервисах и HTTP-интерфейсах.
Главная проблема интеграций — часовые пояса. Если внешняя система передаёт дату со смещением (например, 2026-03-15T14:30:00+03:00), а 1С интерпретирует её как локальную, возможны сдвиги на несколько часов и даже на сутки у значений около полуночи. Согласуйте с контрагентом по интеграции, в каком часовом поясе передаются даты, и при необходимости выполняйте явное преобразование.
Ещё одна типичная ситуация — «съехавшая» дата при загрузке из Excel или CSV, где дата записана строкой в формате, отличном от ожидаемого (ДД.ММ.ГГГГ против ММ/ДД/ГГГГ). Перед массовой загрузкой всегда проверяйте несколько распознанных значений глазами: день и месяц, перепутанные местами, на первых числах месяца заметить сложно.
Как выбрать подход к датам при интеграции
Отображение дат и региональные настройки
Формат отображения даты в интерфейсе зависит от региональных настроек информационной базы и от свойства «Формат» у элемента формы или поля отчёта. Одна и та же хранимая дата может показываться как «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. Состав даты влияет только на ввод и отображение, хранимое значение полное. В серверном коде используйте ТекущаяДатаСеанса(), в запросах — границы периода через НачалоДня и КонецДня, а при интеграциях заранее согласовывайте формат и часовой пояс.