При заполнении реквизитов с датами пользователи часто сокращают ввод года до двух цифр: например, вводят «25» вместо «2025» или «30» вместо «2030». Однако при вводе числа «30» платформа 1С может автоматически подставить 1930 год вместо ожидаемого 2030 года. Особенно часто эта проблема возникает при планировании будущих событий, таких как периодические медицинские осмотры, плановые поверки оборудования или долгосрочные договоры.
Разберем причины такого поведения платформы и выясним, какие существуют способы решения этой проблемы в «1С:Предприятии 8.2» и более современных версиях платформы.
В отличие от устаревшей версии «1С:Предприятие 7.7», где в меню пользователя присутствовал пункт «Год начала рабочего столетия», в платформе 8.2 такой глобальной интерактивной настройки в пользовательском интерфейсе нет.
Распознавание даты происходит на стороне клиентского приложения до передачи данных на сервер или в СУБД (например, в Microsoft SQL Server). Поэтому параметры СУБД, такие как two digit year cutoff, на работу диалоговых полей 1С влияния не оказывают.
Клиентское приложение платформы по умолчанию использует системное 100-летнее скользящее окно операционной системы Windows. В стандартных региональных настройках Windows диапазон двухзначных годов обычно задан от 1930 до 2029 года. По этой причине любые числа от 00 до 29 интерпретируются как 2000–2029 годы, а начиная со значения 30 — как 1930–1999 годы.
Если информационная база работает на современной платформе версии 8.3.14 и выше (и режим совместимости конфигурации установлен не ниже 8.3.14), разработчикам доступен специальный метод встроенного языка:
УстановитьНачалоСтолетияИнформационнойБазы(<НачалоСтолетия>)
С помощью этой процедуры можно централизованно задать начало рабочего 100-летнего интервала для всей базы данных. Например, вызвав эту процедуру при инициализации или в административной обработке, можно установить начало столетия с 1950 или 2000 года:
// Устанавливаем начало столетия с 1950 года (диапазон 1950–2049)
УстановитьНачалоСтолетияИнформационнойБазы(1950);
В платформе 8.2 этот метод отсутствует, поэтому для нее необходимо применять обходные пути.
Так как клиент 1С в версии 8.2 опирается на настройки операционной системы Windows, мы можем скорректировать правило интерпретации двух цифр года непосредственно в ОС на рабочих местах пользователей.
Разберем по шагам порядок настройки:
Если пользователи работают через Remote Desktop (терминальный сервер RDP), указанную настройку необходимо выполнить для профилей пользователей на сервере либо распространить ее централизованно через групповые политики (GPO) или реестр Windows.
Если требуется скорректировать поведение конкретного реквизита без изменения системных настроек Windows на всех рабочих станциях, реализуем программную проверку в конфигураторе.
Для поля ввода даты на форме создадим обработчик события ПриИзменении. Если введенный год относится к прошлому веку для реквизита, который заведомо должен быть в будущем, сместим дату на 100 лет вперед с помощью функции ДобавитьМесяц:
&НаКлиенте
Процедура ДатаСледующегоМедосмотраПриИзменении(Элемент)
Если ЗначениеЗаполнено(Объект.ДатаСледующегоМедосмотра) Тогда
// Если при вводе определился год меньше 2000, сдвигаем на 100 лет вперед (1200 месяцев)
Если Год(Объект.ДатаСледующегоМедосмотра) < 2000 Тогда
Объект.ДатаСледующегоМедосмотра = ДобавитьМесяц(Объект.ДатаСледующегоМедосмотра, 1200);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Аналогичную логику можно разместить в модуле объекта в обработчике ПередЗаписью, чтобы гарантировать корректность данных независимо от используемой формы ввода.
Проанализируем визуальные и организационные методы предотвращения ошибок:
ДФ=dd.MM.yyyy (или ДФ=ДД.ММ.ГГГГ). Наличие четырех позиций для года подсказывает пользователю о необходимости полного ввода.