При разработке механизмов выгрузки документов из 1С (например, печатных форм ТабличныйДокумент в формат PDF или Excel) программисты часто сталкиваются с ситуацией, когда название файла формируется на основе номера входящего документа. Проблема заключается в том, что контрагенты могут использовать в номерах символы, которые запрещены в операционной системе Windows, чаще всего это обратный слеш \ или прямой слеш /. Рассмотрим подробно, как обойти это ограничение и сохранить работоспособность программы.
Операционная система Windows накладывает жесткие ограничения на именование файлов. Символы \ / : * ? " < > | являются зарезервированными. В частности, символ \ воспринимается системой как разделитель пути к каталогу. Если мы попытаемся сохранить файл с именем "УПД\3345.pdf", система будет искать папку "УПД", и если ее не существует, вызовет ошибку доступа или отсутствия пути. Выясним, какие инструменты предоставляет платформа 1С для решения этой задачи.
Проанализируем наиболее правильный и современный подход, который используется в типовых конфигурациях (БП 3.0, УТ 11, ERP). В составе Библиотеки Стандартных Подсистем (БСП) есть готовые функции, которые автоматически «очищают» строку от всех символов, способных вызвать ошибку файловой системы. Рассмотрим применение функции в различных версиях БСП.
Для актуальных версий конфигураций на платформе 8.3 рекомендуется использовать метод общего модуля ОбщегоНазначенияКлиентСервер. Посмотрим на пример кода:
// Исходное имя файла с недопустимыми символами
ИмяФайла = "УПД\3345/5454 от 11.02.22.pdf";
// Очистка имени файла от запрещенных знаков
БезопасноеИмя = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ИмяФайла, "_");
// Результат: "УПД_3345_5454_от_11_02_22.pdf"
ТабДок.Записать("C:\Saves\" + БезопасноеИмя, ТипФайлаТабличногоДокумента.PDF);
В данном примере функция заменяет все подозрительные знаки на символ подчеркивания. Это позволяет сохранить читаемость названия и гарантирует успешную запись на диск. Если в вашей версии конфигурации данный метод отсутствует (например, старая БСП), можно встретить аналогичную функцию в модуле РаботаСФайлами.
Разберем ситуацию, когда разработка ведется в самописной конфигурации или старой системе, где БСП не подключена. В этом случае мы можем самостоятельно реализовать очистку строки. Проанализируем, какие именно символы нужно удалять в первую очередь.
Функция ОчиститьИмяФайла(Знач ИсходноеИмя) Экспорт
ЗапрещенныеСимволы = "\/:*?""<>|";
Результат = ИсходноеИмя;
Для Индекс = 1 По СтрДлина(ЗапрещенныеСимволы) Цикл
СимволДляЗамены = Сред(ЗапрещенныеСимволы, Индекс, 1);
Результат = СтрЗаменить(Результат, СимволДляЗамены, " ");
КонецЦикла;
Возврат СокрЛП(Результат);
КонецФункции
Использование пробела в качестве замены часто больше нравится пользователям (бухгалтерам), чем подчеркивание, так как визуально это сохраняет структуру номера документа. Однако стоит помнить, что двойные пробелы также лучше исключать для эстетики.
Рассмотрим более сложный, но иногда полезный подход. Если пользователь категорически хочет видеть слеши в названии, мы можем интерпретировать их как вложенные папки. То есть при сохранении файла "УПД\3345\Документ.pdf" программа создаст папку "УПД", внутри нее папку "3345", и уже туда положит сам файл.
Для реализации этого метода проанализируем алгоритм:
\.СоздатьКаталог() для каждой части пути.Важно: Этот метод может привести к проблеме MAX_PATH (ограничение длины пути в 260 символов), если вложенность папок станет слишком большой.
Проанализируем экзотический, но эффективный способ удовлетворить требования бухгалтера без нарушения правил Windows. В таблице символов Unicode существуют знаки, которые выглядят почти как обычные слеши, но имеют другие коды и не считаются системными разделителями. Например, «Full-width Reverse Solidus» (\).
Посмотрим, как это реализовать программно:
// Используем визуально похожий символ Unicode вместо системного обратного слеша
СимволСлешЮникод = Символ(65340);
ИмяФайла = СтрЗаменить(ИмяФайла, "\", СимволСлешЮникод);
// Теперь Windows позволит сохранить такой файл, и он будет выглядеть как "УПД\3345"
Внимание: У этого способа есть существенный минус — такой файл невозможно будет найти через стандартный поиск, если пользователь будет вводить обычный слеш с клавиатуры, так как для компьютера это разные символы.
В процессе автоматизации важно не только написать код, но и объяснить логику системы конечному пользователю. Рассмотрим основные аргументы для диалога с бухгалтерией:
\ зарезервирован для адресации папок.Для решения задачи сохранения файлов с проблемными символами в 1С наиболее надежным методом является использование встроенных функций БСП (Способ 1). Если же требуется сохранить визуальное сходство с исходным номером документа, рекомендуется использовать замену на пробелы или нижнее подчеркивание. Попытки обмануть операционную систему через создание подпапок или использование спецсимволов Unicode допустимы только в частных случаях, так как они усложняют дальнейший поиск и обработку файлов в архиве.