При работе в 1С:Предприятие пользователи часто сталкиваются с ситуацией, когда при вводе даты в формате «дд.мм.гг» система некорректно определяет век. Например, при вводе «02.02.20» программа подставляет 1920 год вместо ожидаемого 2020-го. Это происходит из-за того, что в настройках информационной базы или операционной системы неверно определена граница столетнего цикла. Проанализируем, какими способами можно отрегулировать этот механизм, чтобы ввод данных стал предсказуемым и корректным.
Самым надежным и правильным способом управления логикой дат в 1С:Предприятие 8.3 является использование встроенного языка. В платформе существует специальный метод УстановитьНачалоСтолетияИнформационнойБазы(). Рассмотрим подробнее, как он функционирует.
Этот метод принимает один параметр — целое число, которое задает год, открывающий столетний интервал. Логика платформы такова: все двузначные числа, введенные пользователем, будут распределяться внутри этого 100-летнего периода. Например, если мы установим начало столетия как 1950 год, то:
Чтобы решить проблему автора темы, когда «20» превращается в «1920», нам нужно сдвинуть начало столетия. Если сейчас начало установлено, скажем, в 1921 году, то число «20» попадает в конец предыдущего цикла. Установим более современную границу.
Разберем пример кода, который можно запустить во внешней обработке или в процедуре ПриНачалеРаботыСистемы:
// Установим начало рабочего столетия на 1980 год
// Теперь ввод "20" будет однозначно трактоваться как 2020 год
УстановитьНачалоСтолетияИнформационнойБазы(1980);
// Проверим, какое значение установлено сейчас
ТекущееНачало = ПолучитьНачалоСтолетияИнформационнойБазы();
Сообщить("Текущее начало столетия: " + ТекущееНачало);
Обратите внимание, что если метод ПолучитьНачалоСтолетияИнформационнойБазы() возвращает 0, это означает, что используются настройки по умолчанию, которые могут зависеть от версии платформы или региональных стандартов операционной системы.
Выясним причину, по которой 1С может вести себя по-разному на разных компьютерах. Платформа часто заимствует настройки формата даты из системных настроек Windows. Если программный метод, описанный выше, не вызван явно, в силу вступают правила ОС.
Посмотрим, где это настраивается в Windows:
Если в системе указано, что диапазон заканчивается 2029 годом, то число «30» будет автоматически воспринято системой как 1930 год. 1С считывает эти данные при запуске сеанса. Поэтому, если вы работаете в файловом варианте и не хотите писать код, убедитесь, что настройки на рабочих станциях пользователей унифицированы.
Для клиент-серверных версий баз данных существует еще один уровень контроля — настройки СУБД. В MS SQL Server есть параметр two digit year cutoff. Проанализируем ситуацию: хотя 1С обычно передает на сервер уже полностью сформированную дату с четырьмя цифрами года, этот параметр критически важен при выполнении прямых SQL-запросов или при использовании внешних источников данных.
По умолчанию в SQL Server этот параметр часто установлен в значение 2049. Это означает, что «49» интерпретируется как 2049, а «50» — как 1950. Если в вашей базе данных используются сложные интеграции или внешние таблицы, проверьте этот параметр в свойствах сервера (раздел Advanced).
В процессе обсуждения на форуме упоминалось «смещение дат». Это специфическая техническая настройка, которую мы выбираем при создании (регистрации) информационной базы в кластере 1С. Обычно предлагается выбор между 0 и 2000.
Зачем это нужно? Некоторые версии СУБД (например, старые версии MS SQL Server) не поддерживают даты ранее 1753 года. Чтобы программа могла хранить пустые даты (0001 год) или очень ранние исторические документы, 1С прибавляет 2000 лет к каждой дате перед записью в таблицу SQL. При чтении эти 2000 лет вычитаются.
Важно: Не путайте смещение дат с началом столетия. Если у вас неправильно настроено смещение, вы увидите в интерфейсе даты типа «4020 год» или получите критическую ошибку при записи. Если же проблема только в интерпретации двузначного ввода (20 превращается в 1920), то смещение тут ни при чем — нужно смотреть именно настройки столетия.
Иногда проблема кроется не в глобальных настройках базы, а в конкретном поле ввода. Рассмотрим ситуацию в конфигураторе. У каждого элемента формы типа «Поле ввода», связанного с датой, есть свойство Формат.
Если в строке формата жестко прописано ДФ=dd.MM.yy, платформа будет отображать только две цифры года. Это само по себе не меняет логику вычисления века, но может путать пользователя. Для исключения ошибок рекомендуется всегда использовать формат с четырьмя цифрами года (yyyy), чтобы пользователь сразу видел результат интерпретации после завершения ввода.
Проанализируем еще один фактор — Режим совместимости. В старых версиях платформы (8.0, 8.1) алгоритмы работы с датами имели свои особенности. Если ваша конфигурация работает в режиме совместимости с очень старой версией, поведение интерфейсных механизмов может отличаться от современных стандартов. Обновление режима совместимости до актуального (например, до 8.3.22) часто решает мелкие проблемы с отображением и вводом элементов управления «из коробки».
Для того чтобы гарантированно исправить проблему с интерпретацией года, мы рекомендуем выполнить следующие шаги:
УстановитьНачалоСтолетияИнформационнойБазы(1950) (или другой год, который вам подходит). Это установит настройку непосредственно в параметрах информационной базы, и она перестанет зависеть от региональных настроек Windows на разных компьютерах.Таким образом, комбинируя программные методы 1С и системные настройки, мы можем добиться того, чтобы ввод «02.02.20» всегда приводил к появлению корректной даты «02.02.2020».