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

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

Какая максимальная дата в 1С и как с ней работать

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

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

Максимальная дата 31.12.3999 важна не только как техническое ограничение. Её активно используют в запросах и коде как маркер «бесконечного» периода — например, для записей регистров сведений с режимом «в пределах даты» или для обозначения открытого конца интервала действия цены, курса валюты или договора. В некоторых типовых механизмах встречается и значение 31.12.3999 23:59:59 как условный признак «срок не ограничен».

Отдельная тема — пустая дата. Значение 01.01.0001 00:00:00 считается незаполненным, и именно с ним сравнивают реквизиты, когда нужно проверить, указана дата или нет. Путаница между пустой датой, максимальной датой и реальными рабочими датами — частый источник ошибок в отчётах и обменах данными.

Границы типа «Дата» и их практический смысл

Тип «Дата» в 1С хранит и календарную дату, и время с точностью до секунды. Диапазон допустимых значений — с 1 января года 1 по 31 декабря 3999 года включительно. Это ограничение платформы, а не конкретной конфигурации, поэтому оно одинаково действует в «Бухгалтерии», «Управлении торговлей», «Зарплате и управлении персоналом» и любых самописных решениях.

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

Как задать максимальную дату в коде

Во встроенном языке дату задают литералом в одинарных кавычках или функцией Дата(). Максимальное значение записывается так: '39991231235959' — год, месяц, день, часы, минуты, секунды без разделителей. Вариант с литералом '39991231' даст 31.12.3999 00:00:00, то есть начало последнего дня, а не его конец — это разные значения, и в сравнениях «меньше или равно» разница может сыграть роль.

Типичный пример использования — заполнение даты окончания в регистре сведений, где период действия не ограничен:

bsl
МаксимальнаяДата = '39991231235959'; // 31.12.3999 23:59:59
Если НЕ ЗначениеЗаполнено(Запись.ДатаОкончания) Тогда
    Запись.ДатаОкончания = МаксимальнаяДата;
КонецЕсли;

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

Максимальная дата в запросах

В языке запросов дата задаётся через параметр или литерал ДАТАВРЕМЯ(3999, 12, 31, 23, 59, 59). Прямое использование литерала удобно в консоли запросов, но в рабочем коде надёжнее передавать значение параметром — так запрос проще читать и поддерживать.

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

bsl
Запрос.Текст =
"ВЫБРАТЬ Цены.Номенклатура, Цены.Цена
|ИЗ РегистрСведений.Цены КАК Цены
|ГДЕ &ТекущаяДата МЕЖДУ Цены.ДатаНачала И Цены.ДатаОкончания";
Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса());

В этом подходе бессрочная запись хранит дату окончания 31.12.3999 23:59:59 и автоматически попадает в выборку. Альтернатива — хранить пустую дату и писать условие (Цены.ДатаОкончания = ДАТАВРЕМЯ(1,1,1) ИЛИ &ТекущаяДата <= Цены.ДатаОкончания), но такой запрос сложнее и обычно медленнее оптимизируется.

Как обозначить бессрочный период

Максимальная дата 31.12.3999

Простое условие МЕЖДУ в запросах, индекс работает эффективно. Минус — дату нужно скрывать в интерфейсе, иначе пользователи видят странный 3999 год.

Пустая дата 01.01.0001

Наглядно в данных, но условие в запросе усложняется проверкой на пустое значение, а сортировки по дате окончания ставят такие записи в начало.

Отдельный флаг «Бессрочно»

Понятен пользователю и гибок в логике, но требует лишнего реквизита и согласованной обработки во всех запросах и отчётах.

Максимальная дата в интерфейсе и отчётах

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

В собственных отчётах на СКД это делается через вкладку «Условное оформление»: добавляется отбор «ДатаОкончания Равно 31.12.3999», а в оформлении для поля устанавливается пустой текст. В управляемых формах аналогичный приём реализуется через элемент условного оформления формы.

Скрыть максимальную дату в отчёте СКД
  1. 1
    Откройте схему компоновки данных и перейдите на вкладку «Настройки», затем «Условное оформление».
  2. 2
    Добавьте элемент, в отборе укажите: ДатаОкончания Равно 31.12.3999 23:59:59.
  3. 3
    В оформлении для нужного поля задайте пустой текст или слово «бессрочно».
  4. 4
    Сформируйте отчёт и проверьте, что вместо 3999 года выводится заданное представление.

Проверка дат и типичные ошибки

Функция ЗначениеЗаполнено() для даты возвращает Ложь только для пустой даты 01.01.0001. Максимальная дата с точки зрения платформы — полностью заполненное значение, поэтому проверка заполненности не защитит от попадания служебного 3999 года в документы или печатные формы. Если логика требует отличать реальные даты от маркера бессрочности, добавляйте явное сравнение с границей.

Ещё одна ловушка — сравнение дат с разной точностью. Дата документа обычно содержит время, а дата, введённая пользователем в отборе, — начало дня 00:00:00. Условие «меньше или равно 31.12.3999 00:00:00» не включит записи с 31.12.3999 15:30:00. Для границ периодов используйте КонецДня() или задавайте время 23:59:59 явно.

Типичные ошибки
01
Использовать 31.12.3999 00:00:00 вместо 23:59:59 как верхнюю границу — записи последнего дня с ненулевым временем выпадают из выборки.
02
Проверять бессрочность через ЗначениеЗаполнено — функция считает 3999 год заполненным значением и вернёт Истина.
03
Выводить служебную максимальную дату в печатные формы без маскировки — пользователи видят 3999 год и считают это сбоем.
04
Сравнивать даты из обмена без контроля формата — строка в другом порядке дня и месяца может превратиться в некорректную дату или вызвать исключение.

Ограничения при обмене и интеграции

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

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

Контроль результата

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

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

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

Запрос с условием МЕЖДУ по периоду
Норма

Бессрочная запись с датой окончания 31.12.3999 попадает в выборку на любую текущую дату

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

Запись выпадает из выборки — вероятно, верхняя граница задана как начало дня

Отображение в отчёте или списке
Норма

Вместо 3999 года выводится пустое поле или слово «бессрочно»

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

Пользователи видят 31.12.3999 в строках

Выгрузка во внешнюю систему
Норма

Принимающая сторона корректно обрабатывает значение или согласованный маркер

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

Обмен падает с ошибкой преобразования даты или записывает искажённое значение

Частые вопросы

Чему равна максимальная дата в 1С 8.3?

31 декабря 3999 года, 23:59:59. Это ограничение платформы и не зависит от конфигурации или релиза линейки 8.3.

Что означает дата 01.01.0001 в реквизите?

Это пустая дата — признак того, что значение не заполнено. Именно с ней сравнивают поле при проверке через ЗначениеЗаполнено() или условие ДАТАВРЕМЯ(1,1,1) в запросе.

Почему в списке или отчёте виден 3999 год?

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

Можно ли использовать дату позже 3999 года?

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

Чем отличается 31.12.3999 00:00:00 от 31.12.3999 23:59:59?

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

Как в запросе выбрать только записи с незаполненной датой окончания?

Условие вида: ГДЕ ДатаОкончания = ДАТАВРЕМЯ(1,1,1). Если бессрочность обозначена максимальной датой, то наоборот: ГДЕ ДатаОкончания = ДАТАВРЕМЯ(3999,12,31,23,59,59).

Итог

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

Диапазон дат в 1С — от 01.01.0001 00:00:00 (пустая дата) до 31.12.3999 23:59:59. Максимальную дату применяют как маркер бессрочного периода: задавайте её с концом дня, маскируйте в интерфейсе и контролируйте при обмене с внешними системами.