Разработка и Конфигурация · 11 мин
Как открыть путь к файлу в 1С
Как открыть путь к файлу в 1С: диалог выбора файла, работа с каталогами, запуск файла из кода на встроенном языке, типичные ошибки и готовые примеры.
Работа с файлами — одна из базовых задач в 1С: нужно загрузить прайс, выгрузить отчёт, открыть договор в PDF или сохранить печатную форму. При этом фраза «открыть путь к файлу» может означать разное: показать пользователю диалог выбора файла, получить путь к каталогу, открыть сам файл в программе по умолчанию или прочитать его содержимое из кода. Каждый сценарий решается своими средствами встроенного языка.
Важно сразу учитывать контекст исполнения. Код на клиенте имеет доступ к диску пользователя, код на сервере — только к файловой системе сервера 1С, а в веб-клиенте прямой доступ к локальным путям ограничен соображениями безопасности браузера. Ошибка в выборе контекста — самая частая причина того, что «путь открывается у разработчика, но не работает у пользователя».
Ниже разобраны основные способы: диалоги выбора файлов и каталогов, запуск файла через операционную систему, чтение пути программно, работа в тонком и веб-клиенте, а также типичные ошибки и способы их проверки.
Что понимать под «открытием пути» в 1С
Прежде чем писать код, определите задачу. В практике встречаются четыре типовых сценария: дать пользователю выбрать файл через стандартный диалог Windows; получить путь к каталогу (например, к папке выгрузки); открыть готовый файл в ассоциированной программе — Excel, Word, PDF-просмотрщике; прочитать содержимое файла внутри 1С для обработки данных.
Для первых двух задач служит объект ДиалогВыбораФайла, для третьей — методы запуска приложений, для четвёртой — объекты ЧтениеТекста, ЧтениеXML, ТекстовыйДокумент и другие. Смешивать их не нужно: диалог не открывает файл, а лишь возвращает путь, а запуск приложения не передаёт данные в 1С.
Как открыть диалог выбора файла и получить путь
Стандартный способ — объект ДиалогВыбораФайла. В режиме управляемого приложения диалог открывается асинхронно, через описание оповещения, потому что модальные вызовы в современных версиях платформы запрещены или нежелательны.
Типовой код для тонкого клиента выглядит так:
&НаКлиенте
Процедура ВыбратьФайл(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "Файлы Excel (.xlsx)|.xlsx|Все файлы (.)|.";
Диалог.Заголовок = "Выберите файл для загрузки";
Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект);
Диалог.Показать(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораФайла(ВыбранныеФайлы, ДопПараметры) Экспорт
Если ВыбранныеФайлы = Неопределено Тогда
Возврат; // пользователь нажал «Отмена»
КонецЕсли;
ПутьКФайлу = ВыбранныеФайлы[0];
Сообщить("Выбран файл: " + ПутьКФайлу);
КонецПроцедуры
Результат работы диалога — массив выбранных путей (даже при одиночном выборе это массив из одного элемента). Обязательно проверяйте результат на Неопределено: если пользователь нажал «Отмена», обращение к элементу массива вызовет ошибку.
- 1Создайте ДиалогВыбораФайла с нужным режимом: Открытие, Сохранение или ВыборКаталога
- 2Задайте фильтр по расширениям и заголовок окна
- 3Вызовите Показать() с описанием оповещения
- 4В обработчике проверьте результат на Неопределено
- 5Сохраните полученный путь в реквизит формы или переменную
Как получить путь к каталогу
Если нужен не файл, а папка — например, каталог для выгрузки отчётов, — используется тот же объект, но с режимом РежимДиалогаВыбораФайла.ВыборКаталога. После выбора путь доступен через свойство Диалог.Каталог или через массив выбранных файлов в оповещении.
Для служебных задач платформа предоставляет готовые функции получения системных путей: КаталогВременныхФайлов() возвращает папку временных файлов, КаталогПрограммы() — каталог исполняемых файлов платформы. Это удобно для промежуточного хранения: временный файл создаётся, обрабатывается и удаляется без следов в пользовательских папках.
ПутьКВременномуФайлу = КаталогВременныхФайлов() + "выгрузка_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_hhmmss") + ".xml";
Обратите внимание на разделитель пути. В Windows это обратный слэш, но платформа корректно обрабатывает и прямой. При склейке путей строками легко получить двойной разделитель или потерять его — надёжнее проверять окончание строки перед добавлением имени файла.
Как открыть файл из 1С в программе по умолчанию
Когда файл уже существует и его нужно показать пользователю — например, сформированный PDF или выгруженный Excel, — используется запуск через операционную систему. В асинхронной модели это метод НачатьЗапускПриложения():
&НаКлиенте
Процедура ОткрытьФайл(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеЗапускаПриложения", ЭтотОбъект);
НачатьЗапускПриложения(Оповещение, ПутьКФайлу);
КонецПроцедуры
Если в параметре передать путь к файлу с известным расширением, Windows откроет его в ассоциированной программе. В обычных формах и синхронном режиме доступен метод ЗапуститьПриложение(ПутьКФайлу) — он блокирует выполнение до завершения вызова, что в управляемом приложении не приветствуется.
Альтернатива для веб-клиента — метод ОткрытьФайл() глобального контекста или передача файла пользователю через ПолучитьФайл() из временного хранилища: браузер скачает файл, и пользователь откроет его самостоятельно.
Как открыть путь к файлу на сервере и в веб-клиенте
Ключевое ограничение клиент-серверной архитектуры: сервер 1С не видит диски пользователя. Путь C:\Документы\прайс.xlsx, выбранный на клиенте, для серверной процедуры бессмыслен. Поэтому файл сначала помещают во временное хранилище на клиенте, а на сервере извлекают и обрабатывают.
&НаКлиенте
Процедура Загрузить(Команда)
НачатьПомещениеФайла(Новый ОписаниеОповещения("ПослеПомещения", ЭтотОбъект), , ПутьКФайлу, Ложь, УникальныйИдентификатор);
КонецПроцедуры
&НаСервере
Процедура ОбработатьНаСервере(АдресХранилища)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
// далее обработка файла на сервере
КонецПроцедуры
В веб-клиенте прямой доступ к локальной файловой системе ограничен: диалоги выбора работают через механизмы браузера, а запуск приложений недоступен. Для веб-клиента типовая схема — помещение файла в хранилище на загрузку и ПолучитьФайл() на выгрузку.
Сравнение вариантов работы с путями
Подходит для интерактивного выбора пути пользователем. Не работает на сервере и в фоновых заданиях.
Открывает файл в программе ОС. Только на клиенте, требует осторожности с недоверенными файлами.
Универсальный способ передать файл между клиентом и сервером. Требует больше кода, но работает везде, включая веб-клиент.
Для чтения содержимого файла прямо в 1С. Путь должен быть доступен в том контексте, где исполняется код.
Типичные ошибки и их устранение
Первая и самая распространённая ошибка — обращение к пути клиента из серверной процедуры. Симптом: «Файл не найден» при том, что файл точно существует. Решение — передача через временное хранилище, как показано выше.
Вторая частая проблема — отсутствие проверки отмены диалога. Если пользователь закрыл окно выбора, массив путей равен Неопределено, и обращение к ВыбранныеФайлы[0] приводит к исключению. Третья группа ошибок связана с правами доступа: файл открыт другой программой, нет прав на сетевой каталог, антивирус блокирует запись. Такие ситуации стоит оборачивать в Попытка...Исключение с понятным сообщением пользователю.
Как проверить результат
После реализации механизма проверьте его в целевом окружении, а не только на компьютере разработчика. Минимальный набор проверок: выбор файла и отмена диалога, файл на локальном диске и на сетевом ресурсе, работа под пользователем без прав администратора, поведение в веб-клиенте, если он используется.
Полезно программно проверять существование файла перед операциями с ним:
Файл = Новый Файл(ПутьКФайлу);
Если Не Файл.Существует() Тогда
Сообщить("Файл не найден: " + ПутьКФайлу);
Возврат;
КонецЕсли;
Как проверить результат
Путь появляется в реквизите, файл открывается или обрабатывается
Пустой путь, ошибка при нажатии «Отмена»
Файл передан через хранилище и обработан
Ошибка «файл не найден» при существующем файле
Файл открывается в ассоциированном приложении
Ничего не происходит или ошибка запуска
Чтение и запись выполняются без исключений
Ошибки доступа, файл заблокирован другой программой
Часто задаваемые вопросы
Как открыть диалог выбора папки, а не файла?
Создайте ДиалогВыбораФайла с режимом РежимДиалогаВыбораФайла.ВыборКаталога и вызовите Показать() с описанием оповещения. Выбранный путь будет доступен в массиве результата или через свойство Каталог объекта диалога.
Почему код работает у меня, но не работает у пользователя?
Чаще всего дело в контексте исполнения или правах: путь существует на вашем компьютере, но не на компьютере пользователя, либо у пользователя нет прав на сетевой каталог. Также проверьте, не выполняется ли код на сервере, где клиентские пути недоступны.
Как открыть файл в Excel из 1С?
Если файл уже сохранён на диске, вызовите НачатьЗапускПриложения() с полным путём к файлу — Windows откроет его в программе, назначенной для расширения. Если нужно именно программное управление Excel, используется COM-объект Excel.Application, но это требует установленного Office и работает только в Windows-клиенте.
Можно ли открыть файл по сетевому пути вида \\server\share?
Да, UNC-пути поддерживаются. Убедитесь, что у пользователя, под которым выполняется код, есть доступ к сетевому ресурсу. Если код исполняется на сервере 1С, доступ нужен учётной записи службы сервера 1С, а не пользователю сеанса.
Как получить только имя файла или только каталог из полного пути?
Создайте объект Файл с полным путём и используйте его свойства: Имя — имя с расширением, ИмяБезРасширения, Расширение, Путь — каталог, в котором находится файл. Это надёжнее, чем разбирать строку вручную.
Работает ли выбор файла в веб-клиенте?
Да, но через механизмы браузера: диалог выбора открывает стандартное окно загрузки, а результат передаётся через помещение файла во временное хранилище. Прямой запуск приложений и доступ к произвольным локальным путям в веб-клиенте недоступны.
Что важно запомнить
ДиалогВыбораФайла возвращает путь, НачатьЗапускПриложения открывает файл в программе ОС, а передача между клиентом и сервером выполняется через временное хранилище. Всегда проверяйте отмену диалога, существование файла и контекст исполнения кода — это устраняет большинство ошибок.