Выбор файла в 1С 8.3: от окна «Открыть» до кода на встроенном языке

· 9 мин

Содержание

Пользователь выбирает файл в 1С через стандартное окно Windows: оно открывается по кнопке загрузки, по скрепке присоединённых файлов или через Ctrl+O. Разработчик вызывает то же окно объектом ДиалогВыбораФайла и методом Показать() или ВыбратьАсинх(), а потом передаёт файл на сервер через временное хранилище.

Сложности начинаются в деталях. Окно не открывается в веб-клиенте, код падает с ошибкой про модальность, сервер «не видит» путь C:\Users\.... Ниже по порядку: сначала для пользователя, затем для разработчика.

Как выбрать файл в 1С через окно выбора

Для пользователя 1С 8.3 выбор файла всегда выглядит одинаково: программа открывает системное окно, вы находите файл и нажимаете «Открыть». Отличается только то, откуда это окно вызывается.

Где в программе встречается выбор файла

ЗадачаОткуда вызвать
Открыть внешнюю обработку или отчёт (.epf, .erf)Главное меню (кнопка с тремя полосками) → Файл → Открыть или Ctrl+O
Прикрепить скан к документуКнопка со скрепкой в форме документа → добавить файл с диска
Загрузить банковскую выписку в БП 3.0Банк и касса → Банковские выписки → Загрузить
Заполнить табличную часть из ExcelКоманда загрузки в командной панели табличной части
Загрузить выгрузку базы .dtКонфигуратор → Администрирование → Загрузить информационную базу

Пошагово

  1. Нажмите команду, которая запускает загрузку или открытие.
  2. В открывшемся окне перейдите в нужную папку через левую панель или адресную строку.
  3. Проверьте фильтр справа от поля «Имя файла». Если там стоит, например, *.xlsx, файлы других типов не видны.
  4. Выделите файл и нажмите «Открыть».

Если файл лежит в длинной сетевой папке, не листайте дерево. Скопируйте полный путь из проводника и вставьте его в поле «Имя файла» — окно сразу откроет файл.

Если окно выбора не появилось

В тонком клиенте окно почти всегда открывается сразу. В браузере (веб-клиент) 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. Установите СтандартнаяОбработка = Ложь, чтобы не открывалась стандартная форма выбора.
  2. Создайте ДиалогВыбораФайла и покажите его, как в примере выше.
  3. В обработчике завершения запишите путь в реквизит.

Полезные свойства диалога

СвойствоЗачем
ФильтрПары «описание|маска», разделённые |; несколько масок — через ;
ИндексФильтраКакой фильтр выбран при открытии (с нуля)
КаталогПапка, с которой окно откроется
ПолноеИмяФайлаИмя файла по умолчанию (удобно в режиме сохранения)
МножественныйВыборРазрешить выбор нескольких файлов
ПредварительныйПросмотрПоказывать область просмотра

Как передать выбранный файл на сервер 1С

Путь C:\Users\buh\Desktop\price.xlsx существует только на компьютере пользователя. Если сервер 1С стоит на другой машине, код Новый ДвоичныеДанные(Путь) в серверной процедуре файл не найдёт. Сам файл нужно передать на сервер, а не его путь.

Классическая схема: клиент кладёт файл во временное хранилище, сервер забирает его по адресу.

&НаКлиенте
Процедура ЗагрузитьПрайс(Команда)

    Оповещение = Новый ОписаниеОповещения("ПомещениеФайлаЗавершение", ЭтотОбъект);
    // Интерактивно = Истина: платформа сама покажет окно выбора
    НачатьПомещениеФайла(Оповещение, , "", Истина, УникальныйИдентификатор);

КонецПроцедуры

&НаКлиенте
Процедура ПомещениеФайлаЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт

    Если Не Результат Тогда
        Возврат;
    КонецЕсли;

    ПрочитатьПрайсНаСервере(Адрес);

КонецПроцедуры

&НаСервере
Процедура ПрочитатьПрайсНаСервере(Адрес)

    ДанныеФайла = ПолучитьИзВременногоХранилища(Адрес);
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
    ДанныеФайла.Записать(ИмяВременногоФайла);

    ТабДок = Новый ТабличныйДокумент;
    ТабДок.Прочитать(ИмяВременногоФайла);
    УдалитьФайлы(ИмяВременногоФайла);

    // дальше разбор ТабДок по строкам и колонкам

КонецПроцедуры

Плюс этого способа: он работает и в тонком, и в веб-клиенте, даже без расширения работы с файлами. Окно выбора платформа покажет сама.

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

В новых версиях платформы есть и более современные методы: НачатьПомещениеФайлаНаСервер, ПоместитьФайлНаСерверАсинх, а для нескольких файлов — НачатьПомещениеФайлов. Логика та же: на выходе адрес во временном хранилище.

Файлы из внешних систем: HTTP-сервисы и XDTO

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

HTTP-сервис

  1. В конфигураторе добавьте HTTP-сервис, шаблон URL (например, /upload) и метод POST.
  2. В обработчике метода получите тело: ДанныеФайла = Запрос.ПолучитьТелоКакДвоичныеДанные();.
  3. Имя файла внешняя система передаёт в заголовке или параметре запроса — договоритесь о нём заранее.
  4. Опубликуйте базу на веб-сервере с включёнными HTTP-сервисами.
Функция UploadPOST(Запрос)

    ДанныеФайла = Запрос.ПолучитьТелоКакДвоичныеДанные();
    // сохранить в присоединённые файлы, разобрать и т.п.

    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.УстановитьТелоИзСтроки("OK");
    Возврат Ответ;

КонецФункции

Веб-сервис и XDTO

В веб-сервисе файл описывают в XDTO-пакете параметром типа base64Binary. На стороне 1С он приходит как ДвоичныеДанные. Этот путь выбирают, когда партнёр работает по SOAP и у него уже есть WSDL. Для новых интеграций HTTP-сервис обычно проще.

Готовые механизмы: БСП, обработки, загрузка из файла

Писать ДиалогВыбораФайла с нуля в типовой конфигурации редко нужно. В БП 3.0, ЗУП 3.1 и УТ 11 встроена Библиотека стандартных подсистем, и у неё есть свои обёртки.

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

Параметры этих процедур меняются от версии БСП. Откройте общий модуль ФайловаяСистемаКлиент в своей конфигурации и посмотрите описание перед процедурой.

Внешняя обработка для регулярной загрузки

Если файл загружают каждый день (прайс поставщика, реестр из банка), удобно сделать внешнюю обработку :

  1. Реквизит «Путь к папке» и кнопка «…» с диалогом в режиме ВыборКаталога.
  2. Кнопка «Загрузить», которая находит в папке файлы по маске через НайтиФайлы(Каталог, "*.xlsx").
  3. Обработанные файлы переносятся в подпапку Архив, чтобы не загрузить их дважды.

Учтите: НайтиФайлы на клиенте видит диски пользователя, а на сервере — диски сервера. Для автоматической загрузки по расписанию папка должна быть доступна серверу 1С, например общий сетевой каталог с правами для пользователя службы.

Внешние компоненты

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

Безопасность при работе с файлами в 1С

Файл, который выбрал пользователь, — это данные извне. Обращайтесь с ним как с непроверенными данными.

  • 🔒 Проверяйте размер. Перед помещением в хранилище посмотрите размер через объект Файл (Новый Файл(Путь).Размер() на клиенте) и отказывайтесь от слишком больших.
  • 🔒 Не доверяйте расширению. Файл .xlsx может оказаться чем угодно. Ловите ошибку чтения через Попытка ... Исключение.
  • 🔒 Не открывайте внешние обработки из неизвестных источников. Обработка .epf выполняет код с правами пользователя. В актуальных платформах включена защита от опасных действий: при открытии внешнего файла 1С показывает предупреждение. Не отключайте эту защиту в свойствах пользователя без крайней нужды.
  • 🔒 Безопасный режим. Подключаемые дополнительные обработки в типовых работают в безопасном режиме, где запрещён прямой доступ к файловой системе. Если обработке нужен доступ к папке, администратор выдаёт разрешение через профили безопасности, а не снимает ограничение целиком.
  • 🔒 Не собирайте путь из строки пользователя на сервере. Имя файла из запроса HTTP-сервиса может содержать ..\ и вести за пределы рабочей папки. Сохраняйте файлы под своими именами, например по Новый УникальныйИдентификатор.

Ошибки при выборе файла и как их убрать

Диагностика: выберите симптом

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

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

Можно ли выбрать сразу несколько файлов?
Да. В коде установите МножественныйВыбор = Истина; в окне выделяйте файлы с Ctrl или Shift. Все пути придут массивом.
Как открыть окно сразу в нужной папке?
Заполните свойство Каталог перед показом диалога. Последнюю использованную папку удобно хранить в настройках пользователя через ХранилищеОбщихНастроек.
Как выбрать папку, а не файл?
Создайте диалог в режиме РежимДиалогаВыбораФайла.ВыборКаталога. Результат — путь к выбранной папке.
Где взять имя файла без пути?
Создайте Новый Файл(ПолныйПуть): у него есть свойства Имя, ИмяБезРасширения и Расширение.
Почему код с выбором файла работал в 8.2, а в 8.3 перестал?
Скорее всего, в конфигурации отключена модальность. Перепишите вызовы Выбрать() на Показать() или ВыбратьАсинх().