1С 8.3 Диалог выбора файла - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

1С 8.3 Диалог выбора файла

Данные > Примеры кода 1С > 1С 8.3 Диалоги
В группах и на форумах встречаются советы с кодом из типовой - устаревшего стандартного диалога выбора файла (пример №2). Как же всё-таки корректно выполнить программную обработку выбора пользователя пути к файлу для УФ? Делайте правильно - используйте асинхронные методы.
Пример №1.1 (рекомендуется): Асинхронный диалог выбора файла на клиенте в 1С 8.3:
&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

  // Свойство КнопкаВыбора элемента формы установим в значение Да
  // и будем обрабатывать событие НачалоВыбора этого элемента
  СтандартнаяОбработка = Ложь;// Отказываемся от стандартной обработки процедуры

  // Создаем диалог выбора файла и указываем для чего он будет использоваться
  Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); // или ВыборКаталога или Сохранение
  Диалог.Фильтр = "Документ PDF (*.pdf)|*.pdf"; // Строка с файловыми фильтрами
  Диалог.Заголовок = "Выберите документ PDF"; // Текст заголовка окна выбора

  // Создаем объект ОписаниеОповещения, который будет передан в метод Показать
  ОповещениеЗавершения = Новый ОписаниеОповещения("ПриВыбореФайла", ЭтотОбъект);
  // Также можно задать и третий параметр - Диалог. Тогда в процедуре ПриВыбореФайла из параметра ДополнительныеПараметры
  // можно получить каталог (в котором хранится выбранный файл), и фильтр (которому соответствует файл)
  // Пример: ОповещениеЗавершения = Новый ОписаниеОповещения("ПриВыбореФайла", ЭтотОбъект, Диалог);

  Диалог.Показать(ОповещениеЗавершения); // Открываем окно выбора файла

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

// Эта процедура будет вызвана после закрытия окна выбора файла:
&НаКлиенте
Процедура ПриВыбореФайла(ВыбФайлы, ДополнительныеПараметры) Экспорт

  Если ВыбФайлы <> Неопределено Тогда
      ПутьКФайлу = ВыбФайлы[0];
  КонецЕсли;

КонецПроцедуры
Пример №1.2 (рекомендуется): Асинхронный диалог выбора каталога на клиенте в 1С 8.3:
&НаКлиенте
Процедура ПапкаЗагрузкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
   // Свойство КнопкаВыбора элемента формы установим в значение Да
   // и будем обрабатывать событие НачалоВыбора этого элемента
   СтандартнаяОбработка = Ложь;// Отказываемся от стандартной обработки процедуры

   // Создаем диалог выбора файла и указываем для чего он будет использоваться
   Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
   Диалог.Каталог = "";
   Диалог.МножественныйВыбор = Ложь;
   Диалог.Заголовок = "Выберите каталог с файлами для импорта Лайтик-Опт"; // Текст заголовка окна выбора

   // Создаем объект ОписаниеОповещения, который будет передан в метод Показать
   ОповещениеЗавершения = Новый ОписаниеОповещения("ПриВыбореКаталога", ЭтотОбъект);

   Диалог.Показать(ОповещениеЗавершения); // Открываем окно выбора каталога
КонецПроцедуры

// Процедура будет вызвана после закрытия окна выбора каталога:
&НаКлиенте
Процедура ПриВыбореКаталога(ВыбКаталог, ДополнительныеПараметры) Экспорт
   Если ВыбКаталог <> Неопределено Тогда
       ПапкаЗагрузки = ВыбКаталог[0];
   КонецЕсли;
КонецПроцедуры
Пример №1.3 (рекомендуется): Асинхронный диалог выбора файла через ПоместитьФайлНаСерверАсинх в 1С 8.3:
// Оригинал статьи: https://infostart.ru/1c/tools/2140317/
&НаКлиенте
Асинх Процедура ЗагрузитьСтатьи(Команда)

   //Описание параметров диалога помещения файлов
   //ПараметрыДиалогаПомещенияФайлов = Новый Структура;
   //ПараметрыДиалогаПомещенияФайлов.Вставить("Заголовок", "Выберите файл статей");
   //ПараметрыДиалогаПомещенияФайлов.Вставить("МножественныйВыбор", Ложь);
   //ПараметрыДиалогаПомещенияФайлов.Вставить("Фильтр", "xlsx (*.xlsx)     |*.xlsx");
   //ПараметрыДиалогаПомещенияФайлов.Вставить("ИндексФильтра", 0);

   ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов("Выберите файл статей", Ложь, "xlsx (*.xlsx)     |*.xlsx", 0);

   Обещание = ПоместитьФайлНаСерверАсинх( , , , ПараметрыДиалога, ЭтаФорма.УникальныйИдентификатор);
   Результат = Ждать Обещание;

   Если Результат <> Неопределено Тогда
       Попытка
           ПрочитатьФайл(Результат.Адрес);
       Исключение
           ТекстСообщения = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
           ПоказатьПредупреждение(,НСтр("ru = 'Операция не может быть выполнена по причине:'") + Символы.ПС + ТекстСообщения);
       КонецПопытки;
   КонецЕсли;

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

&НаСервереБезКонтекста
Процедура ПрочитатьФайл(Адрес)

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

   ТаблДок = Новый ТабличныйДокумент;

   Попытка
       ТаблДок.Прочитать(ИмяФайла);
   Исключение
       ЗаписьЖурналаРегистрации(НСтр("ru = 'Загрузка статей'"),
       УровеньЖурналаРегистрации.Ошибка,,,
       ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
       ВызватьИсключение;
   КонецПопытки;

   КоличествоСтрок = ТаблДок.ВысотаТаблицы;
   ГлубинаИерархии = 6;
   Для Каждого Область Из ТаблДок.Области Цикл

       ИмяСправочника = Область.Имя;
       Менеджер = Справочники[ИмяСправочника];

       Если Менеджер = Неопределено Тогда
           Менеджер = Справочники.СтатьиДвиженияДенежныхСредств;
       КонецЕсли;

       РодительскаяГруппаСправочника = Менеджер.НайтиПоНаименованию("Загруженные справочники");

       ГруппыИерархии = Новый Массив(ГлубинаИерархии);
       ГруппыИерархии.Вставить(0, РодительскаяГруппаСправочника);
       ТекущаяГруппа = ГруппыИерархии[0];

       Для НомерСтроки = Область.Верх + 1 По Область.Низ Цикл
           Наименование = Строка(ТаблДок.ПолучитьОбласть("R" + Формат(НомерСтроки, "ЧГ=0;") + "C" + 2).ТекущаяОбласть.Текст);
           Тип = Строка(ТаблДок.ПолучитьОбласть("R" + Формат(НомерСтроки, "ЧГ=0;") + "C" + 3).ТекущаяОбласть.Текст);
           ДоходРасход = Строка(ТаблДок.ПолучитьОбласть("R" + Формат(НомерСтроки, "ЧГ=0;") + "C" + 4).ТекущаяОбласть.Текст);

           Если Лев(Тип, 6) = "Группа" Тогда
               Уровень = Число(Прав(Тип, 1)) + 1;
               НоваяГруппа = Менеджер.СоздатьГруппу();
               НоваяГруппа.Наименование = Наименование;
               НоваяГруппа.Родитель = ГруппыИерархии[Уровень - 1];
               НоваяГруппа.Записать();
               ТекущаяГруппа = НоваяГруппа.Ссылка;
               ГруппыИерархии[Уровень] = ТекущаяГруппа;
           ИначеЕсли Тип = "Статья" Тогда
               НоваяСтатья = Менеджер.СоздатьЭлемент();
               НоваяСтатья.Наименование = Наименование;
               НоваяСтатья.Родитель = ТекущаяГруппа;
               НоваяСтатья.ПриходРасход = ?(ДоходРасход = "Доход",
              Перечисления.ВидыДвиженийПриходРасход.Приход,
              Перечисления.ВидыДвиженийПриходРасход.Расход);
               НоваяСтатья.Записать();
           КонецЕсли;

       КонецЦикла;

   КонецЦикла;

КонецПроцедуры
Пример №2: Диалог выбора файла на клиенте в 1С 8.3:
&НаКлиенте
Функция ПриВыбореФайла()

  Режим = РежимДиалогаВыбораФайла.Открытие;//(ВыборКаталога, Открытие, Сохранение)

  ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
  ДиалогОткрытияФайла.ПолноеИмяФайла = "";

  Текст = "ru = ""Текст""; en = ""Text""";
  //Текст = "ru = ""Таблица""; en = ""Excel""";
  //Текст = "ru = ""Документ PDF""; en = ""Adobe Acrobat PDF""";

  Фильтр = НСтр(Текст)+"(*.txt)|*.txt"; // Строка с файловыми фильтрами
  //Фильтр = НСтр(Текст)+"(*.xlsx)|*.xlsx| (*.xls)|*.xls (*.xlsb)|*.xlsb|";
  //Фильтр = НСтр(Текст)+"(*.pdf)|*.pdf";

  ДиалогОткрытияФайла.Фильтр = Фильтр;
  ДиалогОткрытияФайла.МножественныйВыбор = Истина;// Ложь - Если нужен один фай
  ДиалогОткрытияФайла.Заголовок = "Выберите файлы";// "Выберите файл"

  Если ДиалогОткрытияФайла.Выбрать() Тогда
      Текст = "ru = ""; Размер = ""; en = ""; Size = """;

      // МножественныйВыбор = Истина:
      МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы;
      Для Каждого ИмяФайла Из МассивФайлов Цикл
          ВыбФайл = Новый Файл(ИмяФайла);
          Сообщить(ИмяФайла+НСтр(Текст)+ВыбФайл.Размер());
      КонецЦикла;
      // МножественныйВыбор = Ложь:
      // ПутьКФайлу = ДиалогОткрытияФайла.ПолноеИмяФайла;
      // Сообщить(ПутьКФайлу+ДиалогОткрытияФайла.Размер());
  Иначе
      Текст = "ru = ""Файл(ы) не выбран!""; en = ""File(s) not selected!""";
      Предупреждение(НСтр(Текст));
  КонецЕсли;

КонецФункции
Пример №3: Диалог выбора файла в 1С 8.3:
// Процедура - Имя каталога начало выбора
// Обработка события НачалоВыбора поля ввода для выбора каталога
// В процедуре определяется имя реквизита по Элементу куда нужно записать полученный каталог
// Имя ПоляВвода должно совпадать с именем реквизита формы
 &НаКлиенте
Процедура ИмяКаталогаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

   ИмяПоля = Элемент.Имя;

   ДиалогВыборКаталога = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);

   //Если пользователь не нажал кнопку ОТМЕНА в диалоге
   Если ДиалогВыборКаталога.Выбрать() Тогда
       ЭтаФорма[ИмяПоля] = ДиалогВыборКаталога.Каталог;
   КонецЕсли;

КонецПроцедуры
1
комментарий
Максин
15 авг 2024
Плюс.
____________________
Copyright©, «Программист 1С в г.Минске», 05.09.2021
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Защищенное соединение ssl
visa
mastercard
Maestro
Яндекс деньги
Назад к содержимому