Почему 1С не сохраняет файл с кавычками в названии и как это исправить?

Программист 1С v8.3 (Обычные формы)
← На главную

При работе с 1С часто возникает задача программного формирования и сохранения файлов, например, договоров в формате Word или Excel. Имена таким файлам обычно присваиваются на основе данных из системы: наименования контрагента, номера и даты документа. В этот момент можно столкнуться с неожиданной ошибкой: файл не сохраняется, а 1С не выдает внятного сообщения о причине. Рассмотрим типичную ситуацию: при попытке сохранить документ с именем, содержащим кавычки (например, название организации ООО "Ромашка"), операция завершается неудачей. Уберем кавычки — все работает. Разберемся, почему так происходит и как правильно решить эту проблему.

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


ПутьКФайлу2 = новаяпапка2 + "\" + НомеДог + " на " + НаименованиеПолное + " от " + датдог + " года.doc";
// ...
Word.SaveAs(ПутьКФайлу2, 0);

Если в переменной НаименованиеПолное содержится значение вида ЧТУП "ЧУППП", то итоговый путь к файлу будет выглядеть так: F:\Dog\2019\196 на ЧТУП "ЧУППП" от 2019 года.doc. Именно символ прямой двойной кавычки (") является источником проблемы.

Выясним причину: ограничения файловой системы Windows

Первое, что нужно понять: проблема кроется не в 1С и не в Microsoft Word. Ограничения накладывает сама операционная система Windows и ее файловые системы (NTFS, FAT). Исторически сложилось, что некоторые символы зарезервированы для системных нужд и не могут использоваться в именах файлов и папок.

Список запрещенных символов в именах файлов Windows:

  1. < (меньше)
  2. > (больше)
  3. : (двоеточие) - используется для обозначения диска (C:) и в альтернативных потоках данных.
  4. " (двойная кавычка) - используется для выделения путей с пробелами в командной строке.
  5. / (прямой слэш) - используется как разделитель в путях в Unix-подобных системах и web.
  6. \ (обратный слэш) - основной разделитель каталогов в путях Windows.
  7. | (вертикальная черта) - используется для перенаправления вывода команд (pipe).
  8. ? (вопросительный знак) - используется как маска для одного любого символа в поиске файлов.
  9. * (звездочка) - используется как маска для любой последовательности символов в поиске файлов.

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

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

Разберем варианты решения

Теперь, когда причина ясна, рассмотрим несколько способов решения этой задачи в 1С. Основная идея — "очистить" имя файла от недопустимых символов перед его сохранением.

Решение 1: Замена кавычек на разрешенные аналоги

Не все символы, выглядящие как кавычки, одинаковы. Запрещена только стандартная прямая двойная кавычка (", код символа 34). Однако существуют типографские кавычки, которые Windows считает обычными символами и разрешает использовать в именах файлов. Самые распространенные — это кавычки-«елочки».

В 1С их можно получить с помощью функции Символ():

Посмотрим на пример кода, который заменяет стандартные кавычки на «елочки» в наименовании:


// Исходное наименование с запрещенными кавычками
НаименованиеПолное = 'ЧТУП "ЧУППП"';

// Заменяем кавычки
БезопасноеНаименование = СтрЗаменить(НаименованиеПолное, """", Символ(171) + "ВнутренняяЧасть" + Символ(187));
// Примечание: для корректной замены открывающих и закрывающих кавычек может потребоваться более сложный алгоритм,
// но для простого случая можно заменить все кавычки на какой-то один допустимый символ, например, одинарную кавычку ' или `.
// Более простой и универсальный вариант:
БезопасноеНаименование = СтрЗаменить(НаименованиеПолное, """", "'"); // Замена на одинарную кавычку

// Или заменим на "елочки", предполагая, что первая кавычка - открывающая, вторая - закрывающая (упрощение)
БезопасноеНаименование = СтрЗаменить(НаименованиеПолное, """", Символ(171)); // Временно заменим все на открывающую
// Здесь нужен более умный парсинг, но для демонстрации принципа этого достаточно.
// Самый простой способ с "елочками" - просто заменить " на «.
БезопасноеНаименование = СтрЗаменить(НаименованиеПолное, """", Символ(171));

// Формируем путь к файлу с уже безопасным наименованием
ПутьКФайлу2 = новаяпапка2 + "\" + НомеДог + " на " + БезопасноеНаименование + " от " + датдог + " года.doc";
Word.SaveAs(ПутьКФайлу2, 0);

Преимущества этого способа: имя файла остается читаемым и максимально приближенным к оригиналу.

Недостатки: если в будущем эти файлы будут передаваться в другие системы (например, в Linux или через API), нестандартные символы могут вызвать проблемы с кодировкой. Кроме того, этот код решает проблему только с кавычками, оставляя другие запрещенные символы без внимания.

Решение 2: Создание универсальной функции для очистки имени файла

Это наиболее надежный и правильный подход с точки зрения программирования. Вместо того чтобы исправлять только одну проблему (кавычки), мы создадим функцию, которая будет удалять или заменять все потенциально опасные символы из строки, предназначенной для имени файла. Заменять их лучше всего на нейтральный символ, например, на подчеркивание _ или просто удалять.

Давайте напишем такую функцию на встроенном языке 1С.


// Функция для очистки строки от символов, запрещенных в именах файлов Windows.
//
// Параметры:
//  ИсходнаяСтрока - Строка - имя, которое нужно очистить.
//  СимволЗамены  - Строка - символ, на который будут заменены недопустимые символы.
//                        По умолчанию - пустая строка (удаление).
//
// Возвращаемое значение:
//  Строка - очищенная строка, безопасная для использования в имени файла.
//
Функция ПодготовитьИмяФайла(Знач ИсходнаяСтрока, Знач СимволЗамены = "")

    // Массив запрещенных символов
    ЗапрещенныеСимволы = Новый Массив;
    ЗапрещенныеСимволы.Добавить("<");
    ЗапрещенныеСимволы.Добавить(">");
    ЗапрещенныеСимволы.Добавить(":");
    ЗапрещенныеСимволы.Добавить(""""); // Двойная кавычка
    ЗапрещенныеСимволы.Добавить("/");
    ЗапрещенныеСимволы.Добавить("\");
    ЗапрещенныеСимволы.Добавить("|");
    ЗапрещенныеСимволы.Добавить("?");
    ЗапрещенныеСимволы.Добавить("*");

    ОчищеннаяСтрока = ИсходнаяСтрока;

    // В цикле заменяем каждый запрещенный символ на символ замены
    Для Каждого Символ Из ЗапрещенныеСимволы Цикл
        ОчищеннаяСтрока = СтрЗаменить(ОчищеннаяСтрока, Символ, СимволЗамены);
    КонецЦикла;

    Возврат ОчищеннаяСтрока;

КонецФункции

Теперь использовать эту функцию в нашем исходном коде становится очень просто и безопасно.


// Получаем исходное наименование
НаименованиеПолное = 'ООО "Компания /Вектор*Плюс?"';

// Очищаем его с помощью нашей универсальной функции, заменяя плохие символы на "_"
БезопасноеНаименование = ПодготовитьИмяФайла(НаименованиеПолное, "_"); 
// Результат: 'ООО _Компания _Вектор_Плюс__'

// Если мы хотим просто удалить символы, вызываем функцию без второго параметра:
// БезопасноеНаименование = ПодготовитьИмяФайла(НаименованиеПолное);
// Результат: 'ООО Компания ВекторПлюс'

// Формируем итоговый путь к файлу
ПутьКФайлу2 = новаяпапка2 + "\" + НомеДог + " на " + БезопасноеНаименование + " от " + датдог + " года.doc";
Word.SaveAs(ПутьКФайлу2, 0);

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

Итоги и рекомендации

Проблема сохранения файлов с кавычками в названии из 1С не является ошибкой платформы, а следствием ограничений файловой системы Windows. Хотя быстрая замена кавычек на типографские аналоги («») является рабочим вариантом, наиболее правильным и масштабируемым решением является создание универсальной функции для "очистки" имен файлов от всех недопустимых символов. Такой подход не только решает текущую задачу, но и предотвращает возможные ошибки в будущем при работе с другими данными, содержащими спецсимволы.

← На главную