Разработка и Конфигурация · 11 мин
Как в 1С выбрать файл: диалоги, код и проверка результата
Как в 1С выбрать файл: диалог выбора файла в управляемых формах, примеры кода НачатьПомещениеФайла и ДиалогВыбораФайла, фильтры, проверка результата и типовые ошибки.
Выбор файла — одна из самых частых задач в 1С: загрузка прайса, прикрепление скана документа, импорт данных из Excel или выгрузка отчёта на диск. В зависимости от того, работаете вы в толстом клиенте, тонком клиенте или через веб-браузер, технические способы отличаются, и именно это чаще всего вызывает вопросы у пользователей и начинающих разработчиков.
В типовых конфигурациях выбор файла обычно уже встроен в кнопки «Загрузить», «Прикрепить», «Заполнить из файла» — достаточно нажать кнопку и указать файл в открывшемся окне. Но если вы дорабатываете конфигурацию или пишете внешнюю обработку, диалог выбора файла нужно вызвать программно, причём по-разному для управляемых и обычных форм.
Ниже разобраны оба сценария: работа пользователя в готовых типовых механизмах и программный вызов диалога с примерами кода, фильтрами по расширению, проверкой результата и обработкой отказа пользователя.
Как пользователю выбрать файл в типовой конфигурации
В типовых решениях (1С:Бухгалтерия, 1С:Управление торговлей, ЗУП) выбор файла спрятан за стандартными командами. Для прикрепления файла к объекту откройте карточку документа или элемента справочника, найдите кнопку со скрепкой или ссылку «Присоединенные файлы» и нажмите «Добавить» — откроется системный диалог выбора файла операционной системы.
Для загрузки данных (прайсов, банковских выписок, номенклатуры) используются специальные обработки. Например, загрузка номенклатуры из табличного документа обычно находится в разделе «Покупки» или «НСИ и администрирование». Внутри такой обработки есть поле «Файл» с кнопкой выбора — нажмите её, перейдите к нужной папке и дважды щёлкните по файлу.
Если кнопка загрузки не видна, проверьте права: в ряде конфигураций загрузка данных доступна только пользователям с ролью администратора или с правом интерактивного изменения объектов. Также убедитесь, что файл не открыт в другой программе — заблокированный Excel-файл иногда не удаётся прочитать.
Выбор файла программно в управляемых формах
В управляемых формах действует асинхронная модель: нельзя просто вызвать метод и получить результат в следующей строке кода. Вместо этого вы запускаете операцию и передаёте описание оповещения — процедуру, которая выполнится, когда пользователь выберет файл или отменит диалог.
Основной метод для загрузки файла с клиента на сервер — НачатьПомещениеФайла. Он открывает диалог выбора, передаёт файл во временное хранилище и возвращает его адрес, который затем используется в серверной процедуре для чтения данных.
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораФайла(Результат, Адрес, ВыбранноеИмяФайла, ДопПараметры) Экспорт
Если Не Результат Тогда
Возврат; // пользователь нажал «Отмена»
КонецЕсли;
ОбработатьФайлНаСервере(Адрес, ВыбранноеИмяФайла);
КонецПроцедурыЧетвёртый параметр Истина означает интерактивный режим — именно он открывает диалог выбора. Если передать Ложь, метод попытается поместить файл по пути, указанному вторым параметром, без диалога. Адрес во временном хранилище действует, пока живёт форма или до явного удаления, поэтому обработку файла лучше выполнять сразу.
Диалог выбора файла с фильтрами и настройками
Когда нужен полный контроль над диалогом — фильтр по расширениям, заголовок окна, множественный выбор, выбор каталога вместо файла — используется объект ДиалогВыбораФайла. Он работает и в обычных, и в управляемых формах, но в управляемых вызывается асинхронно через метод Показать.
&НаКлиенте
Процедура ВыбратьФайл(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "Таблицы Excel (<em>.xlsx)|</em>.xlsx|Все файлы (<em>.</em>)|<em>.</em>";
Диалог.Заголовок = "Выберите файл для загрузки";
Диалог.МножественныйВыбор = Ложь;
Оповещение = Новый ОписаниеОповещения("ПослеВыбора", ЭтотОбъект);
Диалог.Показать(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбора(ВыбранныеФайлы, ДопПараметры) Экспорт
Если ВыбранныеФайлы = Неопределено Тогда
Возврат;
КонецЕсли;
ПутьКФайлу = ВыбранныеФайлы[0];
КонецПроцедурыРежим диалога определяет, что именно выбирает пользователь. Режим Открытие подходит для загрузки, Сохранение — для выгрузки данных в файл, ВыборКаталога — когда нужна папка целиком, например для пакетной обработки всех файлов в ней.
Сравнение вариантов
Когда нужно загрузить файл на сервер и сразу обработать. Сам открывает диалог и возвращает адрес во временном хранилище. Не подходит для выбора папки.
Когда нужны фильтры, множественный выбор, выбор каталога или сохранение файла. Возвращает только путь — чтение и передачу на сервер делаете отдельно.
Когда файл уже есть на сервере и его нужно передать пользователю с сохранением на диск. Используется для выгрузок.
Выбор файла в обычных формах и толстом клиенте
В старых конфигурациях на обычных формах (Управление торговлей 10.3, УПП 1.3) допустим синхронный вызов: метод Выбрать() объекта ДиалогВыбораФайла возвращает Истина, если пользователь выбрал файл, и Ложь при отмене. Код заметно короче, потому что не требует разбиения на процедуры-обработчики.
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "Файлы данных (<em>.csv)|</em>.csv";
Если Диалог.Выбрать() Тогда
ПутьКФайлу = Диалог.ПолноеИмяФайла;
Иначе
Возврат;
КонецЕсли;Такой код работает только в толстом клиенте обычного приложения. Если конфигурация в перспективе переедет в тонкий клиент или веб, сразу пишите асинхронный вариант — потом не придётся переписывать обработчики.
Особенности веб-клиента и расширения работы с файлами
В веб-клиенте браузер ограничивает доступ к файловой системе, поэтому платформа 1С использует расширение работы с файлами — компонент, который устанавливается в браузер. Без него многие файловые операции недоступны, и диалог выбора может не открыться.
При первом обращении к файловой операции платформа предложит установить расширение. Программно проверить и подключить его можно методом НачатьПодключениеРасширенияРаботыСФайлами. Если пользователь отказался от установки, предусмотрите альтернативу — например, загрузку через НачатьПомещениеФайла, который в веб-клиенте работает через стандартный механизм браузера и не требует расширения.
Проверка результата и обработка ошибок
Отмена диалога — нормальная ситуация, а не ошибка. Пользователь может передумать, выбрать не тот файл или случайно нажать кнопку. Код обязан корректно обрабатывать отказ: в асинхронной модели это признак Результат = Ложь или ВыбранныеФайлы = Неопределено, в синхронной — возврат Ложь из метода Выбрать().
После выбора стоит проверить сам файл: существует ли он по указанному пути, доступен ли для чтения, имеет ли ожидаемое расширение и ненулевой размер. Для этого служит объект Файл с методом Существует(). Попытка прочитать несуществующий или занятый файл вызовет исключение, которое лучше перехватить и показать пользователю понятное сообщение.
Как проверить результат
Результат = Истина или массив выбранных файлов не Неопределено
Результат = Ложь или Неопределено — пользователь отменил выбор, обработку продолжать нельзя
Файл.Существует() возвращает Истина, файл открывается на чтение
Ошибка доступа — файл занят другой программой или нет прав на папку
Расширение соответствует фильтру обработки (например, .xlsx)
Пользователь выбрал файл другого типа — предупредите и прервите загрузку
Типичные ошибки при реализации выбора файла
Большинство проблем при выборе файла связано не с самим диалогом, а с особенностями клиент-серверной архитектуры 1С. Путь к файлу, полученный на клиенте, бессмыслен на сервере — сервер не видит диски пользователя. Поэтому содержимое файла сначала помещается во временное хранилище, а уже потом передаётся в серверную процедуру.
- 1Определите режим работы: управляемые формы — только асинхронные вызовы с описанием оповещения
- 2Выберите метод: НачатьПомещениеФайла для загрузки на сервер или ДиалогВыбораФайла для гибких настроек
- 3Настройте фильтр расширений и заголовок диалога
- 4В обработчике оповещения проверьте, что пользователь не отменил выбор
- 5Проверьте существование и доступность файла, затем передайте данные на сервер
- 6Протестируйте в тонком клиенте и, если используется, в веб-клиенте
Что важно запомнить
В типовых конфигурациях файл выбирается через кнопки «Загрузить» и «Прикрепить». В коде управляемых форм — только асинхронно: НачатьПомещениеФайла или ДиалогВыбораФайла с описанием оповещения. Всегда обрабатывайте отмену диалога, проверяйте файл перед чтением и помните, что сервер не видит диск клиента.
Частые вопросы
Почему диалог выбора файла не открывается в веб-клиенте?
Чаще всего не установлено расширение работы с файлами. Платформа должна предложить установить его при первом обращении к файловой операции. Если предложения не было, проверьте, не блокирует ли браузер всплывающие окна, и вызовите подключение расширения программно через НачатьПодключениеРасширенияРаботыСФайлами.
Как разрешить выбор сразу нескольких файлов?
Установите у объекта ДиалогВыбораФайла свойство МножественныйВыбор = Истина. В обработчик оповещения придёт массив путей — переберите его циклом и обработайте каждый файл отдельно. Учтите, что метод НачатьПомещениеФайла работает только с одним файлом; для нескольких есть НачатьПомещениеФайлов.
Можно ли выбрать файл на сервере, не показывая диалог пользователю?
Да, если путь известен заранее и файл лежит в доступной серверу папке. В серверной процедуре используйте объект Файл для проверки существования и ЧтениеТекста, ЧтениеXML или ДвоичныеДанные для чтения. Диалог при этом не нужен — он требуется только для интерактивного выбора на клиенте.
Как открыть диалог выбора папки, а не файла?
Создайте ДиалогВыбораФайла с режимом РежимДиалогаВыбораФайла.ВыборКаталога. После подтверждения выбранный путь будет в свойстве Каталог (или первым элементом массива в асинхронном обработчике). Это удобно для пакетной загрузки всех файлов из папки.
Почему файл выбирается, но на сервере не читается?
Потому что путь к файлу действителен только на компьютере пользователя. Сервер 1С физически не имеет доступа к диску клиента. Правильная схема: сначала НачатьПомещениеФайла передаёт содержимое во временное хранилище, затем серверная процедура получает данные по адресу хранилища через ПолучитьИзВременногоХранилища.
Что делать, если пользователю не хватает прав на кнопку загрузки?
Проверьте роли пользователя в настройках прав доступа: для загрузки данных обычно нужны права на добавление и изменение соответствующих объектов, а иногда — специальная роль вроде «Выполнение обмена данными». Назначать права должен администратор информационной базы.