Доброго времени суток!
Долгое время, изучая изменения функций работы с файлами в 1С, я не понимал, что же нам предлагают. Нет, старый дубовый подход со времен 7.7 был прост и понятен. Но новый, "безмодальный", "асинхронный" и еще "Расширения для работы с Файлами" в браузере в принудительном варианте всегда вызывали вопросы. Пришло время разобраться.
Так что же мы имели раньше?
Для программиста получение информации о файле всегда сопровождалось работой с объектами файловой системы или функциями типа file_exists (в php) или Файл.Существует() (в 1С) - получаем сразу результат и пишем дальше алгоритм действий. Ведь просто же получем объект Файл, смотрим результат Файл.Существует() и в зависимости от результата делаем дополнительные действия:
КаталогНаДиске = Новый Файл(ИмяКаталога);
Если КаталогНаДиске.Существует() Тогда
Возврат Истина;
Иначе
Ответ = Вопрос("Каталог не существует. Создать?", РежимДиалогаВопрос.ОКОтмена);
Если Ответ = КодВозвратаДиалога.ОК Тогда
СоздатьКаталог(ИмяКаталога);
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецЕсли;
Но с 2009 года в 1С стало все по-другому и теперь мы имеем встроенный метод НачатьПроверкуСуществования. И результат этой проверки мы получим не сразу, а уже внутри другой функции, специально указанной внутри вызова. Получается неудобно, длинно и непонятно где искать. Но так нам говорят необходимо для web. И маркетологи уже шепчут нам в ухо - это же асинхронно...
И вот тут у меня возникает диссонанс. То есть нам хотят сказать, что получение существования файла это длительный процесс запроса к удаленной системе и ожидание ответа от нее? Стоп, но на сервере не нужно никаких НачатьПроверку, там все прекрасно работает Файл.Существует(). То есть если мы переходим на событийную модель, как в nodеjs то это должно работать именно на сервере.
Так как же нам работать (что делать) и как во всем этом разобраться (кто виноват).
На первый вопрос практика и стальные нервы принесут нам плоды успеха.
Для циклической проверки существования файлов мы используем зацикливание на себя типа с правильной точкой входа и выхода из стека вызовов типа:
&НаКлиенте
Процедура ПолучитьМассивДисковКомпьютераЗавершение(Существует, ДополнительныеПараметры) Экспорт
Номер = ДополнительныеПараметры.Номер;
Файл = ДополнительныеПараметры.Файл;
Поз = ДополнительныеПараметры.Поз;
Если Существует Тогда
НовыйЭлемент = ДеревоПапок.ПолучитьЭлементы().Добавить();
НовыйЭлемент.Папка = Файл.ПолноеИмя;
НовыйЭлемент.ЭтоПапка = Истина;
НовыйЭлемент.ДочерниеЗагружены = Ложь;
НовыйЭлемент.ПолучитьЭлементы().Добавить();
Элементы.ДеревоПапок.Обновить();
КонецЕсли;
Если Номер < НачальныйСписокКорневыхПапок.Количество() - 1 Тогда
Номер = Номер + 1;
Файл = Новый Файл(НачальныйСписокКорневыхПапок[Номер].Значение);
Файл.НачатьПроверкуСуществования(Новый ОписаниеОповещения("ПолучитьМассивДисковКомпьютераЗавершение", ЭтаФорма, Новый Структура("Файл, Номер, Поз", Файл, Номер, Поз)));
КонецЕсли;
КонецПроцедуры
Многие скажут, что стоит подождать еще немного и с 8.3.18 можно будет писать в циклах
СуществуетФайл = Ждать Файл.СуществуетАсинх();
Но немногие понимают, что это практически немного другая оболочка закручивания того же самого, просто 1С воспользовалась текущей технологией Web(promise) по организации по организации получения многочисленных данных из удаленной системы, применив ее к задаче на локальной машине.
Так что же нам предложили в 2009 году как прикладным программистам? Получается нам предложили callback, завернутый в ОписаниеОповешения(). И даже функции работы с обещаниями в 8.3.18 не меняют этой сути, а просто перепаковывают примерно как программисты javascript свои callback-и в promise. Но в отличие от Web вся остальная схема работы 1С осталась синхронной. Взаимодействие с сервером в 1С само синхронно - последовательно вызываются функции клиента и сервера, ответ у HTTPЗапрос - получаем последовательно. А ОписаниеОповещения повесили на клиента и функции взаимодействия с пользователем. Бардак в головах?
Нет не все функции в 1С будут прикрывать столь срамную реализацию. Есть и правильная тенденция в ПолучитьФайлССервера с Оповещением и в них мы как раз начинаем получать правильное использование технологии. И это радует.
В второе важное, будем разбираться.
В Web всегда была важна безопасность. Локальная файловая система отделена от доступа скриптов в браузере. Но 1С здесь решила сделать "все для пользователей" в результате при установке Расширений для работы с файлами, мы получаем доступ к локальной файловой системе. Да с подтверждением разрешения однократного и навсегда, но пускает и в техническом понимании это вызывает взрыв мозга. Ведь в Вэб пользователь каждый раз своими действиями переносить локальный файл, с которым будет работать в зону ответственности сервера. И это совсем не тоже, что дать разрешение однократно.
Берем вот так просто и копируем выделенные файлы с сервера на указанную папку пользовательской машины в браузере.
Выделяем файлы для переноса, выделаем паку назначения и нажимаем копировать.
А функция НачатьЗапускПриложения с доступностью в браузере заставляет сердце йокать и подозревать что-то сильно нехорошее.
Но главное же быть полезным, а не правдивым ведь правда ;)
И для ИСКЛЮЧИТЕЛЬНО для полезности предлагаю обработку для работы с файловыми системами клиента и сервера в виде всеми любимых двух панелей по типу FAR, Norton Commander.
Чтобы пленить оригинальностью подхода, приведу список ссылок:
Р.S.
Проблема в мобильной приложении это поиск корневых папок, Android это будет типа /storage/emulated/0 или другое специально подобранное и доступ опять такой как у всей платформы 1С. Возможность накосячить большая ;)