При разработке интерфейсов на управляемых формах в «1С:Предприятие 8.3» программисты часто сталкиваются с необходимостью оперативной проверки введенных пользователем данных. Типичный сценарий: в табличной части есть колонка с типом Дата, и нам требуется мгновенно отреагировать, если пользователь оставил это поле пустым при переходе к следующей колонке. На первый взгляд задача кажется тривиальной, но при попытке использовать клиентские события разработчики нередко заходят в тупик, пытаясь анализировать сырой текст маски ввода вроде " . . ". В этой статье мы подробно разберем, почему ручной анализ текста редактирования — это тупиковый путь, и рассмотрим наиболее надежные, профессиональные способы решения этой задачи.
Давайте проанализируем ситуацию, с которой столкнулся автор темы. При попытке проверить введенное значение в событии ПриИзменении или ОкончаниеВводаТекста через свойство элемента Элемент.ТекстРедактирования, платформа возвращает строковое представление пустой даты. В русской локализации операционной системы Windows это обычно строка вида " . . ". Однако завязываться на прямое сравнение с этой строкой крайне не рекомендуется по следующим причинам:
/ или дефис -. В этом случае жестко прописанное условие Если Текст = " . . " Тогда просто не сработает.Для создания отказоустойчивого кода нам необходимо уйти от сравнения текстовых строк и обратиться к механизмам работы платформы с типизированными данными.
Это самый простой, логичный и «чистый» с точки зрения архитектуры платформы способ. Разберем по шагам логику работы управляемой формы. В момент, когда срабатывает событие ПриИзменении для конкретного поля табличной части, платформа 1С уже произвела трансляцию введенного пользователем текста в реальный тип данных Дата и записала его в объект данных формы.
Следовательно, нам нет никакой необходимости анализировать свойство ТекстРедактирования. Мы можем напрямую обратиться к свойству ТекущиеДанные нашей таблицы на форме. Давайте посмотрим на практический пример реализации этого обработчика:
&НаКлиенте
Процедура ИмяТаблицыДатаПриИзменении(Элемент)
// Получаем строку табличной части, в которой происходило редактирование
ТекущаяСтрока = Элементы.ИмяТаблицыНаФорме.ТекущиеДанные;
Если ТекущаяСтрока <> Неопределено Тогда
// Проверяем заполненность даты стандартной системной функцией
Если Не ЗначениеЗаполнено(ТекущаяСтрока.ИмяРеквизитаДаты) Тогда
// Выполняем требуемые действия, например, выводим предупреждение
ПоказатьПредупреждение(, "Поле ""Дата"" обязательно для заполнения!");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Этот подход гарантирует стабильность работы решения вне зависимости от настроек операционной системы, региональных стандартов или используемой маски ввода, поскольку функция ЗначениеЗаполнено() работает с типом Дата (сравнивая её с пустой датой '00010101000000'), а не с ее строковым представлением.
Если перед нами стоит задача выполнить проверку именно в момент «ухода» из поля, предотвратив при этом запись некорректного значения или прервав стандартное поведение платформы, можно использовать обработчик ОкончаниеВводаТекста.
В этом событии параметр Текст содержит сырые данные, которые пользователь ввел с клавиатуры. Но как проверить, пустой ли это ввод, не прибегая к жесткому сравнению с точками? Мы можем использовать функцию преобразования типов в безопасном режиме (через попытку) или получить эталон пустого значения.
Рассмотрим пример программной генерации эталонной строки пустого значения на основе текущих региональных настроек системы:
&НаКлиенте
Процедура ИмяТаблицыДатаОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
// Генерируем эталон пустой маски ввода динамически под текущую локаль
ЭталонПустойДаты = Формат('00010101', "ДФ=dd.MM.yyyy");
// Сравниваем введенный пользователем текст с эталоном
Если СокрЛП(Текст) = ЭталонПустойДаты Или ПустаяСтрока(Текст) Тогда
// Отменяем стандартную обработку, чтобы не записывать пустую дату
СтандартнаяОбработка = Ложь;
// Информируем пользователя
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Пожалуйста, введите корректную дату!");
КонецЕсли;
КонецПроцедуры
Важный нюанс: Обратите внимание, что событие ОкончаниеВводаТекста срабатывает преимущественно при ручном наборе символов с клавиатуры. Если пользователь выбирает дату интерактивно через выпадающий стандартный календарь, поведение этого события в некоторых версиях платформы может отличаться. Поэтому данный способ рекомендуется использовать как вспомогательный или в паре с ПриИзменении.
Зачастую программисты начинают писать сложный программный код там, где платформа предоставляет готовое декларативное решение. Если ваша главная задача — визуально выделить незаполненную дату и привлечь внимание пользователя, идеальным решением будет использование встроенного свойства элемента формы. Для тестирования и изменения настроек элементов без постоянного перезапуска конфигуратора подойдёт обработка для редактирования свойств форм в режиме предприятия.
Разберем, как активировать эту возможность без написания кода:
Дата.После этого платформа автоматически возьмет на себя визуализацию контроля заполнения. Если дата в строке не выбрана, поле будет подчеркнуто прерывистой красной линией. Это избавляет от необходимости писать и поддерживать лишний код на клиенте. Для настройки более сложного цветового выделения пустых колонок можно использовать конструктор кода условного оформления для табличных частей.
Если по каким-то архитектурным причинам вам критически необходимо анализировать именно текстовое содержимое свойства Элемент.ТекстРедактирования, но вы хотите сделать проверку универсальной для любых масок, можно прибегнуть к методу «очистки» строки от разделителей.
Мы можем удалить из строки все пробелы и точки (а также другие возможные разделители), после чего проверить длину оставшейся строки:
&НаКлиенте
Процедура ПроверитьТекстВвода(Элемент)
ВведенныйТекст = Элемент.ТекстРедактирования;
// Удаляем из строки пробелы, точки, дефисы и косые черты
ОчищенныйТекст = СтрЗаменить(ВведенныйТекст, " ", "");
ОчищенныйТекст = СтрЗаменить(ОчищенныйТекст, ".", "");
ОчищенныйТекст = СтрЗаменить(ОчищенныйТекст, "/", "");
ОчищенныйТекст = СтрЗаменить(ОчищенныйТекст, "-", "");
Если ПустаяСтрока(ОчищенныйТекст) Тогда
// Пользователь ничего не ввел, строка состоит только из разделителей маски
ПоказатьПредупреждение(, "Вы оставили поле даты пустым!");
КонецЕсли;
КонецПроцедуры
Этот способ является обходным и относится к категории "workaround", но он на порядок надежнее прямого сравнения со статической строкой " . . ", так как учитывает альтернативные символы-разделители дат.
Подводя итоги, сформулируем наиболее эффективные практики для контроля заполненности дат в табличных частях на управляемых формах 1С:
ТекущиеДанные табличной части, используя событие ПриИзменении. Это самый безопасный и независимый от платформенных настроек метод.АвтоОтметкаНезаполненного." . . ", так как ваш код гарантированно перестанет работать при смене настроек локали сервера или клиента.