Выбор файла в 1С 8.3: от окна «Открыть» до кода на встроенном языке
Содержание
Пользователь выбирает файл в 1С через стандартное окно Windows: оно открывается по кнопке загрузки, по скрепке присоединённых файлов или через Ctrl+O. Разработчик вызывает то же окно объектом ДиалогВыбораФайла и методом Показать() или ВыбратьАсинх(), а потом передаёт файл на сервер через временное хранилище.
Сложности начинаются в деталях. Окно не открывается в веб-клиенте, код падает с ошибкой про модальность, сервер «не видит» путь C:\Users\.... Ниже по порядку: сначала для пользователя, затем для разработчика.
Как выбрать файл в 1С через окно выбора
Для пользователя 1С 8.3 выбор файла всегда выглядит одинаково: программа открывает системное окно, вы находите файл и нажимаете «Открыть». Отличается только то, откуда это окно вызывается.
Где в программе встречается выбор файла
| Задача | Откуда вызвать |
|---|---|
Открыть внешнюю обработку или отчёт (.epf, .erf) | Главное меню (кнопка с тремя полосками) → Файл → Открыть или Ctrl+O |
| Прикрепить скан к документу | Кнопка со скрепкой в форме документа → добавить файл с диска |
| Загрузить банковскую выписку в БП 3.0 | Банк и касса → Банковские выписки → Загрузить |
| Заполнить табличную часть из Excel | Команда загрузки в командной панели табличной части |
Загрузить выгрузку базы .dt | Конфигуратор → Администрирование → Загрузить информационную базу |
Пошагово
- Нажмите команду, которая запускает загрузку или открытие.
- В открывшемся окне перейдите в нужную папку через левую панель или адресную строку.
- Проверьте фильтр справа от поля «Имя файла». Если там стоит, например,
*.xlsx, файлы других типов не видны. - Выделите файл и нажмите «Открыть».
Если файл лежит в длинной сетевой папке, не листайте дерево. Скопируйте полный путь из проводника и вставьте его в поле «Имя файла» — окно сразу откроет файл.
Если окно выбора не появилось
В тонком клиенте окно почти всегда открывается сразу. В браузере (веб-клиент) 1С может сначала предложить установить расширение для работы с файлами. Без него программа откроет упрощённый браузерный выбор файла, где нельзя выбрать папку и иногда нельзя выбрать несколько файлов.
Расширение ставится один раз на компьютер и браузер. Согласитесь на установку, перезапустите браузер и повторите действие.
Клавиши, которые ускоряют выбор файла
Большая часть времени уходит не на сам выбор, а на поиск нужной папки. Здесь помогают стандартные клавиши Windows, которые работают и в окне, вызванном из 1С.
| Клавиши | Что делают |
|---|---|
Ctrl+O | В 1С: открыть файл (внешняя обработка, отчёт, табличный документ) |
F4 | В 1С: открыть выбор в поле с кнопкой «…» |
Alt+D или Ctrl+L | В окне Windows: перейти в адресную строку |
Alt+↑ | Подняться на папку выше |
Alt+← | Вернуться в предыдущую папку |
Ctrl+A | Выделить все файлы (если разрешён множественный выбор) |
Ctrl+щелчок, Shift+щелчок | Выделить несколько файлов вразнобой или подряд |
Ctrl+Shift+N | Создать папку (в окне сохранения) |
F5 | Обновить список, если файл только что скопировали |
Ещё один приём: в поле «Имя файла» можно ввести маску, например *выписка*, и нажать Enter. Окно оставит только подходящие файлы текущей папки.
Программный выбор файла: ДиалогВыбораФайла
В 1С 8.3 за окно выбора отвечает объект ДиалогВыбораФайла. Он работает только на клиенте. Режимов три:
- 📂
РежимДиалогаВыбораФайла.Открытие— выбрать существующий файл; - 💾
РежимДиалогаВыбораФайла.Сохранение— указать имя для записи; - 🗂
РежимДиалогаВыбораФайла.ВыборКаталога— выбрать папку.
Функций ВыбратьФайл и ПолучитьИмяФайла в глобальном контексте 8.3 нет. Если они встречаются в коде, это либо общие модули конкретной конфигурации, либо примеры из 7.7, где файл выбирали методом ФС.ВыбратьФайл.
Вариант с описанием оповещения
Синхронный метод Выбрать() открывает модальное окно. В конфигурациях, где модальность запрещена (а это все современные типовые), он вызывает ошибку. Поэтому окно показывают через Показать() с обработчиком.
&НаКлиенте
Процедура ВыбратьФайлВыписки(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите файл выписки";
Диалог.Фильтр = "Файлы обмена с банком (*.txt)|*.txt|Все файлы (*.*)|*.*";
Диалог.МножественныйВыбор = Ложь;
Диалог.ПроверятьСуществованиеФайла = Истина;
Оповещение = Новый ОписаниеОповещения("ВыборФайлаЗавершение", ЭтотОбъект);
Диалог.Показать(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ВыборФайлаЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы = Неопределено Тогда
Возврат; // пользователь нажал «Отмена»
КонецЕсли;
Объект.ПутьКФайлу = ВыбранныеФайлы[0];
КонецПроцедуры
Обработчик оповещения обязательно объявляется с Экспорт, иначе платформа его не вызовет. В ВыбранныеФайлы приходит массив полных путей или Неопределено при отмене.
Вариант с Ждать (платформа 8.3.18 и выше)
Начиная с 8.3.18 можно писать асинхронно, без отдельной процедуры-обработчика:
&НаКлиенте
Асинх Процедура ВыбратьФайлы(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "Книга Excel (*.xlsx)|*.xlsx";
Диалог.МножественныйВыбор = Истина;
ВыбранныеФайлы = Ждать Диалог.ВыбратьАсинх();
Если ВыбранныеФайлы = Неопределено Тогда
Возврат;
КонецЕсли;
Для Каждого ПутьКФайлу Из ВыбранныеФайлы Цикл
Сообщить(ПутьКФайлу);
КонецЦикла;
КонецПроцедуры
Выбор по кнопке «…» в поле формы
Чтобы путь выбирался из поля реквизита, создайте для поля обработчик события НачалоВыбора через палитру свойств. Конфигуратор сам подставит параметры под вашу версию платформы. Внутри обработчика:
- Установите
СтандартнаяОбработка = Ложь, чтобы не открывалась стандартная форма выбора. - Создайте
ДиалогВыбораФайлаи покажите его, как в примере выше. - В обработчике завершения запишите путь в реквизит.
Полезные свойства диалога
| Свойство | Зачем |
|---|---|
Фильтр | Пары «описание|маска», разделённые |; несколько масок — через ; |
ИндексФильтра | Какой фильтр выбран при открытии (с нуля) |
Каталог | Папка, с которой окно откроется |
ПолноеИмяФайла | Имя файла по умолчанию (удобно в режиме сохранения) |
МножественныйВыбор | Разрешить выбор нескольких файлов |
ПредварительныйПросмотр | Показывать область просмотра |
Как передать выбранный файл на сервер 1С
Путь C:\Users\buh\Desktop\price.xlsx существует только на компьютере пользователя. Если сервер 1С стоит на другой машине, код Новый ДвоичныеДанные(Путь) в серверной процедуре файл не найдёт. Сам файл нужно передать на сервер, а не его путь.
Классическая схема: клиент кладёт файл во временное хранилище, сервер забирает его по адресу.
&НаКлиенте
Процедура ЗагрузитьПрайс(Команда)
Оповещение = Новый ОписаниеОповещения("ПомещениеФайлаЗавершение", ЭтотОбъект);
// Интерактивно = Истина: платформа сама покажет окно выбора
НачатьПомещениеФайла(Оповещение, , "", Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПомещениеФайлаЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
ПрочитатьПрайсНаСервере(Адрес);
КонецПроцедуры
&НаСервере
Процедура ПрочитатьПрайсНаСервере(Адрес)
ДанныеФайла = ПолучитьИзВременногоХранилища(Адрес);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ДанныеФайла.Записать(ИмяВременногоФайла);
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяВременногоФайла);
УдалитьФайлы(ИмяВременногоФайла);
// дальше разбор ТабДок по строкам и колонкам
КонецПроцедуры
Плюс этого способа: он работает и в тонком, и в веб-клиенте, даже без расширения работы с файлами. Окно выбора платформа покажет сама.
💡 Передавайте в последний параметр УникальныйИдентификатор формы. Тогда данные во временном хранилище удалятся при закрытии формы, а не будут висеть в памяти до конца сеанса.
В новых версиях платформы есть и более современные методы: НачатьПомещениеФайлаНаСервер, ПоместитьФайлНаСерверАсинх, а для нескольких файлов — НачатьПомещениеФайлов. Логика та же: на выходе адрес во временном хранилище.
Файлы из внешних систем: HTTP-сервисы и XDTO
Иногда файл выбирает не человек в окне, а внешняя программа: интернет-магазин отдаёт заказ, сканер-приложение шлёт фото накладной. Окна выбора тут нет, файл приходит запросом.
HTTP-сервис
- В конфигураторе добавьте HTTP-сервис, шаблон URL (например,
/upload) и методPOST. - В обработчике метода получите тело:
ДанныеФайла = Запрос.ПолучитьТелоКакДвоичныеДанные();. - Имя файла внешняя система передаёт в заголовке или параметре запроса — договоритесь о нём заранее.
- Опубликуйте базу на веб-сервере с включёнными HTTP-сервисами.
Функция UploadPOST(Запрос)
ДанныеФайла = Запрос.ПолучитьТелоКакДвоичныеДанные();
// сохранить в присоединённые файлы, разобрать и т.п.
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки("OK");
Возврат Ответ;
КонецФункции
Веб-сервис и XDTO
В веб-сервисе файл описывают в XDTO-пакете параметром типа base64Binary. На стороне 1С он приходит как ДвоичныеДанные. Этот путь выбирают, когда партнёр работает по SOAP и у него уже есть WSDL. Для новых интеграций HTTP-сервис обычно проще.
Готовые механизмы: БСП, обработки, загрузка из файла
Писать ДиалогВыбораФайла с нуля в типовой конфигурации редко нужно. В БП 3.0, ЗУП 3.1 и УТ 11 встроена Библиотека стандартных подсистем, и у неё есть свои обёртки.
- 📦
ФайловаяСистемаКлиент.ЗагрузитьФайл— показывает выбор, кладёт файл во временное хранилище и сам учитывает веб-клиент. - 📦
ФайловаяСистемаКлиент.ЗагрузитьФайлы— то же для нескольких файлов. - 📦
ФайловаяСистемаКлиент.ПоказатьДиалогВыбора— показывает уже настроенныйДиалогВыбораФайла, подключая расширение при необходимости.
Параметры этих процедур меняются от версии БСП. Откройте общий модуль ФайловаяСистемаКлиент в своей конфигурации и посмотрите описание перед процедурой.
Внешняя обработка для регулярной загрузки
Если файл загружают каждый день (прайс поставщика, реестр из банка), удобно сделать внешнюю обработку :
- Реквизит «Путь к папке» и кнопка «…» с диалогом в режиме
ВыборКаталога. - Кнопка «Загрузить», которая находит в папке файлы по маске через
НайтиФайлы(Каталог, "*.xlsx"). - Обработанные файлы переносятся в подпапку
Архив, чтобы не загрузить их дважды.
Учтите: НайтиФайлы на клиенте видит диски пользователя, а на сервере — диски сервера. Для автоматической загрузки по расписанию папка должна быть доступна серверу 1С, например общий сетевой каталог с правами для пользователя службы.
Внешние компоненты
Внешние компоненты (Native API) подключают, когда нужно то, чего нет в платформе: например, следить за появлением файлов в папке или работать с особыми форматами. Для обычного выбора файла компонента не нужна, платформенных средств хватает.
Безопасность при работе с файлами в 1С
Файл, который выбрал пользователь, — это данные извне. Обращайтесь с ним как с непроверенными данными.
- 🔒 Проверяйте размер. Перед помещением в хранилище посмотрите размер через объект
Файл(Новый Файл(Путь).Размер()на клиенте) и отказывайтесь от слишком больших. - 🔒 Не доверяйте расширению. Файл
.xlsxможет оказаться чем угодно. Ловите ошибку чтения черезПопытка ... Исключение. - 🔒 Не открывайте внешние обработки из неизвестных источников. Обработка
.epfвыполняет код с правами пользователя. В актуальных платформах включена защита от опасных действий: при открытии внешнего файла 1С показывает предупреждение. Не отключайте эту защиту в свойствах пользователя без крайней нужды. - 🔒 Безопасный режим. Подключаемые дополнительные обработки в типовых работают в безопасном режиме, где запрещён прямой доступ к файловой системе. Если обработке нужен доступ к папке, администратор выдаёт разрешение через профили безопасности, а не снимает ограничение целиком.
- 🔒 Не собирайте путь из строки пользователя на сервере. Имя файла из запроса HTTP-сервиса может содержать
..\и вести за пределы рабочей папки. Сохраняйте файлы под своими именами, например поНовый УникальныйИдентификатор.
Ошибки при выборе файла и как их убрать
Если ошибка возникает в типовой конфигурации, а не в вашем коде, не правьте модуль «на месте». Сначала обновите конфигурацию до актуального релиза: такие ошибки обычно исправляют в обновлениях.