В процессе работы с 1С часто возникает задача преобразования кириллических наименований в латинские. Например, нужно из названия номенклатуры "Сахар чёрный" получить строку "Sahar_Cherniy". Важно понимать, что речь идет не о переводе на английский язык ("Sugar black"), а именно о транслитерации — передаче букв одного алфавита буквами другого. Это может потребоваться для формирования имен файлов, создания человекопонятных URL для интернет-магазина, интеграции с другими системами или отправки SMS.
Рассмотрим два основных подхода к решению этой задачи в 1С: использование готовой функции из Библиотеки стандартных подсистем (БСП) и написание собственной, более гибкой функции.
Если ваша конфигурация 1С разработана на основе Библиотеки стандартных подсистем (а это большинство современных типовых решений), то в ней уже есть готовый инструмент для транслитерации. Это самый простой и рекомендуемый способ. Чтобы лучше изучить возможности библиотеки, рекомендуем заглянуть в Справочник по методам БСП (с примерами использования), который поможет быстро находить нужный программный код.
Для преобразования строки используется функция СтрокаЛатиницей() из общего модуля СтроковыеФункцииКлиентСервер (в некоторых версиях БСП может быть в модуле СтроковыеФункции).
Посмотрим на пример использования:
НаименованиеКириллицей = "Сахар чёрный";
НаименованиеЛатиницей = СтроковыеФункцииКлиентСервер.СтрокаЛатиницей(НаименованиеКириллицей);
// В результате переменная НаименованиеЛатиницей будет содержать "Sakhar_chernyy"
// (результат может незначительно отличаться в зависимости от версии БСП)
Сообщить(НаименованиеЛатиницей);
Преимущества этого метода:
Ограничения:
Этот способ идеально подходит, если стандартные правила транслитерации вас полностью устраивают и ваша конфигурация содержит БСП.
Если вам нужен полный контроль над процессом преобразования или ваша конфигурация не использует БСП, лучшим решением будет написать собственную функцию. Это дает максимальную гибкость: вы можете задать любые правила, обрабатывать специальные символы (например, заменять пробел на подчеркивание) и адаптировать логику под любые требования. Если в дальнейшем вам понадобится сопоставлять полученные строки, можно использовать улучшенный алгоритм Левенштейна для интеллектуального сравнения строк.
Наиболее эффективный способ реализации — через объект Соответствие. Разберем по шагам, как создать такую функцию.
Шаг 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
Таким образом, собственная функция дает полный контроль над результатом. Вы можете легко менять правила транслитерации и добавлять любую логику преобразования.