В процессе работы с базами данных 1С, особенно при загрузке номенклатуры из внешних источников или ручном вводе, часто возникает проблема «перепутанных раскладок». В одном слове могут встретиться русские и английские буквы, которые выглядят абсолютно одинаково (например, латинская «A» и кириллическая «А»). Это приводит к дублям в справочниках и невозможности найти товар поиском. В данной статье мы подробно разберем, как программно определить язык символа и очистить данные от ошибок ввода.
Если ваша конфигурация построена на базе БСП (как большинство современных решений: Бухгалтерия 3.0, УТ 11, ERP), то самый правильный путь — использовать готовые программные интерфейсы. В общем модуле СтроковыеФункцииКлиентСервер уже реализованы надежные механизмы проверки.
Рассмотрим две ключевые функции: ТолькоКириллицаВСтроке и ТолькоЛатиницаВСтроке. Проанализируем их внутреннюю логику. Эти функции не просто проверяют диапазоны кодов, но и учитывают специфические символы, такие как буква «Ё», а также позволяют задавать исключения (например, знаки препинания или цифры).
Пример использования функций БСП в коде:
// Проверка, что наименование состоит только из русских букв
СтрокаДляПроверки = "Двигатель 4Аа50";
ТолькоРусские = СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(СтрокаДляПроверки, Ложь, " 0123456789-");
Если Не ТолькоРусские Тогда
Сообщить("В строке найдены иностранные символы или латиница!");
КонецЕсли;
Функция ТолькоКириллицаВСтроке работает по следующему алгоритму: она перебирает каждый символ строки и проверяет его код Unicode. Основной диапазон кириллицы в Unicode — от 1040 до 1103. Важно помнить, что буквы «Ё» (код 1025) и «ё» (код 1105) стоят в таблице символов отдельно, поэтому они обрабатываются как дополнительные допустимые коды.
Если вы работаете в конфигурации без БСП или хотите реализовать максимально легковесную проверку, мы можем использовать встроенную функцию КодСимвола. Платформа 1С хранит строки в формате Unicode (двухбайтовая кодировка), поэтому коды символов всегда стабильны и не зависят от региональных настроек Windows.
Проанализируем диапазоны кодов, которые нам понадобятся:
Рассмотрим пример функции, которая определяет, к какому алфавиту относится конкретный символ:
Функция ОпределитьЯзыкСимвола(Символ)
Код = КодСимвола(Символ);
// Проверка на латиницу
Если (Код >= 65 И Код <= 90) Или (Код >= 97 И Код <= 122) Тогда
Возврат "Латиница";
// Проверка на кириллицу
ИначеЕсли (Код >= 1040 И Код <= 1103) Или Код = 1025 Или Код = 1105 Тогда
Возврат "Кириллица";
Иначе
Возврат "Другой символ";
КонецЕсли;
КонецФункции
Этот метод особенно эффективен для поиска «букв-шпионов». Например, если нам нужно найти латинскую «с» в русском слове, мы проверяем символ методом КодСимвола: для русской «с» он вернет 1089, а для английской «c» — 99.
Регулярные выражения — это мощный инструмент для работы со строками. Начиная с версии платформы 8.3.23, 1С поддерживает регулярные выражения нативно (объект РегулярноеВыражение). До этого программисты часто использовали COM-объект VBScript.RegExp, но нативный метод работает быстрее и стабильнее.
Разберем, как проверить наличие английских букв в строке с помощью регулярного выражения:
// Для новых версий платформы (8.3.23+)
РегВыр = Новый РегулярноеВыражение("[a-zA-Z]"); // Ищем любую английскую букву
Если РегВыр.Проверить(НаименованиеНоменклатуры) Тогда
Сообщить("Обнаружена латиница в строке: " + НаименованиеНоменклатуры);
КонецЕсли;
Если вы используете более раннюю версию платформы, можно применить метод поиска через COM-соединение. Это решение требует операционной системы Windows на сервере:
Рег = Новый COMОбъект("VBScript.RegExp");
Рег.Global = Истина;
Рег.IgnoreCase = Истина;
Рег.Pattern = "[a-z]"; // Шаблон для поиска латиницы
Если Рег.Test(СтрокаДляПроверки) Тогда
// Латиница найдена
КонецЕсли;
Иногда удобнее не работать с кодами, а визуально определить набор допустимых символов. Мы можем создать строку-эталон и проверять наличие каждого символа в этой строке с помощью функции СтрНайти или Найти.
Посмотрим на пример реализации такого подхода:
Функция СодержитЛатиницу(Знач Стр)
ЭталонЛатиница = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
Для Позиция = 1 По СтрДлина(Стр) Цикл
Символ = Сред(Стр, Позиция, 1);
Если СтрНайти(ЭталонЛатиница, Символ) > 0 Тогда
Возврат Истина; // Нашли английскую букву
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
Этот метод очень нагляден и позволяет легко добавлять новые «запрещенные» или «разрешенные» символы без необходимости искать их коды в таблицах Unicode.
Проанализируем самую коварную ситуацию: символы-омографы. Это буквы, которые в разных алфавитах пишутся одинаково. Наиболее часто встречаются ошибки в следующих парах (Русский — Английский):
Чтобы эффективно бороться с этим, мы рекомендуем создавать «функции-чистильщики», которые автоматически заменяют латинские омографы на кириллические аналоги в словах, где кириллица преобладает. Это позволяет восстановить целостность базы данных без ручного исправления каждой карточки номенклатуры.
Выясним причину популярности таких ошибок: часто это происходит при копировании данных из Excel-прайсов или из-за привычки переключать раскладку только в середине слова. Использование регулярных выражений или посимвольного перебора с анализом кодов — лучший способ автоматизировать контроль качества данных в вашей системе 1С.