Как сохранять файлы MS Word и PDF из 1С без указания фиксированного пути к папке?

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

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

Проблема использования статических путей

Рассмотрим ситуацию, когда в коде прописано прямое обращение к локальному диску. Это ограничивает мобильность системы. Если у пользователя нет диска D или ограничены права на запись в корень диска, метод SaveAS вызовет исключение. Наша задача — сделать так, чтобы файл сохранялся либо в системную временную папку, либо в стандартный каталог пользователя (например, "Мои документы"), либо чтобы пользователь сам выбирал путь через диалоговое окно.

Решение 1: Использование временных файлов

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

Разберем пример кода, который формирует путь во временном хранилище ОС:


// Определяем расширение в зависимости от роли или условий
Расширение = ".docx";
Если РольДоступна("Администратор") Тогда
    Расширение = ".pdf";
КонецЕсли;

// Получаем уникальный путь во временной папке пользователя
ПутьКФайлу = ПолучитьИмяВременногоФайла(Расширение);

// Сохраняем документ MS Word
Если Расширение = ".pdf" Тогда
    MSWord.SaveAS(ПутьКФайлу, 17); // 17 — это формат PDF в объектной модели Word
Иначе
    MSWord.SaveAS(ПутьКФайлу, 16); // 16 — это формат DOCX
КонецЕсли;

// Открываем файл пользователю для просмотра
ЗапуститьПриложение(ПутьКФайлу);

Важный момент: При использовании этого метода файл сохраняется в дебрях папки AppData/Local/Temp. Пользователь увидит документ, и если он ему нужен на постоянной основе, он сам нажмет "Файл — Сохранить как" уже внутри самого Microsoft Word.

Решение 2: Сохранение в стандартный каталог "Мои документы"

Если специфика бизнес-процесса требует, чтобы файлы сохранялись в предсказуемое место, лучше всего использовать стандартную папку документов текущего пользователя. В платформе 1С для этого предусмотрен кроссплатформенный метод КаталогДокументов(). Он автоматически вернет правильный путь вне зависимости от того, работает пользователь под Windows, Linux или macOS.

Посмотрим на реализацию этого подхода:


ИмяФайла = "Отчет_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmm");
БазовыйПуть = КаталогДокументов();

// Объединяем путь каталога и имя файла
ПолныйПуть = БазовыйПуть + "\" + ИмяФайла + ".docx";

// Выполняем сохранение через COM-объект
Попытка
    MSWord.SaveAS(ПолныйПуть, 16);
    Сообщить("Файл успешно сохранен в папку Мои документы: " + ПолныйПуть);
Исключение
    Сообщить("Не удалось сохранить файл. Проверьте права доступа.");
КонецПопытки;

Решение 3: Интерактивный выбор пути пользователем

Выясним ситуацию, когда система должна спросить пользователя: "Куда именно вы хотите сохранить этот файл?". Для этого в 1С существует объект ДиалогВыбораФайла. Мы можем заранее настроить фильтры для PDF и Word, а также предложить имя файла по умолчанию.

Рассмотрим шаги реализации диалога в управляемом приложении:


Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Заголовок = "Выберите место для сохранения файла";
Диалог.ПолноеИмяФайла = "Новый_Документ";
Диалог.Фильтр = "Документ Word (*.docx)|*.docx|Файл PDF (*.pdf)|*.pdf";

// Ждем выбора пользователя (асинхронно или через ОписаниеОповещения)
// В упрощенном виде для толстого клиента:
Если Диалог.Выбрать() Тогда
    ВыбранныйПуть = Диалог.ПолноеИмяФайла;
    
    // Проверяем выбранное расширение и сохраняем
    Если Прав(ВыбранныйПуть, 3) = "pdf" Тогда
        MSWord.SaveAS(ВыбранныйПуть, 17);
    Иначе
        MSWord.SaveAS(ВыбранныйПуть, 16);
    КонецЕсли;
КонецЕсли;

Решение 4: Передача файла с сервера на клиент (для серверных баз)

В современных конфигурациях 1С (клиент-серверный вариант) работа с COM-объектами на стороне сервера может быть ограничена. В таком случае правильно будет сформировать файл на сервере (например, в каталоге временных файлов сервера), поместить его во временное хранилище и "отдать" на клиент через стандартное окно загрузки браузера или тонкого клиента.

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

  1. На сервере формируем файл и используем ПоместитьВоВременноеХранилище().
  2. На клиенте вызываем метод ПолучитьФайлССервераАсинх() (для платформы 8.3.18+) или НачатьПолучениеФайлаССервера().
  3. Пользователю открывается стандартное системное окно, где он может выбрать "Открыть" или "Сохранить".

Этот метод считается наиболее "красивым" и правильным с точки зрения архитектуры 1С, так как он не зависит от настроек конкретных папок на дисках и корректно работает в веб-клиенте.

Особенности форматов сохранения в MS Word

При использовании метода SaveAS через COM-соединение Word.Application, крайне важно соблюдать типы форматов (второй параметр метода):

Важно: Для сохранения в PDF на компьютере должен быть установлен Microsoft Office версии не ниже 2007 с соответствующим пакетом обновлений или любая современная версия (2010, 2013, 2016+).

Рекомендации по безопасности и очистке

Проанализируем ситуацию с накоплением мусора. Если мы часто используем временные файлы через ПолучитьИмяВременногоФайла(), стоит позаботиться об их удалении после завершения работы. Хотя операционная система со временем очищает временные папки, при работе с конфиденциальными данными (договоры, счета с печатями) лучше удалять их принудительно командой УдалитьФайлы(ПутьКФайлу) после того, как COM-объект Word будет закрыт командой MSWord.Quit().

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

← На главную