1С 8.3 Диалог выбора файла
Данные > Примеры кода 1С > 1С 8.3 Диалоги
Перейти в раздел примеры кода 1С 8.3:
В группах и на форумах встречаются советы с кодом из типовой - устаревшего стандартного диалога выбора файла (пример №2). Как же всё-таки корректно выполнить программную обработку выбора пользователя пути к файлу для УФ? Делайте правильно - используйте асинхронные методы.
Пример №1.1 (рекомендуется): Асинхронный диалог выбора файла на клиенте в 1С 8.3:
&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Свойство КнопкаВыбора элемента формы установим в значение Да
// и будем обрабатывать событие НачалоВыбора этого элемента
СтандартнаяОбработка = Ложь;// Отказываемся от стандартной обработки процедуры
// Создаем диалог выбора файла и указываем для чего он будет использоваться
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); // или ВыборКаталога или Сохранение
Диалог.Фильтр = "Документ PDF (*.pdf)|*.pdf"; // Строка с файловыми фильтрами
Диалог.Заголовок = "Выберите документ PDF"; // Текст заголовка окна выбора
// Создаем объект ОписаниеОповещения, который будет передан в метод Показать
ОповещениеЗавершения = Новый ОписаниеОповещения("ПриВыбореФайла", ЭтотОбъект);
// Также можно задать и третий параметр - Диалог. Тогда в процедуре ПриВыбореФайла из параметра ДополнительныеПараметры
// можно получить каталог (в котором хранится выбранный файл), и фильтр (которому соответствует файл)
// Пример: ОповещениеЗавершения = Новый ОписаниеОповещения("ПриВыбореФайла", ЭтотОбъект, Диалог);
Диалог.Показать(ОповещениеЗавершения); // Открываем окно выбора файла
КонецПроцедуры
// Эта процедура будет вызвана после закрытия окна выбора файла:
&НаКлиенте
Процедура ПриВыбореФайла(ВыбФайлы, ДополнительныеПараметры) Экспорт
Если ВыбФайлы <> Неопределено Тогда
ПутьКФайлу = ВыбФайлы[0];
КонецЕсли;
КонецПроцедуры
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Свойство КнопкаВыбора элемента формы установим в значение Да
// и будем обрабатывать событие НачалоВыбора этого элемента
СтандартнаяОбработка = Ложь;// Отказываемся от стандартной обработки процедуры
// Создаем диалог выбора файла и указываем для чего он будет использоваться
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); // или ВыборКаталога или Сохранение
Диалог.Фильтр = "Документ PDF (*.pdf)|*.pdf"; // Строка с файловыми фильтрами
Диалог.Заголовок = "Выберите документ PDF"; // Текст заголовка окна выбора
// Создаем объект ОписаниеОповещения, который будет передан в метод Показать
ОповещениеЗавершения = Новый ОписаниеОповещения("ПриВыбореФайла", ЭтотОбъект);
// Также можно задать и третий параметр - Диалог. Тогда в процедуре ПриВыбореФайла из параметра ДополнительныеПараметры
// можно получить каталог (в котором хранится выбранный файл), и фильтр (которому соответствует файл)
// Пример: ОповещениеЗавершения = Новый ОписаниеОповещения("ПриВыбореФайла", ЭтотОбъект, Диалог);
Диалог.Показать(ОповещениеЗавершения); // Открываем окно выбора файла
КонецПроцедуры
// Эта процедура будет вызвана после закрытия окна выбора файла:
&НаКлиенте
Процедура ПриВыбореФайла(ВыбФайлы, ДополнительныеПараметры) Экспорт
Если ВыбФайлы <> Неопределено Тогда
ПутьКФайлу = ВыбФайлы[0];
КонецЕсли;
КонецПроцедуры
Пример №1.2 (рекомендуется): Асинхронный диалог выбора каталога на клиенте в 1С 8.3:
&НаКлиенте
Процедура ПапкаЗагрузкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Свойство КнопкаВыбора элемента формы установим в значение Да
// и будем обрабатывать событие НачалоВыбора этого элемента
СтандартнаяОбработка = Ложь;// Отказываемся от стандартной обработки процедуры
// Создаем диалог выбора файла и указываем для чего он будет использоваться
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
Диалог.Каталог = "";
Диалог.МножественныйВыбор = Ложь;
Диалог.Заголовок = "Выберите каталог с файлами для импорта Лайтик-Опт"; // Текст заголовка окна выбора
// Создаем объект ОписаниеОповещения, который будет передан в метод Показать
ОповещениеЗавершения = Новый ОписаниеОповещения("ПриВыбореКаталога", ЭтотОбъект);
Диалог.Показать(ОповещениеЗавершения); // Открываем окно выбора каталога
КонецПроцедуры
// Процедура будет вызвана после закрытия окна выбора каталога:
&НаКлиенте
Процедура ПриВыбореКаталога(ВыбКаталог, ДополнительныеПараметры) Экспорт
Если ВыбКаталог <> Неопределено Тогда
ПапкаЗагрузки = ВыбКаталог[0];
КонецЕсли;
КонецПроцедуры
Процедура ПапкаЗагрузкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Свойство КнопкаВыбора элемента формы установим в значение Да
// и будем обрабатывать событие НачалоВыбора этого элемента
СтандартнаяОбработка = Ложь;// Отказываемся от стандартной обработки процедуры
// Создаем диалог выбора файла и указываем для чего он будет использоваться
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
Диалог.Каталог = "";
Диалог.МножественныйВыбор = Ложь;
Диалог.Заголовок = "Выберите каталог с файлами для импорта Лайтик-Опт"; // Текст заголовка окна выбора
// Создаем объект ОписаниеОповещения, который будет передан в метод Показать
ОповещениеЗавершения = Новый ОписаниеОповещения("ПриВыбореКаталога", ЭтотОбъект);
Диалог.Показать(ОповещениеЗавершения); // Открываем окно выбора каталога
КонецПроцедуры
// Процедура будет вызвана после закрытия окна выбора каталога:
&НаКлиенте
Процедура ПриВыбореКаталога(ВыбКаталог, ДополнительныеПараметры) Экспорт
Если ВыбКаталог <> Неопределено Тогда
ПапкаЗагрузки = ВыбКаталог[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];
НоваяГруппа.Записать();
ТекущаяГруппа = НоваяГруппа.Ссылка;
ГруппыИерархии[Уровень] = ТекущаяГруппа;
ИначеЕсли Тип = "Статья" Тогда
НоваяСтатья = Менеджер.СоздатьЭлемент();
НоваяСтатья.Наименование = Наименование;
НоваяСтатья.Родитель = ТекущаяГруппа;
НоваяСтатья.ПриходРасход = ?(ДоходРасход = "Доход",
&НаКлиенте
Асинх Процедура ЗагрузитьСтатьи(Команда)
//Описание параметров диалога помещения файлов
//ПараметрыДиалогаПомещенияФайлов = Новый Структура;
//ПараметрыДиалогаПомещенияФайлов.Вставить("Заголовок", "Выберите файл статей");
//ПараметрыДиалогаПомещенияФайлов.Вставить("МножественныйВыбор", Ложь);
//ПараметрыДиалогаПомещенияФайлов.Вставить("Фильтр", "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!""";
Предупреждение(НСтр(Текст));
КонецЕсли;
КонецФункции
Функция ПриВыбореФайла()
Режим = РежимДиалогаВыбораФайла.Открытие;//(ВыборКаталога, Открытие, Сохранение)
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.ПолноеИмяФайла = "";
Текст = "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
Плюс.
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник