Как в 1С программно изменить имя XML-файла с кириллицы на латиницу (транслитерация)?

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

При выгрузке данных в формат XML часто возникает необходимость привести имя файла к международному стандарту. Многие внешние системы, FTP-серверы или веб-сервисы могут некорректно обрабатывать кириллические символы в названиях файлов. В этой статье мы подробно разберем, как реализовать механизм транслитерации в 1С, чтобы ваш файл D:\Новая папка\файл.xml превратился в корректный D:\Новая папка\fayl.xml.

Зачем нужна транслитерация имен файлов?

Рассмотрим ситуацию: вы формируете файл выгрузки, и его имя генерируется на основе наименования номенклатуры или контрагента. Если в имени присутствуют русские буквы, пробелы или спецсимволы, это может привести к ошибкам доступа при передаче файла по сети. Поэтому лучшей практикой считается замена русских букв на их латинские аналоги (например, "щ" на "shch").

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

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

В составе этого модуля присутствует функция Транслитерировать(). Она автоматически заменяет все кириллические символы на латинские согласно правилам. Разберем пример кода:


ИсходноеИмя = "файл_выгрузки.xml";
ЛатинскоеИмя = СтроковыеФункцииКлиентСервер.Транслитерировать(ИсходноеИмя);
// Результат будет: "fayl_vygruzki.xml"

Это самый надежный и простой способ, так как он уже учитывает регистр букв и сложные сочетания символов.

Способ 2: Ручная реализация функции транслитерации

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

  1. Создаем таблицу соответствия, где ключом будет русская буква, а значением — латинская.
  2. Перебираем исходную строку посимвольно.
  3. Заменяем найденные буквы на аналоги из таблицы.

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


Функция ТранслитерироватьСтроку(Знач ИсходнаяСтрока) Экспорт
    Правила = Новый Соответствие;
    Правила.Вставить("а", "a");  Правила.Вставить("б", "b");  Правила.Вставить("в", "v");
    Правила.Вставить("г", "g");  Правила.Вставить("д", "d");  Правила.Вставить("е", "e");
    Правила.Вставить("ё", "yo"); Правила.Вставить("ж", "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);
        НижнийСимвол = НРег(Символ);
        Значение = Правила.Получить(НижнийСимвол);
        
        Если Значение <> Неопределено Тогда
            Результат = Результат + Значение;
        Иначе
            Результат = Результат + Символ;
        КонецЕсли;
    КонецЦикла;
    
    Возврат Результат;
КонецФункции

Важный нюанс: Работа с путями и расширениями

Разберем типичную ошибку начинающих разработчиков. Если вы примените функцию транслитерации ко всей строке пути (например, D:\Новая папка\файл.xml), то получите результат D:\Novaya papka\fayl.xml. Однако, если папка на диске по-прежнему называется "Новая папка", система не сможет сохранить файл, так как путь станет невалидным.

Правильный алгоритм действий при работе с объектом Файл:

  1. Используем объект Файл для разделения полного пути на части.
  2. Транслитерируем только ИмяБезРасширения.
  3. Собираем путь заново, сохраняя оригинальный каталог и расширение.

Рассмотрим пример кода, интегрированный в вашу задачу с XML:


ПолныйПутьКФайлу = "D:\Новая папка\файл.xml";
ОбъектФайл = Новый Файл(ПолныйПутьКФайлу);

// Выделяем части
Каталог = ОбъектФайл.Путь;
СтароеИмя = ОбъектФайл.ИмяБезРасширения;
Расширение = ОбъектФайл.Расширение;

// Транслитерируем только имя
НовоеИмя = ТранслитерироватьСтроку(СтароеИмя);

// Собираем новый путь
НовыйПолныйПуть = Каталог + НовоеИмя + Расширение;

// Теперь записываем XML
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(НовыйПолныйПуть);
Запись.ЗаписатьОбъявлениеXML();
// ... дальнейшая логика записи ...
Запись.Закрыть();

Очистка от недопустимых символов

Проанализируем ситуацию, когда в имени файла могут встретиться запрещенные символы Windows. При транслитерации полезно дополнительно очищать строку от кавычек, двоеточий и знаков косой черты. Для этого можно дополнить нашу функцию или использовать СтрЗаменить().

Список запрещенных символов: / \ : * ? " < > |. Их рекомендуется заменять на нижнее подчеркивание или просто удалять из строки перед созданием файла.

Вместе мы рассмотрели все этапы: от использования готовых функций БСП до ручной сборки пути. Теперь ваши выгрузки XML будут иметь профессиональный вид и корректно приниматься любыми внешними системами!

← На главную