У любого технического ограничения есть непосредственная причина.
Интересно было бы ее узнать, потому что в данном случае она неочевидна.
Это называется "любопытство".
(9) Почти угадал :)
Настраивал как-то синхронизацию одной самописки с внешней системой (плюсы и сиквел) и так как статусов документов во внешней системе не было, то ее пользователи вместо удаления переносили документы в будущую дату. Ну и, соответственно, когда забросили сильно далеко потомкам, то обмен сломался :)
Вот тогда вопрос и засел. Почему именно 3999?
(1) в ms sql есть ограничение на диапазон, но нижний. "С я января 1753 года до 31 декабря 9999 года"
В 1С диапазон начинается с 1 года. Напрямую сохранить в базу без преобразования нельзя. Обычно настроено на прибавление к сохраняемой дате 2000 лет.
https://its.1c.eu/db/metod8dev#content:4055:hdoc
В любом случае необходимы ограничения. Почему выбрали именно 3999 не известно. Может есть еще какие особенности.
Почему выбрали именно 3999 не известно. Может есть еще какие особенности.
Об этих то особенностях и задан сабжевый вопрос.
Но спасибо всем, кто поторопился меня проинформировать о том, что я и так знал :)
Про смещение дат я сам же сразу и упомянул, сказав что даже с его учетом не сростается. Непонятно, почему 3999.
(13) это ограничение может вытекать из-за механизма преобразования дат при сохранении в БД.
Могу предположить, что просто прибавление кол-ва секунд (). И это уже просто искусственное ограничение разрядности.
(18) Скорее всего именно так и есть. Но как именно оно работает - было бы интересно понять.
И получается, что разрядность ограничена для упрощения алгоритма преобразования. Это единственное логичное предположение, которое я могу сделать.
Но компромисс получился такой - спорный...
(22)
Одинэсная дата - позволяет.
Сиквельная дата - позволяет.
Но преобразование одинэсной даты в сиквельную - не позволяет.
Какие еще могут быть выводы?
(28) А если серьезно, то границы дат, конечно, зависят от количества бит выделенных под хранение дат и от точности хранения. Далее. Никто не использует возможный диапазон полностью. Потому что тогда у тебя нижняя граница была бы 1 января какого-то года, а верхняя какое-нибудь 11 марта 13:08:26 и т.д. Или наоборот. В любом случае запоминать неудобно. Поэтому диапазон обрезают до года, до ста лет, до тысячи. В каждом конкретном случае - это произвольное решение разработчиков: где установить нижнюю границу и как обрезать.
Причем заметьте - непосредственно формат даты 1С позволяет формировать даты до 9999 года. Т.е. дело не в формате даты 1С непосредственно.
1С кидает исключение при попытке записи даты больше 3999 именно в базу данных.
ну запись ограничена ограничением календаря до 4000 г, это понятно, вопрос в другом, возможно ли изменить например
Процедура ПередЗаписью(Отказ)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
Если ДатаОкончанияАктуальности = '00010101000000' Тогда
ДатаОкончанияАктуальности = '39991231235959';
КонецЕсли;
КонецПроцедуры
В "1С:Предприятии 8" даты могут принимать значения с 00:00:00 1 января 1 года по 23:59:59 31 декабря 9999 года, причем, записаны в базу данных могут быть даты с 00:00:00 1 января 1 года по 23:59:59 31 декабря 3999 года.