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

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

При разработке интерфейсов на управляемых формах в «1С:Предприятие 8.3» программисты часто сталкиваются с необходимостью оперативной проверки введенных пользователем данных. Типичный сценарий: в табличной части есть колонка с типом Дата, и нам требуется мгновенно отреагировать, если пользователь оставил это поле пустым при переходе к следующей колонке. На первый взгляд задача кажется тривиальной, но при попытке использовать клиентские события разработчики нередко заходят в тупик, пытаясь анализировать сырой текст маски ввода вроде " . . ". В этой статье мы подробно разберем, почему ручной анализ текста редактирования — это тупиковый путь, и рассмотрим наиболее надежные, профессиональные способы решения этой задачи.

В чем сложность проверки маски ввода?

Давайте проанализируем ситуацию, с которой столкнулся автор темы. При попытке проверить введенное значение в событии ПриИзменении или ОкончаниеВводаТекста через свойство элемента Элемент.ТекстРедактирования, платформа возвращает строковое представление пустой даты. В русской локализации операционной системы Windows это обычно строка вида " . . ". Однако завязываться на прямое сравнение с этой строкой крайне не рекомендуется по следующим причинам:

  1. Зависимость от региональных настроек: Если у пользователя в операционной системе установлены отличные от стандартных региональные стандарты (например, английские или немецкие), разделителем даты может выступать косая черта / или дефис -. В этом случае жестко прописанное условие Если Текст = " . . " Тогда просто не сработает.
  2. Свойство «ФорматРедактирования»: Если у поля ввода задан индивидуальный формат редактирования, маска пустого значения изменится, что опять же приведет к ошибке в коде сравнения строк.

Для создания отказоустойчивого кода нам необходимо уйти от сравнения текстовых строк и обратиться к механизмам работы платформы с типизированными данными.

Способ №1. Обращение к текущим данным строки в событии «ПриИзменении»

Это самый простой, логичный и «чистый» с точки зрения архитектуры платформы способ. Разберем по шагам логику работы управляемой формы. В момент, когда срабатывает событие ПриИзменении для конкретного поля табличной части, платформа 1С уже произвела трансляцию введенного пользователем текста в реальный тип данных Дата и записала его в объект данных формы.

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


&НаКлиенте
Процедура ИмяТаблицыДатаПриИзменении(Элемент)
    
    // Получаем строку табличной части, в которой происходило редактирование
    ТекущаяСтрока = Элементы.ИмяТаблицыНаФорме.ТекущиеДанные;
    
    Если ТекущаяСтрока <> Неопределено Тогда
        
        // Проверяем заполненность даты стандартной системной функцией
        Если Не ЗначениеЗаполнено(ТекущаяСтрока.ИмяРеквизитаДаты) Тогда
            
            // Выполняем требуемые действия, например, выводим предупреждение
            ПоказатьПредупреждение(, "Поле ""Дата"" обязательно для заполнения!");
            
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

Этот подход гарантирует стабильность работы решения вне зависимости от настроек операционной системы, региональных стандартов или используемой маски ввода, поскольку функция ЗначениеЗаполнено() работает с типом Дата (сравнивая её с пустой датой '00010101000000'), а не с ее строковым представлением.

Способ №2. Перехват ввода в событии «ОкончаниеВводаТекста»

Если перед нами стоит задача выполнить проверку именно в момент «ухода» из поля, предотвратив при этом запись некорректного значения или прервав стандартное поведение платформы, можно использовать обработчик ОкончаниеВводаТекста.

В этом событии параметр Текст содержит сырые данные, которые пользователь ввел с клавиатуры. Но как проверить, пустой ли это ввод, не прибегая к жесткому сравнению с точками? Мы можем использовать функцию преобразования типов в безопасном режиме (через попытку) или получить эталон пустого значения.

Рассмотрим пример программной генерации эталонной строки пустого значения на основе текущих региональных настроек системы:


&НаКлиенте
Процедура ИмяТаблицыДатаОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
    
    // Генерируем эталон пустой маски ввода динамически под текущую локаль
    ЭталонПустойДаты = Формат('00010101', "ДФ=dd.MM.yyyy");
    
    // Сравниваем введенный пользователем текст с эталоном
    Если СокрЛП(Текст) = ЭталонПустойДаты Или ПустаяСтрока(Текст) Тогда
        
        // Отменяем стандартную обработку, чтобы не записывать пустую дату
        СтандартнаяОбработка = Ложь;
        
        // Информируем пользователя
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Пожалуйста, введите корректную дату!");
        
    КонецЕсли;
    
КонецПроцедуры

Важный нюанс: Обратите внимание, что событие ОкончаниеВводаТекста срабатывает преимущественно при ручном наборе символов с клавиатуры. Если пользователь выбирает дату интерактивно через выпадающий стандартный календарь, поведение этого события в некоторых версиях платформы может отличаться. Поэтому данный способ рекомендуется использовать как вспомогательный или в паре с ПриИзменении.

Способ №3. Использование свойства «АвтоОтметкаНезаполненного»

Зачастую программисты начинают писать сложный программный код там, где платформа предоставляет готовое декларативное решение. Если ваша главная задача — визуально выделить незаполненную дату и привлечь внимание пользователя, идеальным решением будет использование встроенного свойства элемента формы. Для тестирования и изменения настроек элементов без постоянного перезапуска конфигуратора подойдёт обработка для редактирования свойств форм в режиме предприятия.

Разберем, как активировать эту возможность без написания кода:

  1. Откройте управляемую форму в конфигураторе.
  2. Найдите в дереве элементов формы нужное поле ввода (колонку табличной части) с типом Дата.
  3. В палитре свойств этого элемента найдите свойство АвтоОтметкаНезаполненного.
  4. Установите значение свойства в Истина.

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

Способ №4. Очистка строки от служебных символов маски

Если по каким-то архитектурным причинам вам критически необходимо анализировать именно текстовое содержимое свойства Элемент.ТекстРедактирования, но вы хотите сделать проверку универсальной для любых масок, можно прибегнуть к методу «очистки» строки от разделителей.

Мы можем удалить из строки все пробелы и точки (а также другие возможные разделители), после чего проверить длину оставшейся строки:


&НаКлиенте
Процедура ПроверитьТекстВвода(Элемент)
    
    ВведенныйТекст = Элемент.ТекстРедактирования;
    
    // Удаляем из строки пробелы, точки, дефисы и косые черты
    ОчищенныйТекст = СтрЗаменить(ВведенныйТекст, " ", "");
    ОчищенныйТекст = СтрЗаменить(ОчищенныйТекст, ".", "");
    ОчищенныйТекст = СтрЗаменить(ОчищенныйТекст, "/", "");
    ОчищенныйТекст = СтрЗаменить(ОчищенныйТекст, "-", "");
    
    Если ПустаяСтрока(ОчищенныйТекст) Тогда
        // Пользователь ничего не ввел, строка состоит только из разделителей маски
        ПоказатьПредупреждение(, "Вы оставили поле даты пустым!");
    КонецЕсли;
    
КонецПроцедуры

Этот способ является обходным и относится к категории "workaround", но он на порядок надежнее прямого сравнения со статической строкой " . . ", так как учитывает альтернативные символы-разделители дат.

Резюме и рекомендации

Подводя итоги, сформулируем наиболее эффективные практики для контроля заполненности дат в табличных частях на управляемых формах 1С:

← На главную