Как в 1С программно преобразовать кириллицу в латиницу (транслит)?

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

В процессе работы с 1С часто возникает задача преобразования кириллических наименований в латинские. Например, нужно из названия номенклатуры "Сахар чёрный" получить строку "Sahar_Cherniy". Важно понимать, что речь идет не о переводе на английский язык ("Sugar black"), а именно о транслитерации — передаче букв одного алфавита буквами другого. Это может потребоваться для формирования имен файлов, создания человекопонятных URL для интернет-магазина, интеграции с другими системами или отправки SMS.

Рассмотрим два основных подхода к решению этой задачи в 1С: использование готовой функции из Библиотеки стандартных подсистем (БСП) и написание собственной, более гибкой функции.

Решение 1: Использование стандартной функции БСП

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

Для преобразования строки используется функция СтрокаЛатиницей() из общего модуля СтроковыеФункцииКлиентСервер (в некоторых версиях БСП может быть в модуле СтроковыеФункции).

Посмотрим на пример использования:


НаименованиеКириллицей = "Сахар чёрный";
НаименованиеЛатиницей = СтроковыеФункцииКлиентСервер.СтрокаЛатиницей(НаименованиеКириллицей);
// В результате переменная НаименованиеЛатиницей будет содержать "Sakhar_chernyy"
// (результат может незначительно отличаться в зависимости от версии БСП)
Сообщить(НаименованиеЛатиницей);

Преимущества этого метода:

  1. Простота и надежность: не нужно писать свой код, достаточно вызвать одну стандартную функцию.
  2. Стандартизация: решение поддерживается и обновляется фирмой "1С" вместе с БСП.

Ограничения:

  1. Фиксированные правила: вы не можете повлиять на правила транслитерации. Например, если вам нужно, чтобы "Ж" превращалось в "J", а не в "ZH", стандартная функция этого не позволит.
  2. Односторонняя конвертация: в БСП нет стандартной функции для обратного преобразования из латиницы в кириллицу.

Этот способ идеально подходит, если стандартные правила транслитерации вас полностью устраивают и ваша конфигурация содержит БСП.

Решение 2: Написание собственной функции транслитерации

Если вам нужен полный контроль над процессом преобразования или ваша конфигурация не использует БСП, лучшим решением будет написать собственную функцию. Это дает максимальную гибкость: вы можете задать любые правила, обрабатывать специальные символы (например, заменять пробел на подчеркивание) и адаптировать логику под любые требования. Если в дальнейшем вам понадобится сопоставлять полученные строки, можно использовать улучшенный алгоритм Левенштейна для интеллектуального сравнения строк.

Наиболее эффективный способ реализации — через объект Соответствие. Разберем по шагам, как создать такую функцию.

Шаг 1. Создание таблицы соответствия символов.

Сначала определим, какая кириллическая буква в какую латинскую будет превращаться. Для этого создадим и заполним объект Соответствие.

Шаг 2. Перебор исходной строки и замена символов.

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

Посмотрим на пример готовой функции:


Функция ПолучитьСтрокуНаЛатинском(ИсходныйТекст)
    СоответствиеСимволов = Новый Соответствие;
    СоответствиеСимволов.Вставить("А", "A");
    СоответствиеСимволов.Вставить("Б", "B");
    СоответствиеСимволов.Вставить("В", "V");
    СоответствиеСимволов.Вставить("Г", "G");
    СоответствиеСимволов.Вставить("Д", "D");
    СоответствиеСимволов.Вставить("Е", "E");
    СоответствиеСимволов.Вставить("Ё", "E");
    СоответствиеСимволов.Вставить("Ж", "ZH");
    СоответствиеСимволов.Вставить("З", "Z");
    СоответствиеСимволов.Вставить("И", "I");
    СоответствиеСимволов.Вставить("Й", "Y");
    СоответствиеСимволов.Вставить("К", "K");
    СоответствиеСимволов.Вставить("Л", "L");
    СоответствиеСимволов.Вставить("М", "M");
    СоответствиеСимволов.Вставить("Н", "N");
    СоответствиеСимволов.Вставить("О", "O");
    СоответствиеСимволов.Вставить("П", "P");
    СоответствиеСимволов.Вставить("Р", "R");
    СоответствиеСимволов.Вставить("С", "S");
    СоответствиеСимволов.Вставить("Т", "T");
    СоответствиеСимволов.Вставить("У", "U");
    СоответствиеСимволов.Вставить("Ф", "F");
    СоответствиеСимволов.Вставить("Х", "KH");
    СоответствиеСимволов.Вставить("Ц", "TS");
    СоответствиеСимволов.Вставить("Ч", "CH");
    СоответствиеСимволов.Вставить("Ш", "SH");
    СоответствиеСимволов.Вставить("Щ", "SHCH");
    СоответствиеСимволов.Вставить("Ъ", ""); // Твердый знак просто удаляем
    СоответствиеСимволов.Вставить("Ы", "Y");
    СоответствиеСимволов.Вставить("Ь", ""); // Мягкий знак просто удаляем
    СоответствиеСимволов.Вставить("Э", "E");
    СоответствиеСимволов.Вставить("Ю", "YU");
    СоответствиеСимволов.Вставить("Я", "YA");
    
    // Приводим исходный текст к верхнему регистру для универсальности поиска
    ИсходныйТекст = ВРег(ИсходныйТекст);
    
    ГотовоеЗначение = "";
    Для к = 1 По СтрДлина(ИсходныйТекст) Цикл
        ТекущийСимвол = Сред(ИсходныйТекст, к, 1);
        ТекущийГотовыйСимвол = СоответствиеСимволов.Получить(ТекущийСимвол);
        
        Если ТекущийГотовыйСимвол = Неопределено Тогда
            // Если символ не найден в таблице соответствия, добавляем его как есть
            ГотовоеЗначение = ГотовоеЗначение + ТекущийСимвол;
        Иначе
            // Иначе добавляем его латинский аналог
            ГотовоеЗначение = ГотовоеЗначение + ТекущийГотовыйСимвол;
        КонецЕсли;
    КонецЦикла;
    
    Возврат ГотовоеЗначение;
КонецФункции

// Пример вызова:
Сообщить(ПолучитьСтрокуНаЛатинском("Забарчук Юлия")); // Выведет: ZABARCHUK YULIYA
Сообщить(ПолучитьСтрокуНаЛатинском("Сахар чёрный"));  // Выведет: SAKHAR CHERNYY

Как доработать функцию под свои нужды?

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


// ... (начало функции с заполнением Соответствия) ...

ГотовоеЗначение = "";
Для к = 1 По СтрДлина(ИсходныйТекст) Цикл
    ТекущийСимвол = Сред(ИсходныйТекст, к, 1);
    
    // Особая обработка пробела
    Если ТекущийСимвол = " " Тогда
        ГотовоеЗначение = ГотовоеЗначение + "_";
        Продолжить; // Переходим к следующему символу
    КонецЕсли;
        
    ТекущийГотовыйСимвол = СоответствиеСимволов.Получить(ТекущийСимвол);
    
    Если ТекущийГотовыйСимвол = Неопределено Тогда
        // Проверяем, является ли символ латинской буквой или цифрой
        КодСимвола = КодСимвола(ТекущийСимвол);
        Если (КодСимвола >= 48 И КодСимвола <= 57) // Цифры 0-9
            ИЛИ (КодСимвола >= 65 И КодСимвола <= 90) Тогда // Латинские буквы A-Z
            ГотовоеЗначение = ГотовоеЗначение + ТекущийСимвол;
        КонецЕсли;
    Иначе
        ГотовоеЗначение = ГотовоеЗначение + ТекущийГотовыйСимвол;
    КонецЕсли;
КонецЦикла;

Возврат ГотовоеЗначение;
// ... (конец функции)

// Пример вызова доработанной функции:
Сообщить(ПолучитьСтрокуНаЛатинском("Сахар (чёрный), 500г.")); // Выведет: SAKHAR_CHERNYY_500G

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

← На главную