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

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

В процессе работы с базами данных 1С, особенно при загрузке номенклатуры из внешних источников или ручном вводе, часто возникает проблема «перепутанных раскладок». В одном слове могут встретиться русские и английские буквы, которые выглядят абсолютно одинаково (например, латинская «A» и кириллическая «А»). Это приводит к дублям в справочниках и невозможности найти товар поиском. В данной статье мы подробно разберем, как программно определить язык символа и очистить данные от ошибок ввода.

Метод 1: Использование функций Библиотеки Стандартных Подсистем (БСП)

Если ваша конфигурация построена на базе БСП (как большинство современных решений: Бухгалтерия 3.0, УТ 11, ERP), то самый правильный путь — использовать готовые программные интерфейсы. В общем модуле СтроковыеФункцииКлиентСервер уже реализованы надежные механизмы проверки.

Рассмотрим две ключевые функции: ТолькоКириллицаВСтроке и ТолькоЛатиницаВСтроке. Проанализируем их внутреннюю логику. Эти функции не просто проверяют диапазоны кодов, но и учитывают специфические символы, такие как буква «Ё», а также позволяют задавать исключения (например, знаки препинания или цифры).

Пример использования функций БСП в коде:


// Проверка, что наименование состоит только из русских букв
СтрокаДляПроверки = "Двигатель 4Аа50";
ТолькоРусские = СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(СтрокаДляПроверки, Ложь, " 0123456789-");

Если Не ТолькоРусские Тогда
    Сообщить("В строке найдены иностранные символы или латиница!");
КонецЕсли;

Функция ТолькоКириллицаВСтроке работает по следующему алгоритму: она перебирает каждый символ строки и проверяет его код Unicode. Основной диапазон кириллицы в Unicode — от 1040 до 1103. Важно помнить, что буквы «Ё» (код 1025) и «ё» (код 1105) стоят в таблице символов отдельно, поэтому они обрабатываются как дополнительные допустимые коды.

Метод 2: Ручная проверка через коды Unicode

Если вы работаете в конфигурации без БСП или хотите реализовать максимально легковесную проверку, мы можем использовать встроенную функцию КодСимвола. Платформа 1С хранит строки в формате Unicode (двухбайтовая кодировка), поэтому коды символов всегда стабильны и не зависят от региональных настроек Windows.

Проанализируем диапазоны кодов, которые нам понадобятся:

  1. Латиница (английские буквы): заглавные (A-Z) имеют коды от 65 до 90, строчные (a-z) — от 97 до 122.
  2. Кириллица (русские буквы): основной блок от 1040 ("А") до 1103 ("я"), плюс специфические коды для "Ё" (1025) и "ё" (1105).

Рассмотрим пример функции, которая определяет, к какому алфавиту относится конкретный символ:


Функция ОпределитьЯзыкСимвола(Символ)
    Код = КодСимвола(Символ);
    
    // Проверка на латиницу
    Если (Код >= 65 И Код <= 90) Или (Код >= 97 И Код <= 122) Тогда
        Возврат "Латиница";
    // Проверка на кириллицу
    ИначеЕсли (Код >= 1040 И Код <= 1103) Или Код = 1025 Или Код = 1105 Тогда
        Возврат "Кириллица";
    Иначе
        Возврат "Другой символ";
    КонецЕсли;
КонецФункции

Этот метод особенно эффективен для поиска «букв-шпионов». Например, если нам нужно найти латинскую «с» в русском слове, мы проверяем символ методом КодСимвола: для русской «с» он вернет 1089, а для английской «c» — 99.

Метод 3: Использование регулярных выражений

Регулярные выражения — это мощный инструмент для работы со строками. Начиная с версии платформы 8.3.23, 1С поддерживает регулярные выражения нативно (объект РегулярноеВыражение). До этого программисты часто использовали COM-объект VBScript.RegExp, но нативный метод работает быстрее и стабильнее.

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


// Для новых версий платформы (8.3.23+)
РегВыр = Новый РегулярноеВыражение("[a-zA-Z]"); // Ищем любую английскую букву
Если РегВыр.Проверить(НаименованиеНоменклатуры) Тогда
    Сообщить("Обнаружена латиница в строке: " + НаименованиеНоменклатуры);
КонецЕсли;

Если вы используете более раннюю версию платформы, можно применить метод поиска через COM-соединение. Это решение требует операционной системы Windows на сервере:


Рег = Новый COMОбъект("VBScript.RegExp");
Рег.Global = Истина;
Рег.IgnoreCase = Истина;
Рег.Pattern = "[a-z]"; // Шаблон для поиска латиницы
Если Рег.Test(СтрокаДляПроверки) Тогда
    // Латиница найдена
КонецЕсли;

Метод 4: Проверка через эталонную строку (поиск в наборе)

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

Посмотрим на пример реализации такого подхода:


Функция СодержитЛатиницу(Знач Стр)
    ЭталонЛатиница = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    Для Позиция = 1 По СтрДлина(Стр) Цикл
        Символ = Сред(Стр, Позиция, 1);
        Если СтрНайти(ЭталонЛатиница, Символ) > 0 Тогда
            Возврат Истина; // Нашли английскую букву
        КонецЕсли;
    КонецЦикла;
    Возврат Ложь;
КонецФункции

Этот метод очень нагляден и позволяет легко добавлять новые «запрещенные» или «разрешенные» символы без необходимости искать их коды в таблицах Unicode.

Особые случаи: Омографы (визуально похожие символы)

Проанализируем самую коварную ситуацию: символы-омографы. Это буквы, которые в разных алфавитах пишутся одинаково. Наиболее часто встречаются ошибки в следующих парах (Русский — Английский):

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

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

← На главную