При активной работе с внешними источниками данных, такими как таблицы Excel, пользователи часто сталкиваются с проблемой "грязного" ввода. Одной из наиболее распространенных ситуаций является копирование штрихкодов. В Excel ячейки могут содержать невидимые пробелы в конце строки, которые при вставке в 1С:Предприятие приводят к ошибкам. Например, корректный штрихкод EAN13 из-за лишних пробелов может быть распознан системой как EAN128 или вовсе не найтись в базе данных.
В рамках данной статьи мы разберем, как программно реализовать автоматическую очистку (триминг) текста непосредственно в момент ввода, чтобы обеспечить корректность данных и удобство работы пользователя.
Рассмотрим ситуацию: пользователь вставляет текст в поле ввода на форме. Многие начинающие разработчики пытаются использовать событие ПриИзменении, но сталкиваются с тем, что автоматические механизмы платформы (например, определение типа штрихкода или поиск по строке) срабатывают раньше, чем отрабатывает код очистки. Или же при использовании события ОкончаниеВводаТекста пытаются обратиться к реквизиту объекта, который на этот момент еще не обновился.
Проанализируем основные способы решения этой задачи, начиная от простых и заканчивая более надежными методами фильтрации символов.
Событие ОкончаниеВводаТекста возникает в тот момент, когда пользователь закончил редактирование и пытается переключить фокус или нажать Enter. Важной особенностью этого события является параметр Текст, который содержит именно ту строку, которую пользователь только что ввел или вставил.
Рассмотрим пример кода, который позволяет перехватить ввод и очистить его до того, как значение будет записано в реквизит:
&НаКлиенте
Процедура ШтрихкодОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
// Очищаем текст от пробелов в начале и в конце
Текст = СокрЛП(Текст);
КонецПроцедуры
Важный нюанс: Если вы присвоите очищенное значение напрямую реквизиту (например, Объект.Штрихкод = СокрЛП(Текст)), но не измените сам параметр Текст, платформа может перезаписать ваше значение тем, что визуально осталось в поле ввода. Поэтому правильно изменять именно входящий параметр Текст.
Этот метод наиболее универсален и прост в реализации. Он срабатывает, когда значение в поле ввода уже окончательно зафиксировано. Это подходящее место для выполнения постобработки данных.
Выясним, как это выглядит в коде:
&НаКлиенте
Процедура ШтрихкодПриИзменении(Элемент)
// Прямое обращение к реквизиту, связанному с полем ввода
Объект.Штрихкод = СокрЛП(Объект.Штрихкод);
// После очистки можно вызывать функции поиска или определения типа ШК
ОпределитьТипШтрихкода(Объект.Штрихкод);
КонецПроцедуры
Этот способ хорош тем, что он гарантированно сработает после того, как пользователь любым способом завершил ввод (нажатием табуляции, кликом мыши или кнопкой Enter).
Часто функция СокрЛП() не справляется с данными из Excel. Это происходит потому, что помимо обычного пробела (код 32), в строку могут попасть неразрывные пробелы (код 160), символы табуляции или переноса строки. Функция СокрЛП() игнорирует такие символы.
Проанализируем ситуацию и добавим более глубокую очистку. Мы можем использовать функцию СтрЗаменить(), чтобы избавиться от специфических символов Excel:
&НаКлиенте
Функция ОчиститьСтрокуОтМусора(Знач ИсходныйТекст)
// Удаляем неразрывные пробелы
Результат = СтрЗаменить(ИсходныйТекст, Символы.НПП, "");
// Удаляем табуляцию
Результат = СтрЗаменить(Результат, Символы.Таб, "");
// Применяем стандартную очистку пробелов
Возврат СокрЛП(Результат);
КонецФункции
Если мы точно знаем, что в поле ввода должен быть штрихкод (например, EAN13), самым надежным способом будет удаление всех символов, которые не являются цифрами. Это исключит любые ошибки ввода, включая случайные буквы или знаки препинания.
Разберем, как реализовать такую функцию перебором строки:
&НаКлиенте
Функция ТолькоЦифры(Знач ВходящаяСтрока)
ОчищеннаяСтрока = "";
Для Индекс = 1 По СтрДлина(ВходящаяСтрока) Цикл
Символ = Сред(ВходящаяСтрока, Индекс, 1);
КодСимвола = КодСимвола(Символ);
// Коды цифр 0-9 находятся в диапазоне 48-57
Если КодСимвола >= 48 И КодСимвола <= 57 Тогда
ОчищеннаяСтрока = ОчищеннаяСтрока + Символ;
КонецЕсли;
КонецЦикла;
Возврат ОчищеннаяСтрока;
КонецФункции
Применение такой функции в событии ПриИзменении обеспечит максимальную чистоту данных в вашей базе.
Подведем итоги и выберем оптимальную стратегию для разных сценариев:
СокрЛП() в событии ПриИзменении.Текст до начала работы системных алгоритмов.Символы.НПП.Помните, что качественная обработка входящих данных на стороне клиента — это залог отсутствия дублей и ошибок в учетной системе. Совместное использование стандартных функций 1С и небольших вспомогательных процедур очистки позволяет сделать интерфейс программы гораздо более "дружелюбным" к пользователю, который привык работать с внешними офисными приложениями.