Как принудительно задать формат даты в строковом поле на управляемой форме 1С?

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

В разработке на платформе 1С часто возникает задача, когда необходимо обеспечить ввод даты в строго определенном формате, например, дд.ММ.гггг. Стандартный подход — использовать поле с типом данных Дата, где все механизмы форматирования и выбора уже встроены. Однако бывают ситуации, когда по требованиям задачи (например, для интеграции с другой системой или для хранения специфических данных) необходимо использовать именно строковое поле. В этом случае стандартные свойства поля формы, такие как Формат или Маска, не дают нужного результата. Разберемся, как решить эту проблему с помощью программной обработки событий формы.

Проанализируем ситуацию: у нас есть реквизит формы или объекта с типом Строка. Мы хотим, чтобы пользователь вводил в него дату, и, независимо от того, как он ее ввел (например, "5.1.23" или "05,01,2023"), система автоматически приводила ее к единому формату "05.01.2023".

Основной подход: обработка события «ПриИзменении»

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

Рассмотрим по шагам, как это реализовать.

  1. Откройте вашу форму в конфигураторе.
  2. Выделите на форме элемент (поле ввода), для которого нужно настроить формат.
  3. В палитре свойств элемента перейдите на вкладку «События».
  4. Найдите событие ПриИзменении и нажмите на иконку с лупой, чтобы создать обработчик этого события на клиенте.

Система создаст пустую процедуру-обработчик. Теперь наша задача — наполнить ее кодом, который будет выполнять преобразование.

Решение 1: Простое преобразование формата

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

Предположим, что наше поле на форме привязано к реквизиту объекта с именем МоеПолеДатаСтрокой.


&НаКлиенте
Процедура МоеПолеДатаСтрокойПриИзменении(Элемент)
    // Проверяем, что поле не пустое
    Если НЕ ЗначениеЗаполнено(Объект.МоеПолеДатаСтрокой) Тогда
        Возврат;
    КонецЕсли;

    // Пытаемся преобразовать введенный текст в дату
    ПреобразованнаяДата = Дата(Объект.МоеПолеДатаСтрокой);

    // Форматируем полученную дату в нужный строковый формат и записываем обратно в поле
    Объект.МоеПолеДатаСтрокой = Формат(ПреобразованнаяДата, "ДФ=dd.MM.yyyy");
КонецПроцедуры

Разберем этот код:

Этот метод хорошо работает, но у него есть существенный недостаток: если пользователь введет текст, который система не сможет распознать как дату (например, "привет" или "12.34.5678"), произойдет ошибка времени выполнения, и работа пользователя будет прервана. Чтобы сделать интерфейс более дружелюбным, нужно обрабатывать такие ситуации.

Решение 2: Надежное преобразование с проверкой на ошибки

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


&НаКлиенте
Процедура МоеПолеДатаСтрокойПриИзменении(Элемент)
    // Проверяем, что поле не пустое
    Если НЕ ЗначениеЗаполнено(Объект.МоеПолеДатаСтрокой) Тогда
        Возврат;
    КонецЕсли;

    Попытка
        // Пытаемся преобразовать введенный текст в дату
        ПреобразованнаяДата = Дата(Объект.МоеПолеДатаСтрокой);
        
        // Если преобразование удалось, форматируем результат
        Объект.МоеПолеДатаСтрокой = Формат(ПреобразованнаяДата, "ДФ=dd.MM.yyyy");

    Исключение
        // Если преобразование не удалось, сообщаем пользователю об ошибке
        // и очищаем поле, чтобы он мог ввести значение заново.
        ОписаниеОшибки = "Введено некорректное значение даты. Пожалуйста, введите дату в формате ДД.ММ.ГГГГ.";
        ПоказатьПредупреждение(, ОписаниеОшибки); // или Сообщить()
        Объект.МоеПолеДатаСтрокой = ""; // Очищаем некорректный ввод
    КонецПопытки;
КонецПроцедуры

Что нового в этом коде:

Такой подход обеспечивает плавный и понятный пользовательский опыт: система не "падает" с ошибкой, а вежливо подсказывает, что нужно исправить.

Почему не работают свойства «Маска» и «Формат» для строки?

Важно понимать, почему стандартные свойства элемента формы не помогли в исходной задаче.

Именно поэтому для строковых полей, в которых мы хотим хранить данные в определенном формате, единственным надежным решением является программная обработка событий, таких как ПриИзменении.

В заключение, при работе с датами всегда старайтесь использовать реквизиты с типом Дата. Это самый правильный и надежный путь. Но если по каким-то причинам это невозможно, рассмотренный метод с обработкой события ПриИзменении и конструкцией Попытка-Исключение является лучшей практикой для обеспечения корректности и удобства ввода данных в строковые поля.

← На главную