При разработке механизмов печати или выгрузки документов из 1С часто возникает проблема "жесткого кодирования" путей. Указание пути вроде D:\файлы\ в программном коде приводит к тому, что при переносе базы на другой компьютер, смене пользователя или работе в терминальном режиме программа выдает ошибку доступа. В этой статье мы подробно разберем, как сделать процесс сохранения гибким, чтобы программа сама определяла доступные места для записи или спрашивала об этом пользователя.
Рассмотрим ситуацию, когда в коде прописано прямое обращение к локальному диску. Это ограничивает мобильность системы. Если у пользователя нет диска D или ограничены права на запись в корень диска, метод SaveAS вызовет исключение. Наша задача — сделать так, чтобы файл сохранялся либо в системную временную папку, либо в стандартный каталог пользователя (например, "Мои документы"), либо чтобы пользователь сам выбирал путь через диалоговое окно.
Проанализируем самый простой и эффективный способ для тех случаев, когда файл нужно просто показать пользователю. Мы можем создать временный файл, путь к которому платформа 1С определит самостоятельно в зависимости от настроек операционной системы. Для этого используется функция ПолучитьИмяВременногоФайла().
Разберем пример кода, который формирует путь во временном хранилище ОС:
// Определяем расширение в зависимости от роли или условий
Расширение = ".docx";
Если РольДоступна("Администратор") Тогда
Расширение = ".pdf";
КонецЕсли;
// Получаем уникальный путь во временной папке пользователя
ПутьКФайлу = ПолучитьИмяВременногоФайла(Расширение);
// Сохраняем документ MS Word
Если Расширение = ".pdf" Тогда
MSWord.SaveAS(ПутьКФайлу, 17); // 17 — это формат PDF в объектной модели Word
Иначе
MSWord.SaveAS(ПутьКФайлу, 16); // 16 — это формат DOCX
КонецЕсли;
// Открываем файл пользователю для просмотра
ЗапуститьПриложение(ПутьКФайлу);
Важный момент: При использовании этого метода файл сохраняется в дебрях папки AppData/Local/Temp. Пользователь увидит документ, и если он ему нужен на постоянной основе, он сам нажмет "Файл — Сохранить как" уже внутри самого Microsoft Word.
Если специфика бизнес-процесса требует, чтобы файлы сохранялись в предсказуемое место, лучше всего использовать стандартную папку документов текущего пользователя. В платформе 1С для этого предусмотрен кроссплатформенный метод КаталогДокументов(). Он автоматически вернет правильный путь вне зависимости от того, работает пользователь под Windows, Linux или macOS.
Посмотрим на реализацию этого подхода:
ИмяФайла = "Отчет_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmm");
БазовыйПуть = КаталогДокументов();
// Объединяем путь каталога и имя файла
ПолныйПуть = БазовыйПуть + "\" + ИмяФайла + ".docx";
// Выполняем сохранение через COM-объект
Попытка
MSWord.SaveAS(ПолныйПуть, 16);
Сообщить("Файл успешно сохранен в папку Мои документы: " + ПолныйПуть);
Исключение
Сообщить("Не удалось сохранить файл. Проверьте права доступа.");
КонецПопытки;
Выясним ситуацию, когда система должна спросить пользователя: "Куда именно вы хотите сохранить этот файл?". Для этого в 1С существует объект ДиалогВыбораФайла. Мы можем заранее настроить фильтры для PDF и Word, а также предложить имя файла по умолчанию.
Рассмотрим шаги реализации диалога в управляемом приложении:
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Заголовок = "Выберите место для сохранения файла";
Диалог.ПолноеИмяФайла = "Новый_Документ";
Диалог.Фильтр = "Документ Word (*.docx)|*.docx|Файл PDF (*.pdf)|*.pdf";
// Ждем выбора пользователя (асинхронно или через ОписаниеОповещения)
// В упрощенном виде для толстого клиента:
Если Диалог.Выбрать() Тогда
ВыбранныйПуть = Диалог.ПолноеИмяФайла;
// Проверяем выбранное расширение и сохраняем
Если Прав(ВыбранныйПуть, 3) = "pdf" Тогда
MSWord.SaveAS(ВыбранныйПуть, 17);
Иначе
MSWord.SaveAS(ВыбранныйПуть, 16);
КонецЕсли;
КонецЕсли;
В современных конфигурациях 1С (клиент-серверный вариант) работа с COM-объектами на стороне сервера может быть ограничена. В таком случае правильно будет сформировать файл на сервере (например, в каталоге временных файлов сервера), поместить его во временное хранилище и "отдать" на клиент через стандартное окно загрузки браузера или тонкого клиента.
Проанализируем этот сценарий:
ПоместитьВоВременноеХранилище().ПолучитьФайлССервераАсинх() (для платформы 8.3.18+) или НачатьПолучениеФайлаССервера().Этот метод считается наиболее "красивым" и правильным с точки зрения архитектуры 1С, так как он не зависит от настроек конкретных папок на дисках и корректно работает в веб-клиенте.
При использовании метода SaveAS через COM-соединение Word.Application, крайне важно соблюдать типы форматов (второй параметр метода):
wdFormatXMLDocument (стандартный формат .docx для Word 2007 и выше).wdFormatPDF (сохранение в формат PDF).wdFormatDocument (старый формат .doc).Важно: Для сохранения в PDF на компьютере должен быть установлен Microsoft Office версии не ниже 2007 с соответствующим пакетом обновлений или любая современная версия (2010, 2013, 2016+).
Проанализируем ситуацию с накоплением мусора. Если мы часто используем временные файлы через ПолучитьИмяВременногоФайла(), стоит позаботиться об их удалении после завершения работы. Хотя операционная система со временем очищает временные папки, при работе с конфиденциальными данными (договоры, счета с печатями) лучше удалять их принудительно командой УдалитьФайлы(ПутьКФайлу) после того, как COM-объект Word будет закрыт командой MSWord.Quit().
Подводя итог, можно сказать: забудьте про конструкцию "D:\файлы\". Используйте КаталогДокументов() для сохранения важных данных или ПолучитьИмяВременногоФайла() для быстрого просмотра. Это обеспечит стабильную работу вашей обработки на любом компьютере и под любой учетной записью пользователя.