При выгрузке данных в формат XML часто возникает необходимость привести имя файла к международному стандарту. Многие внешние системы, FTP-серверы или веб-сервисы могут некорректно обрабатывать кириллические символы в названиях файлов. В этой статье мы подробно разберем, как реализовать механизм транслитерации в 1С, чтобы ваш файл D:\Новая папка\файл.xml превратился в корректный D:\Новая папка\fayl.xml.
Рассмотрим ситуацию: вы формируете файл выгрузки, и его имя генерируется на основе наименования номенклатуры или контрагента. Если в имени присутствуют русские буквы, пробелы или спецсимволы, это может привести к ошибкам доступа при передаче файла по сети. Поэтому лучшей практикой считается замена русских букв на их латинские аналоги (например, "щ" на "shch").
Если ваша конфигурация построена на базе современных типовых решений (например, 1С:ERP, 1С:Управление торговлей 11 или 1С:Бухгалтерия 3.0), в ней уже есть готовый инструмент для решения нашей задачи. Проанализируем возможности общего модуля СтроковыеФункцииКлиентСервер.
В составе этого модуля присутствует функция Транслитерировать(). Она автоматически заменяет все кириллические символы на латинские согласно правилам. Разберем пример кода:
ИсходноеИмя = "файл_выгрузки.xml";
ЛатинскоеИмя = СтроковыеФункцииКлиентСервер.Транслитерировать(ИсходноеИмя);
// Результат будет: "fayl_vygruzki.xml"
Это самый надежный и простой способ, так как он уже учитывает регистр букв и сложные сочетания символов.
Выясним, как поступить, если ваша конфигурация не использует БСП или работает на старой платформе (например, 1С 7.7 или 8.1). В этом случае нам необходимо создать собственную функцию, используя объект Соответствие. Проанализируем алгоритм работы такой функции:
Посмотрим на пример реализации такой функции:
Функция ТранслитерироватьСтроку(Знач ИсходнаяСтрока) Экспорт
Правила = Новый Соответствие;
Правила.Вставить("а", "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. Однако, если папка на диске по-прежнему называется "Новая папка", система не сможет сохранить файл, так как путь станет невалидным.
Правильный алгоритм действий при работе с объектом Файл:
Файл для разделения полного пути на части.Рассмотрим пример кода, интегрированный в вашу задачу с XML:
ПолныйПутьКФайлу = "D:\Новая папка\файл.xml";
ОбъектФайл = Новый Файл(ПолныйПутьКФайлу);
// Выделяем части
Каталог = ОбъектФайл.Путь;
СтароеИмя = ОбъектФайл.ИмяБезРасширения;
Расширение = ОбъектФайл.Расширение;
// Транслитерируем только имя
НовоеИмя = ТранслитерироватьСтроку(СтароеИмя);
// Собираем новый путь
НовыйПолныйПуть = Каталог + НовоеИмя + Расширение;
// Теперь записываем XML
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(НовыйПолныйПуть);
Запись.ЗаписатьОбъявлениеXML();
// ... дальнейшая логика записи ...
Запись.Закрыть();
Проанализируем ситуацию, когда в имени файла могут встретиться запрещенные символы Windows. При транслитерации полезно дополнительно очищать строку от кавычек, двоеточий и знаков косой черты. Для этого можно дополнить нашу функцию или использовать СтрЗаменить().
Список запрещенных символов: / \ : * ? " < > |. Их рекомендуется заменять на нижнее подчеркивание или просто удалять из строки перед созданием файла.
Вместе мы рассмотрели все этапы: от использования готовых функций БСП до ручной сборки пути. Теперь ваши выгрузки XML будут иметь профессиональный вид и корректно приниматься любыми внешними системами!