Как настроить год начала рабочего столетия в 1С при вводе двух цифр года?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При заполнении реквизитов с датами пользователи часто сокращают ввод года до двух цифр: например, вводят «25» вместо «2025» или «30» вместо «2030». Однако при вводе числа «30» платформа 1С может автоматически подставить 1930 год вместо ожидаемого 2030 года. Особенно часто эта проблема возникает при планировании будущих событий, таких как периодические медицинские осмотры, плановые поверки оборудования или долгосрочные договоры.

Разберем причины такого поведения платформы и выясним, какие существуют способы решения этой проблемы в «1С:Предприятии 8.2» и более современных версиях платформы.

Почему при вводе «30» подставляется 1930 год?

В отличие от устаревшей версии «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 и выше (и режим совместимости конфигурации установлен не ниже 8.3.14), разработчикам доступен специальный метод встроенного языка:

УстановитьНачалоСтолетияИнформационнойБазы(<НачалоСтолетия>)

С помощью этой процедуры можно централизованно задать начало рабочего 100-летнего интервала для всей базы данных. Например, вызвав эту процедуру при инициализации или в административной обработке, можно установить начало столетия с 1950 или 2000 года:


// Устанавливаем начало столетия с 1950 года (диапазон 1950–2049)
УстановитьНачалоСтолетияИнформационнойБазы(1950);

В платформе 8.2 этот метод отсутствует, поэтому для нее необходимо применять обходные пути.

Решение 1. Изменение региональных настроек операционной системы

Так как клиент 1С в версии 8.2 опирается на настройки операционной системы Windows, мы можем скорректировать правило интерпретации двух цифр года непосредственно в ОС на рабочих местах пользователей.

Разберем по шагам порядок настройки:

  1. Откроем «Панель управления» Windows и перейдем в раздел «Региональные стандарты».
  2. Нажмем кнопку «Дополнительные параметры».
  3. Перейдем на вкладку «Дата».
  4. В нижней части окна найдем блок «Интерпретация года из двух цифр», где по умолчанию указан интервал от 1930 до 2029 года.
  5. Изменим верхнюю границу, указав, например, 2049 или 2050 год.
  6. Нажмем кнопку «Применить» и перезапустим сеанс 1С.

Если пользователи работают через Remote Desktop (терминальный сервер RDP), указанную настройку необходимо выполнить для профилей пользователей на сервере либо распространить ее централизованно через групповые политики (GPO) или реестр Windows.

Решение 2. Программная корректировка значения на форме

Если требуется скорректировать поведение конкретного реквизита без изменения системных настроек Windows на всех рабочих станциях, реализуем программную проверку в конфигураторе.

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


&НаКлиенте
Процедура ДатаСледующегоМедосмотраПриИзменении(Элемент)
    Если ЗначениеЗаполнено(Объект.ДатаСледующегоМедосмотра) Тогда
        // Если при вводе определился год меньше 2000, сдвигаем на 100 лет вперед (1200 месяцев)
        Если Год(Объект.ДатаСледующегоМедосмотра) < 2000 Тогда
            Объект.ДатаСледующегоМедосмотра = ДобавитьМесяц(Объект.ДатаСледующегоМедосмотра, 1200);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Аналогичную логику можно разместить в модуле объекта в обработчике ПередЗаписью, чтобы гарантировать корректность данных независимо от используемой формы ввода.

Решение 3. Настройка формата поля и регламент ввода

Проанализируем визуальные и организационные методы предотвращения ошибок:

  1. Настройка формата в конфигураторе: в свойствах поля ввода на форме укажем параметры Формат и ФорматРедактирования со строкой ДФ=dd.MM.yyyy (или ДФ=ДД.ММ.ГГГГ). Наличие четырех позиций для года подсказывает пользователю о необходимости полного ввода.
  2. Использование календаря: выбор будущей даты через стандартное выпадающее окно календаря полностью исключает двусмысленность века.
  3. Организационный регламент: инструктаж пользователей о необходимости обязательного ввода четырех цифр года («2030» вместо «30») для документов планирования.
← На главную