Разработка и Конфигурация · 10 мин
Как указать путь сохранения файла в 1С
Как указать путь сохранения файла в 1С: диалог выбора файла, запись на диск через код, работа с каталогами, типичные ошибки и проверка результата.
Путь сохранения файла в 1С задаётся двумя принципиально разными способами: интерактивно — когда пользователь сам выбирает папку через диалог, и программно — когда путь формируется в коде встроенного языка. Выбор способа зависит от задачи: разовая выгрузка отчёта обычно делается через диалог, а регламентный обмен данными — через жёстко заданный или настраиваемый каталог.
Важно понимать, где физически выполняется код. В файловой базе путь вида C:\Отчёты\ указывает на диск компьютера пользователя. В клиент-серверном варианте код, выполняемый на сервере, видит диски сервера, а не клиентской машины — это самая частая причина «пропавших» файлов. Поэтому перед выбором пути нужно определить контекст исполнения: тонкий клиент, толстый клиент, веб-клиент или сервер.
Ниже разобраны оба подхода с примерами кода, настройкой каталогов обмена, проверкой результата и разбором типичных ошибок, из-за которых файл не сохраняется или сохраняется не туда.
Интерактивный выбор пути через диалог сохранения
Самый безопасный способ — дать пользователю стандартное окно выбора файла. Для этого используется объект ДиалогВыбораФайла с режимом РежимДиалогаВыбораФайла.Сохранение. Пользователь сам указывает папку и имя, а программа получает готовую строку пути.
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Фильтр = "Файл выгрузки (.xml)|.xml";
Диалог.ИмяФайла = "Выгрузка.xml";
Если Диалог.Выбрать() Тогда
ПутьКФайлу = Диалог.ПолноеИмяФайла;
КонецЕсли;
В управляемых формах и тонком клиенте метод Выбрать() недоступен — там применяется асинхронный вариант Показать() с описанием оповещения. Это связано с тем, что тонкий и веб-клиенты не поддерживают модальные вызовы. Обработчик оповещения получит массив выбранных имён, из которого берётся первый элемент.
Свойство Каталог диалога позволяет задать стартовую папку, чтобы пользователь не начинал навигацию с системного каталога. Например, можно подставить каталог документов пользователя или папку, сохранённую в настройках после прошлого выбора.
- 1Создайте объект ДиалогВыбораФайла с режимом Сохранение
- 2Задайте фильтр по расширению и имя файла по умолчанию
- 3Вызовите Показать() с оповещением для тонкого клиента или Выбрать() для толстого
- 4В обработчике получите ПолноеИмяФайла и передайте его в процедуру записи
- 5Проверьте, что файл фактически создан по указанному пути
Программное указание пути в коде
Когда путь известен заранее или формируется по правилам, диалог не нужен — путь собирается строкой. Текстовый файл записывается объектом ЗаписьТекста, двоичные данные — методом Записать() объекта ДвоичныеДанные, табличный документ — методом Записать() с указанием типа файла.
Текст = Новый ЗаписьТекста("C:\Обмен\result.txt", КодировкаТекста.UTF8);
Текст.ЗаписатьСтроку("Данные выгрузки");
Текст.Закрыть();
Для табличного документа, например печатной формы или отчёта, запись выглядит так: ТабДок.Записать("C:\Отчёты\Остатки.xlsx", ТипФайлаТабличногоДокумента.XLSX). Тип файла должен соответствовать расширению, иначе файл откроется с ошибкой или не откроется вовсе.
Имя файла удобно формировать динамически — с датой, номером документа или идентификатором, чтобы файлы не перезаписывали друг друга: ИмяФайла = Каталог + "\Выгрузка_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmmss") + ".xml". Помните, что в имени файла недопустимы символы \ / : * ? " < > | — дата в формате по умолчанию содержит двоеточия в части времени, поэтому её нужно форматировать явно.
Каталог = "C:\Обмен";
СоздатьКаталог(Каталог);
ИмяФайла = Каталог + "\Выгрузка_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmmss") + ".xml";
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(ИмяФайла);
Запись.ЗаписатьОбъявлениеXML();
Запись.Закрыть();Сохранение файла в клиент-серверном варианте
Главное различие режимов работы — разделение контекстов. Директива &НаСервере означает, что код выполняется на сервере 1С, и путь C:\... будет указывать на диск сервера. Пользователь файл там не найдёт, а у учётной записи агента сервера может вообще не быть прав на запись в произвольную папку.
Типовой приём — двухступенчатая схема: сервер формирует файл во временном хранилище, а клиент забирает его и сохраняет локально. Данные помещаются во временное хранилище методом ПоместитьВоВременноеХранилище(), на клиенте извлекаются через ПолучитьИзВременногоХранилища() и записываются методом Записать() по пути, выбранному пользователем.
Альтернатива — методы НачатьПолучениеФайлаССервера() и НачатьПомещениеФайлаНаСервер(), которые передают файл целиком между контекстами. В веб-клиенте для работы с файловой системой дополнительно требуется расширение работы с файлами — без него запись на локальный диск невозможна, и метод НачатьПодключениеРасширенияРаботыСФайлами() нужно вызывать заранее.
Настройка постоянного каталога сохранения
Для регулярных выгрузок путь лучше не зашивать в код, а хранить в настройках: в константе, в регистре сведений или в параметрах обмена данными. Тогда администратор меняет каталог без доработки конфигурации. В типовых конфигурациях каталоги обмена задаются в настройках узлов планов обмена или в параметрах обработок выгрузки.
Перед записью программа должна убедиться, что каталог существует. Функция СоздатьКаталог() создаёт папку, включая промежуточные уровни, и не вызывает ошибку, если каталог уже есть, — её безопасно вызывать перед каждой записью. Дополнительно полезно проверять доступность сетевого пути, если файл пишется на общий ресурс вида \\Server\Share\.
Для сетевых путей учитывайте, что службы и регламентные задания выполняются под служебными учётными записями, у которых нет доступа к сетевым дискам, подключённых у пользователя. Используйте UNC-пути и настраивайте права на уровне папки общего доступа для учётной записи службы.
Проверка результата и типичные ошибки
После записи убедитесь, что файл реально существует и не пустой. Объект Файл с методом Существует() и свойством Размер() даёт быструю проверку. Если размер равен нулю при успешном завершении кода — вероятно, данные не были сброшены из буфера: для ЗаписьТекста и ЗаписьXML обязателен вызов Закрыть(), иначе содержимое может не попасть на диск.
Классические ошибки при указании пути: одинарный обратный слэш в строке (в коде путь пишется с двойным \\ или с одинарным — 1С не требует экранирования, но в других языках при переносе кода это ломается), запись в защищённые каталоги вроде Program Files без прав администратора, отсутствие расширения в имени файла и попытка записи по пути, где промежуточная папка не существует.
Как проверить результат
Файл существует по ожидаемому пути, размер больше нуля
Файла нет или размер 0 байт
Файл открывается в целевой программе без ошибок
Ошибка формата или кодировки при открытии
Файл появился на компьютере пользователя
Файл нашёлся только на диске сервера
Какой способ выбрать под задачу
Разовая выгрузка по кнопке — диалог сохранения на клиенте: пользователь сам контролирует, куда попадёт файл. Регламентный обмен по расписанию — программный путь из настроек с созданием каталога и записью журнала ошибок. Передача файла пользователю из серверной процедуры — временное хранилище плюс сохранение на клиенте.
Комбинированный вариант тоже рабочий: в настройках хранится каталог по умолчанию, диалог открывается уже в нём, а пользователь при желании меняет папку. Это снижает число кликов и не лишает гибкости.
Как выбрать действие
Самостоятельно без риска можно менять пути в настройках обменов и тестировать запись в отдельную папку. Доработку кода в рабочей базе делайте только на копии: ошибка в процедуре записи может перезаписать нужный файл или остановить регламентный обмен.
Что важно запомнить
Путь сохранения задаётся диалогом на клиенте или строкой в коде; в клиент-серверной базе сервер пишет на свои диски, поэтому файл передают клиенту через хранилище. Всегда создавайте каталог перед записью, закрывайте потоки записи и проверяйте результат по существованию и размеру файла.
Частые вопросы
Почему файл сохранился, но пользователь его не находит?
Чаще всего код выполнялся на сервере, и файл записался на диск сервера. Проверьте директиву компиляции процедуры и перенесите сохранение на клиента через временное хранилище или диалог выбора файла.
Как задать путь к сетевой папке?
Используйте UNC-путь вида \\Сервер\Ресурс\Папка. Учётная запись, под которой выполняется код (пользователь или служба агента сервера), должна иметь права записи на этот ресурс. Подключённые сетевые диски с буквами для служб недоступны.
Файл создаётся пустым — в чём причина?
Не вызван метод Закрыть() у ЗаписьТекста или ЗаписьXML: данные остались в буфере. Также проверьте, что в поток вообще что-то записывалось до закрытия.
Можно ли сохранять файл без диалога на компьютер пользователя?
Да, в толстом и тонком клиенте — прямой записью по локальному пути. В веб-клиенте потребуется подключённое расширение работы с файлами, иначе доступ к файловой системе заблокирован браузером.
Как избежать перезаписи одного и того же файла?
Добавляйте в имя отформатированную дату и время (без двоеточий), номер документа или уникальный идентификатор. Либо перед записью проверяйте существование файла объектом Файл и запрашивайте подтверждение.