Как получить полный путь к временному файлу в 1С для передачи в другую программу?

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

При разработке в 1С часто возникает задача: создать файл в системе, а затем передать его для обработки во внешнее приложение, например, в архиватор, программу для обработки PDF документов или конвертер файлов из CSV в XLS. Интуитивно кажется, что для этого нужно использовать временное хранилище, но это приводит к распространенной ошибке. Давайте разберемся, как правильно получить полный, реальный путь к временному файлу и почему функция ПоместитьВоВременноеХранилище здесь не поможет.

Проанализируем типичную ситуацию: у нас есть некие двоичные данные (полученные, к примеру, через модуль конвертации JSON/XML/CSV), которые нужно сохранить во временный файл и передать путь к этому файлу в архиватор 7-Zip через системную команду. Попытка решить это через временное хранилище обречена на провал, и сейчас мы выясним причину.

Почему «ПоместитьВоВременноеХранилище» не подходит для этой задачи?

Основное заблуждение связано с непониманием назначения функции ПоместитьВоВременноеХранилище. Этот механизм был создан в платформе 1С для решения одной конкретной задачи: эффективного обмена двоичными данными между сервером и клиентом в рамках одного сеанса.

Когда вы вызываете эту функцию, происходит следующее:

  1. Платформа 1С берет ваши данные (например, двоичные данные файла).
  2. Сохраняет их во временный файл в служебном каталоге на сервере. Расположение этого каталога является внутренней деталью платформы и может меняться.
  3. Функция возвращает не путь к файлу в формате операционной системы (типа C:\Users\...), а специальный внутренний адрес. Этот адрес выглядит примерно так: e1cib/tempstorage/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.

Ключевой момент: этот адрес понятен только самой платформе 1С. Вы не можете передать его внешней программе, потому что для операционной системы эта строка не является путем к файлу. Попытки "угадать" реальный путь, заменяя часть строки e1cib/tempstorage/ на предполагаемый системный путь (вроде C:\Users\USR1CV8\AppData\Local\Temp\), — это очень плохая и ненадежная практика. В кластерном режиме сервера файл и вовсе может оказаться на другой машине, делая такой подход абсолютно неработоспособным.

Итак, запомним: ПоместитьВоВременноеХранилище — это внутренний инструмент для обмена данными между контекстами выполнения 1С (клиент-сервер), а не для взаимодействия с файловой системой и внешними приложениями.

Правильное решение: используем «ПолучитьИмяВременногоФайла»

Для нашей задачи существует простой и надежный способ, который и предназначен для таких операций. Он заключается в использовании функции ПолучитьИмяВременногоФайла(). Разберем правильный алгоритм по шагам.

  1. Получаем уникальное имя и путь.

    Вызываем функцию ПолучитьИмяВременногоФайла(). В качестве необязательного параметра можно передать расширение файла. Функция сгенерирует уникальное имя файла в системном временном каталоге и вернет полный, абсолютный путь к нему. Важно: на этом этапе сам файл еще не создан, мы просто зарезервировали для него имя и место.

    
    // Получаем путь для будущего файла с расширением zip
    ПолныйПутьКФайлу = ПолучитьИмяВременногоФайла("zip");
    // Переменная ПолныйПутьКФайлу теперь содержит что-то вроде:
    // "C:\Users\ИмяПользователя\AppData\Local\Temp\v8_4A2B_2c.zip"
    
  2. Формируем данные и записываем файл.

    Теперь, когда у нас есть путь, мы можем создать файл, записав в него данные. Изучив современные методы работы с двоичными данными в 1С 8.3, мы знаем, что проще всего использовать метод Записать(). К слову, такие операции часто лежат в основе разработки собственных инструментов для запаковки файлов средствами языка 1С.

    
    // Предположим, что ДвоичныеДанные у нас уже есть
    ДвоичныеДанные.Записать(ПолныйПутьКФайлу);
    

    После выполнения этой строки файл физически появится на диске по указанному пути.

  3. Передаем путь во внешнюю программу.

    Теперь у нас есть все необходимое. Мы можем использовать переменную ПолныйПутьКФайлу для формирования командной строки, выбрав оптимальный способ запуска внешних приложений через ЗапуститьПриложение или КомандаСистемы. Если же ваша цель — сжатие строк или данных внутренними методами, использование внешних программ может и не потребоваться.

    
    // Формируем строку для вызова архиватора 7-Zip
    // Обратите внимание на кавычки, чтобы пути с пробелами обрабатывались корректно
    КоманднаяСтрока = """C:\Program Files\7-Zip\7z.exe"" a """ + ПолныйПутьКФайлу + """";
    
    // Выполняем команду
    КомандаСистемы(КоманднаяСтрока);
    
  4. (Рекомендуется) Удаляем временный файл.

    Чтобы не засорять диск, важно внедрить правильные стратегии очистки временных файлов 1С и удалять их сразу после того, как они больше не нужны. Для этого используем процедуру УдалитьФайлы().

    
    УдалитьФайлы(ПолныйПутьКФайлу);
    

Полный пример кода

Давайте соберем все шаги в единую серверную процедуру, которая формирует текстовый файл, использует приемы автоматизации 7-Zip в 1С для его архивации и очищает временные данные.


&НаСервере
Процедура СоздатьИЗаархивироватьФайлНаСервере()
    
    // 1. Подготовим данные для записи в файл
    ТекстДляФайла = "Это тестовая строка для записи во временный файл.";
    ДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки(ТекстДляФайла, КодировкаТекста.UTF8);
    
    // 2. Получим полный путь для нового временного файла
    ПолныйПутьКВременномуФайлу = "";
    Попытка
        ПолныйПутьКВременномуФайлу = ПолучитьИмяВременногоФайла("txt");
    Исключение
        Сообщить("Не удалось получить имя временного файла: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    Попытка
        // 3. Запишем данные в файл по полученному пути
        ДвоичныеДанные.Записать(ПолныйПутьКВременномуФайлу);
        
        // 4. Сформируем команду для вызова архиватора
        // Рекомендуется выносить пути в константы или настройки
        ПутьКАрхиватору = """C:\Program Files\7-Zip\7z.exe"""; 
        ПутьКНовомуАрхиву = """" + КаталогВременныхФайлов() + "my_archive.zip""";
        ПутьКИсходномуФайлу = """" + ПолныйПутьКВременномуФайлу + """";
        
        // Команда 'a' - добавить файлы в архив.
        КоманднаяСтрока = СтрШаблон("%1 a -y %2 %3",
            ПутьКАрхиватору,
            ПутьКНовомуАрхиву,
            ПутьКИсходномуФайлу);
            
        // 5. Выполним системную команду
        КодВозврата = 0;
        ВыводКоманды = "";
        ЗапуститьПриложение(КоманднаяСтрока, "", Истина, КодВозврата);
        
        Если КодВозврата = 0 Тогда
            Сообщить("Архив успешно создан: " + СтрЗаменить(ПутьКНовомуАрхиву, """", ""));
        Иначе
            Сообщить("Ошибка при создании архива. Код возврата: " + КодВозврата);
        КонецЕсли;
        
    Исключение
        // Обработаем возможные ошибки при работе с файлами или вызове команды
        ИнформацияОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
        Сообщить("Произошла ошибка: " + ИнформацияОбОшибке);
    КонецПопытки;
    
    // 6. Очистка: удалим временный файл после использования
    Если ЗначениеЗаполнено(ПолныйПутьКВременномуФайлу) Тогда
        УдалитьФайлы(ПолныйПутьКВременномуФайлу);
    КонецЕсли;
    
КонецПроцедуры

Дополнительные рекомендации и нюансы

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

← На главную