К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как указать путь сохранения файла в 1С

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

Путь сохранения файла в 1С задаётся двумя принципиально разными способами: интерактивно — когда пользователь сам выбирает папку через диалог, и программно — когда путь формируется в коде встроенного языка. Выбор способа зависит от задачи: разовая выгрузка отчёта обычно делается через диалог, а регламентный обмен данными — через жёстко заданный или настраиваемый каталог.

Важно понимать, где физически выполняется код. В файловой базе путь вида C:\Отчёты\ указывает на диск компьютера пользователя. В клиент-серверном варианте код, выполняемый на сервере, видит диски сервера, а не клиентской машины — это самая частая причина «пропавших» файлов. Поэтому перед выбором пути нужно определить контекст исполнения: тонкий клиент, толстый клиент, веб-клиент или сервер.

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

Интерактивный выбор пути через диалог сохранения

Самый безопасный способ — дать пользователю стандартное окно выбора файла. Для этого используется объект ДиалогВыбораФайла с режимом РежимДиалогаВыбораФайла.Сохранение. Пользователь сам указывает папку и имя, а программа получает готовую строку пути.

Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);

Диалог.Фильтр = "Файл выгрузки (.xml)|.xml";

Диалог.ИмяФайла = "Выгрузка.xml";

Если Диалог.Выбрать() Тогда

ПутьКФайлу = Диалог.ПолноеИмяФайла;

КонецЕсли;

В управляемых формах и тонком клиенте метод Выбрать() недоступен — там применяется асинхронный вариант Показать() с описанием оповещения. Это связано с тем, что тонкий и веб-клиенты не поддерживают модальные вызовы. Обработчик оповещения получит массив выбранных имён, из которого берётся первый элемент.

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

Порядок действий при интерактивном выборе
  1. 1
    Создайте объект ДиалогВыбораФайла с режимом Сохранение
  2. 2
    Задайте фильтр по расширению и имя файла по умолчанию
  3. 3
    Вызовите Показать() с оповещением для тонкого клиента или Выбрать() для толстого
  4. 4
    В обработчике получите ПолноеИмяФайла и передайте его в процедуру записи
  5. 5
    Проверьте, что файл фактически создан по указанному пути

Программное указание пути в коде

Когда путь известен заранее или формируется по правилам, диалог не нужен — путь собирается строкой. Текстовый файл записывается объектом ЗаписьТекста, двоичные данные — методом Записать() объекта ДвоичныеДанные, табличный документ — методом Записать() с указанием типа файла.

Текст = Новый ЗаписьТекста("C:\Обмен\result.txt", КодировкаТекста.UTF8);

Текст.ЗаписатьСтроку("Данные выгрузки");

Текст.Закрыть();

Для табличного документа, например печатной формы или отчёта, запись выглядит так: ТабДок.Записать("C:\Отчёты\Остатки.xlsx", ТипФайлаТабличногоДокумента.XLSX). Тип файла должен соответствовать расширению, иначе файл откроется с ошибкой или не откроется вовсе.

Имя файла удобно формировать динамически — с датой, номером документа или идентификатором, чтобы файлы не перезаписывали друг друга: ИмяФайла = Каталог + "\Выгрузка_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmmss") + ".xml". Помните, что в имени файла недопустимы символы \ / : * ? " < > | — дата в формате по умолчанию содержит двоеточия в части времени, поэтому её нужно форматировать явно.

bsl
Каталог = "C:\Обмен";
СоздатьКаталог(Каталог);
ИмяФайла = Каталог + "\Выгрузка_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmmss") + ".xml";
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(ИмяФайла);
Запись.ЗаписатьОбъявлениеXML();
Запись.Закрыть();

Сохранение файла в клиент-серверном варианте

Главное различие режимов работы — разделение контекстов. Директива &НаСервере означает, что код выполняется на сервере 1С, и путь C:\... будет указывать на диск сервера. Пользователь файл там не найдёт, а у учётной записи агента сервера может вообще не быть прав на запись в произвольную папку.

Типовой приём — двухступенчатая схема: сервер формирует файл во временном хранилище, а клиент забирает его и сохраняет локально. Данные помещаются во временное хранилище методом ПоместитьВоВременноеХранилище(), на клиенте извлекаются через ПолучитьИзВременногоХранилища() и записываются методом Записать() по пути, выбранному пользователем.

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

Настройка постоянного каталога сохранения

Для регулярных выгрузок путь лучше не зашивать в код, а хранить в настройках: в константе, в регистре сведений или в параметрах обмена данными. Тогда администратор меняет каталог без доработки конфигурации. В типовых конфигурациях каталоги обмена задаются в настройках узлов планов обмена или в параметрах обработок выгрузки.

Перед записью программа должна убедиться, что каталог существует. Функция СоздатьКаталог() создаёт папку, включая промежуточные уровни, и не вызывает ошибку, если каталог уже есть, — её безопасно вызывать перед каждой записью. Дополнительно полезно проверять доступность сетевого пути, если файл пишется на общий ресурс вида \\Server\Share\.

Для сетевых путей учитывайте, что службы и регламентные задания выполняются под служебными учётными записями, у которых нет доступа к сетевым дискам, подключённых у пользователя. Используйте UNC-пути и настраивайте права на уровне папки общего доступа для учётной записи службы.

Проверка результата и типичные ошибки

После записи убедитесь, что файл реально существует и не пустой. Объект Файл с методом Существует() и свойством Размер() даёт быструю проверку. Если размер равен нулю при успешном завершении кода — вероятно, данные не были сброшены из буфера: для ЗаписьТекста и ЗаписьXML обязателен вызов Закрыть(), иначе содержимое может не попасть на диск.

Классические ошибки при указании пути: одинарный обратный слэш в строке (в коде путь пишется с двойным \\ или с одинарным — 1С не требует экранирования, но в других языках при переносе кода это ломается), запись в защищённые каталоги вроде Program Files без прав администратора, отсутствие расширения в имени файла и попытка записи по пути, где промежуточная папка не существует.

Типичные ошибки
01
Запись на сервере по локальному пути клиента — файл создаётся на диске сервера, пользователь его не находит
02
Отсутствие вызова Закрыть() у ЗаписьТекста или ЗаписьXML — файл пустой или неполный
03
Двоеточия из времени в имени файла — ошибка создания файла, форматируйте дату явно
04
Жёстко зашитый путь без СоздатьКаталог() — сбой, если папку удалили или переименовали
05
Игнорирование расширения работы с файлами в веб-клиенте — сохранение молча не выполняется
Контрольные точки

Как проверить результат

Файл на диске
Норма

Файл существует по ожидаемому пути, размер больше нуля

Тревожный признак

Файла нет или размер 0 байт

Открытие файла
Норма

Файл открывается в целевой программе без ошибок

Тревожный признак

Ошибка формата или кодировки при открытии

Контекст выполнения
Норма

Файл появился на компьютере пользователя

Тревожный признак

Файл нашёлся только на диске сервера

Какой способ выбрать под задачу

Разовая выгрузка по кнопке — диалог сохранения на клиенте: пользователь сам контролирует, куда попадёт файл. Регламентный обмен по расписанию — программный путь из настроек с созданием каталога и записью журнала ошибок. Передача файла пользователю из серверной процедуры — временное хранилище плюс сохранение на клиенте.

Комбинированный вариант тоже рабочий: в настройках хранится каталог по умолчанию, диалог открывается уже в нём, а пользователь при желании меняет папку. Это снижает число кликов и не лишает гибкости.

Маршрут решения

Как выбрать действие

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

Самостоятельно без риска можно менять пути в настройках обменов и тестировать запись в отдельную папку. Доработку кода в рабочей базе делайте только на копии: ошибка в процедуре записи может перезаписать нужный файл или остановить регламентный обмен.

Итог

Что важно запомнить

Путь сохранения задаётся диалогом на клиенте или строкой в коде; в клиент-серверной базе сервер пишет на свои диски, поэтому файл передают клиенту через хранилище. Всегда создавайте каталог перед записью, закрывайте потоки записи и проверяйте результат по существованию и размеру файла.

Частые вопросы

Почему файл сохранился, но пользователь его не находит?

Чаще всего код выполнялся на сервере, и файл записался на диск сервера. Проверьте директиву компиляции процедуры и перенесите сохранение на клиента через временное хранилище или диалог выбора файла.

Как задать путь к сетевой папке?

Используйте UNC-путь вида \\Сервер\Ресурс\Папка. Учётная запись, под которой выполняется код (пользователь или служба агента сервера), должна иметь права записи на этот ресурс. Подключённые сетевые диски с буквами для служб недоступны.

Файл создаётся пустым — в чём причина?

Не вызван метод Закрыть() у ЗаписьТекста или ЗаписьXML: данные остались в буфере. Также проверьте, что в поток вообще что-то записывалось до закрытия.

Можно ли сохранять файл без диалога на компьютер пользователя?

Да, в толстом и тонком клиенте — прямой записью по локальному пути. В веб-клиенте потребуется подключённое расширение работы с файлами, иначе доступ к файловой системе заблокирован браузером.

Как избежать перезаписи одного и того же файла?

Добавляйте в имя отформатированную дату и время (без двоеточий), номер документа или уникальный идентификатор. Либо перед записью проверяйте существование файла объектом Файл и запрашивайте подтверждение.