1с диалог выбора файла
Время неумолимо идёт вперёд, а платформа 1С 8 бежит ещё быстрей этого времени.
Управляемые формы теперь называются "интерфейс ТАКСИ", модальные окна запрещены, а режим использования синхронных вызовов расширений и внешних компонент наглухо положил работоспособность большинства этих расширений и внешних компонент, и половину старых методов в добавок.
В общем, пацаны, дела такие - многие из вас читали статью великолепного Чистова П. о работе с файлами в 8.3
Если Вы ещё этого не сделали - бегом марш! (ссылка)
Суть механизма работы с файлами в кратце:
1) На клиенте выбираем файл
2) Пихаем его в чёрный ящик
3) Сохраняем содержимое чёрного ящика на сервере
Загвоздка состоит в том, что делать это надо особенно, по-новому и с душой.
и прочие языческие штучки здесь не прокатят.
Вот листинг кода, который позволяет загрузить файл с клиента
Нас интересует метод "НачатьПомещениеФайлов", который, собственно, вызывает диалог выбора файла и помещает этот файл во временное хранилище. Заморачиваться с описанием временного хранилища нет смысла, просто запомните - это то место, куда помещаются все выбранные нами файлы в виде двоичных данных (черный ящик).
Понять, что там и как храниться в этом временном хранилище практически невозможно. Можно только обратиться к нашему файлу по навигационной ссылке, которая присваивается автоматически (см. переменную "Адрес").
С тем, что файлы нужно хранить в реквизите или ресурсе с типом "Хранилище значения", спорить, думаю, никто не будет. Достать файл из временного хранилища и поместить его в реквизит с типом "Хранилище значения" можно след.образом:
С одним разобрались, теперь второе - как достать файл из этого хранилища значений (которое, напомню, находится на сервере) и сохранить на диск клиента?
Прежде всего, нам надо получить навигационную ссылку на реквизит с типом "Хранилище значения", куда у нас помещается файл в виде бинарных данных.
Будьте, внимательны! Эта навигационная ссылка уже не имеет с временным хранилищем ничего общего! Проверить тип навигационной ссылки можно методом
По традиции, листинг кода, который вызывает диалог сохранения файла
Значение переменной "Файл" это ещё одна особенность данного способа. Здесь стоит обратить внимание на "ИмяФайла". Дело в том, что помещая файл во временное хранилище, информация о его имени и расширении теряется. Поэтому не забудьте где-нибудь сохранять корректное имя файла, или хотя бы его расширение, чтобы потом не мучаться с вопросом "А это вордовский документ или мп3?"
Метод "НачатьПолучениеФайлов" аналогичен методу "НачатьПомещениеФайлов". Просто один открывает диалог для выбора файла, другой же, наоборот, открывает диалог для сохранения файла.
При использовании данного способа, никакие совместимости модальности и синхронных вызовов в свойствах конфигурации устанавливать не нужно.
1C: Enterprise Development Tools 50
И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools - это среда для разработки конфигурации в IDE Eclipse. С сайта 1С: « 1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений систем PostgreSQL: установка, настройка, обслуживание 11
PostgreSQL напрямую "из коробки" применяться для использования с 1С Предприятем не может. Необходима именно адаптированная версия от 1С, превращающая PostgreSQL в блокировочник, причем нужно понимать, что блокировки будут накладываться на всю таблиц Автоматическая архивация баз 1С с использованием Cobian Backup и VBS скриптов 8
Клиент попросил настроить автоматическую архивацию баз 1С раз в три дня и выгрузку архивов на Dropbox и на FTP Сервер. Кроме 1С нужно архивировать папку с рабочими документами. Хочет - так хочет, делаем: Первым делом настроим автоматическую архивац Ввод по строке - поиск по первым символам или в любом месте наименования 6
При разработке конфигурации, для упрощении ввода документов потребовалось настроить ввод номенклатуры по совпадению любой части наименования! В 1С 8.3 по умолчанию настройки справочника номенклатуры такие: При такой настройке, механизм поиска в Веб браузер в 1С используя поле HTML документа 3
Настраивал клиенту CRM, он захотел - чтобы панель управления сайтом была в 1С. Хочет - делаем: Обработка Веб браузер проста, состоит из поля HTML документа и 20 строчек кода: Код команд: НаКлиенте Процедура Команда1(Команда) Объект.HTML = Посмотреть все результаты поиска похожих
Еще в этой же категории
Обработка файлов в папке и запись дополнительной информации в них 4
Частенько при загрузке данных в 1С сталкиваешься с необходимостью дополнительной обработки загружаемых файлов. Возможно это добавление какой-либо информации или наоборот удаление, а может изменение. Ниже приведен код, который обрабатывает файлы в Функции для работы с ZIP-архивами 0
В работе часто приходится сжимать выгруженные данные в zip архив, отправлять по почте, и потом автоматически разархивировать полученный zip файл: // Распаковывает файл архива ZIP в указанный каталог; Извлекает все файлы архива // // Параметры: / Посмотреть все в категории Работа с Файлами и Каталогами
С появлением управляемого приложения и веб-клиента некоторые задачи, которые решались в обычном приложением за несколько строчек, существенно усложнились. Казалось бы такая простая и часто используемая операция, как интерактивный выбор файла, которая в обычном приложении решалась в одном методе, теперь требует создания цепочки из нескольких процедур, которые вызываются одна за другой через ОписаниеОповещения. Вот как это было с использованием модальных вызовов:
Но как эту задачу решить на веб-клиенте? В поисковике не удалось найти готового универсального решения. Поискал в типовых, но там все разбросано по модулям и как-то запутано. Посмотрел пример в консоли СКД с диска ИТС для управляемых форм. Там тоже надо вычленять по кусочкам все шаги. Кроме того там применяется одна фича, которая позволяет открывать диалог выбора файла без установленного расширения работы с файлами. Но в общем случае эта хитрость не подойдет, так как она работает только для существующих файлов, насколько я понял. Поэтому написал процедуры, которые можно просто скопировать и использовать в будущем, не тратя время на то, чтобы вспоминать, как это работает.
Диалог выбора файла
Сразу приведу код, который получился после упрощения.
Я специально привел ранее вариант для обычных форм, чтобы проще было сравнивать. Код разбился на две примитивные процедуры и практически не изменился за счет метода ВыполнитьСценарийВыбораФайла(). Этот метод скрывает все рутинные асинхронные действия:
- подключает расширение по работе с файлами
- если расширение не подключено, то задает пользователю вопрос по его подключению
- начинает установку расширения, если пользователь подтвердит это действие
- открывает диалог выбора файла
- передает результаты выбора файла назад в прикладную процедуру КаталогНачалоВыбораЗавершение()
Далее приведу код этой служебной процедуры, написанной по принципу, из этой статьи.
То есть вместо того, чтобы писать несколько процедур с труднопонимаемыми названиями в стиле ЗагрузитьФайлКонсолиПослеПодключенияРасширенияПослеПомещенияФайла() , вся последовательность действий описана в одной. Кроме того, можно заметить, что она универсальная и не содержит зависимостей от контекста формы. То есть ее можно перенести в другую форму простым копированием
Загрузка файлов с клиента на сервер
Постановка задачи: пусть требуется метод, который умеет помещать на сервер выбранный на клиенте файл. Если выбранный файл является каталогом, то необходимо поместить на сервер все файлы, содержащиеся в этом каталоге (подчиненные каталоги игнорировать).
Последовательность асинхронных действий:
- определить является ли файл каталогом
- если не является, то добавить его в массив помещаемых файлов
- если является, то найти все файлы этого каталога
- каждый из найденных файлов проверить является ли он каталогом. Если не является то добавить в массив помещаемых файлов (каждая итерация цикла обхода файлов является асинхронной, потому что вместо синхронного Файл.ЭтоФайл() необходимо использовать его аналог Файл.НачатьПроверкуЭтоФайл())
- поместить файлы на сервер
- вернуть результат помещения в прикладную процедуру, которая будет выполнять обработку файлов по какому-то алгоритму
Данная задача снова решается за три простых шага
Все детали скрыты в процедуре ВыполнитьСценарийЗагрузкиФайлаНаСервер(), которая подходит как для файлов, так и для каталогов. При необходимости ее можно доработать, чтобы она покрывала больше случаев.
Файл для скачивания
К публикации прилагается пример, который можно использовать как шаблон для описанных операций. В нем реализованы несколько наиболее востребованных случаев: выбор существующего файла, выбор имени файла для сохранения, выбор каталога и множественный выбор. Для полноты картины приведены аналогичные операции для обычных форм. Тестировались процедуры на платфроме 8.3, на конфигурацях начиная с режима совместимости 8.2.13
В группах и на форумах встречаются советы с кодом из типовой - устаревшего стандартного диалога выбора файла (пример №2). Как же всё-таки корректно выполнить программную обработку выбора пользователя пути к файлу для УФ? Делайте правильно - используйте асинхронные методы (пример №1).
&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора ( Элемент , ДанныеВыбора , СтандартнаяОбработка )
// Свойство КнопкаВыбора элемента формы установим в значение Да
// и будем обрабатывать событие НачалоВыбора этого элемента
СтандартнаяОбработка = Ложь; // Отказываемся от стандартной обработки процедуры
// Создаем диалог выбора файла и указываем для чего он будет использоваться
Диалог = Новый ДиалогВыбораФайла ( РежимДиалогаВыбораФайла . Открытие ); // или ВыборКаталога или Сохранение
Диалог . Фильтр = "Документ PDF (*.pdf)|*.pdf" ; // Строка с файловыми фильтрами
Диалог . Заголовок = "Выберите документ PDF" ; // Текст заголовка окна выбора
// Создаем объект ОписаниеОповещения, который будет передан в метод Показать
ОповещениеЗавершения = Новый ОписаниеОповещения ( "ПриВыбореФайла" , ЭтотОбъект );
// Также можно задать и третий параметр - Диалог. Тогда в процедуре ПриВыбореФайла из параметра ДополнительныеПараметры
// можно получить каталог (в котором хранится выбранный файл), и фильтр (которому соответствует файл)
// Пример: ОповещениеЗавершения = Новый ОписаниеОповещения("ПриВыбореФайла", ЭтотОбъект, Диалог);
Диалог . Показать ( ОповещениеЗавершения ); // Открываем окно выбора файла
// Эта процедура будет вызвана после закрытия окна выбора файла:
&НаКлиенте
Процедура ПриВыбореФайла ( ВыбФайлы , ДополнительныеПараметры ) Экспорт
Если ВыбФайлы <> Неопределено Тогда
ПутьКФайлу = ВыбФайлы [ 0 ];
КонецЕсли;
&НаКлиенте
Функция ПриВыбореФайла ()
Режим = РежимДиалогаВыбораФайла . Открытие ; //(ВыборКаталога, Открытие, Сохранение)
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла ( Режим );
ДиалогОткрытияФайла . ПолноеИмяФайла = "" ;
Текст = "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!""" ;
Предупреждение ( НСтр ( Текст ));
КонецЕсли;
Для проектирования форм уведомлений, вопросов и предупреждений рекомендую следующий инструментарий: Консоль диалоговых форм (УФ)
✔ Модальные диалоги (НаКлиенте и НаСервере)
&НаКлиенте
Процедура МодальныеДиалогиНаКлиенте ( Команда )
Перем пВводДаты ;
Перем пВводЧисла ;
Перем пВводСтроки ;
// Вывод предупреждения пользователю (модально)
Предупреждение ( "Внимание! Константа изменена!" , 0 , "Предупреждение об изменении константы" );
// Вывод диалога вопроса с заголовком и нужными кнопками (модально)
ВашОтвет = Вопрос ( "Загрузить список банков?" , РежимДиалогаВопрос . ДаНетОтмена , 0 , КодВозвратаДиалога . Да , "Список банков 2020г." );
Если ВашОтвет = КодВозвратаДиалога . Да Тогда
Сообщить ( "Список банков с сайта koder.by загружен!" );
КонецЕсли;
// Открыть значение для работы с ним (модально)
ОткрытьЗначение ( 98.12 );
// Ввод даты пользователем (модально)
Если ВвестиДату ( пВводДаты , "Введите дату выгрузки информации на портал koder.by" , ЧастиДаты . Дата ) = Истина Тогда
Сообщить ( "Информация выгружена на дату: " + пВводДаты );
КонецЕсли;
// Ввод значения определенного типа пользователем (модально)
Если ВвестиЗначение ( пВводЧисла , "Введите значение" , "Число" ) Тогда
Сообщить ( пВводЧисла );
КонецЕсли;
// Ввод строки пользователем (модально)
Если ВвестиСтроку ( пВводСтроки , "Введите строку" , 0 , Истина) Тогда
Сообщить ( пВводСтроки );
КонецЕсли;
// Ввод числа определенного формата пользователем (модально)
Если ВвестиЧисло ( пВводЧисла , "Введите число" , 3 , 1 ) Тогда
Сообщить ( пВводЧисла );
КонецЕсли;
&НаСервере
Процедура МодальныеДиалогиНаСервере ( Команда )
ОткрытьЗначение ( Справочники . МестаХранения . НайтиПоНаименованию ( "Основной" ));
Читайте также: