Доброго времени суток!
Долгое время, изучая изменения функций работы с файлами в 1С, я не понимал, что же нам предлагают. Нет, старый дубовый подход со времен 7.7 был прост и понятен. Но новый, «безмодальный», «асинхронный» и еще «Расширения для работы с Файлами» в браузере в принудительном варианте всегда вызывали вопросы. Пришло время разобраться.
Так что же мы имели раньше?
Для программиста получение информации о файле всегда сопровождалось работой с объектами файловой системы или функциями типа file_exists (в php) или Файл.Существует() (в 1С) — получаем сразу результат и пишем дальше алгоритм действий. Ведь просто же получим объект Файл, смотрим результат Файл.Существует() и в зависимости от результата делаем дополнительные действия:
|
КаталогНаДиске = Новый Файл(ИмяКаталога); Если КаталогНаДиске.Существует() Тогда Возврат Истина; Иначе Ответ = Вопрос("Каталог не существует. Создать?", РежимДиалогаВопрос.ОКОтмена); Если Ответ = КодВозвратаДиалога.ОК Тогда СоздатьКаталог(ИмяКаталога); Возврат Истина; Иначе Возврат Ложь; КонецЕсли; КонецЕсли; |
Но с 2009 года в 1С стало все по-другому и теперь мы имеем встроенный метод НачатьПроверкуСуществования. И результат этой проверки мы получим не сразу, а уже внутри другой функции, специально указанной внутри вызова. Получается неудобно, длинно и непонятно где искать. Но так нам говорят необходимо для web. И маркетологи уже шепчут нам в ухо — это же асинхронно…
И вот тут у меня возникает диссонанс. То есть нам хотят сказать, что получение существования файла это длительный процесс запроса к удаленной системе и ожидание ответа от нее? Стоп, но на сервере не нужно никаких НачатьПроверку, там все прекрасно работает Файл.Существует(). То есть если мы переходим на событийную модель, как в nodеjs то это должно работать именно на сервере.
Так как же нам работать (что делать) и как во всем этом разобраться (кто виноват).
На первый вопрос практика и стальные нервы принесут нас плоды успеха.
Для циклической проверки существования файлов мы используем зацикливание на себя типа:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
&НаКлиенте Процедура ПолучитьМассивДисковКомпьютераЗавершение(Существует, ДополнительныеПараметры) Экспорт Номер = ДополнительныеПараметры.Номер; Файл = ДополнительныеПараметры.Файл; Поз = ДополнительныеПараметры.Поз; Если Существует Тогда НовыйЭлемент = ДеревоПапок.ПолучитьЭлементы().Добавить(); НовыйЭлемент.Папка = Файл.ПолноеИмя; НовыйЭлемент.ЭтоПапка = Истина; НовыйЭлемент.ДочерниеЗагружены = Ложь; НовыйЭлемент.ПолучитьЭлементы().Добавить(); Элементы.ДеревоПапок.Обновить(); КонецЕсли; Если Номер < НачальныйСписокКорневыхПапок.Количество() - 1 Тогда Номер = Номер + 1; Файл = Новый Файл(НачальныйСписокКорневыхПапок[Номер].Значение); Файл.НачатьПроверкуСуществования(Новый ОписаниеОповещения("ПолучитьМассивДисковКомпьютераЗавершение", ЭтаФорма, Новый Структура("Файл, Номер, Поз", Файл, Номер, Поз))); КонецЕсли; КонецПроцедуры |
Многие скажут, что стоит подождать еще немного и с 8.3.18 можно будет писать в циклах
|
СуществуетФайл = Ждать Файл.СуществуетАсинх(); |
Но немногие понимают, что это практически немного другая оболочка закручивания того же самого, совместимая с современными названиями из javascript (Модненько).
Так что же нам предложили в 2009 году как прикладным программистам? Получается нам предложили callback, завернутый в ОписаниеОповешения(). И даже функции работы с обещаниями в 8.3.18 не меняют этой сути, а просто перепаковывают примерно как программисты javascript свои callback-и в promise. Но в отличие от Web вся остальная схема работы 1С осталась синхронной. Взаимодействие с сервером в 1С само синхронно — последовательно вызываются функции клиента и сервера, ответ у HTTPЗапрос — получаем последовательно. А ОписаниеОповещения повесили на клиента и функции взаимодействия с пользователем. Бардак в головах?
Нет не все функции в 1С будут прикрывать столь срамную реализацию. Есть и правильная тенденция в ПолучитьФайлССервера с несколькими Оповещениями(callback) и в них мы как раз начинаем получать правильное использование технологии. И это радует.
В второе важное, будем разбираться.
В Web всегда была важна безопасность. Локальная файловая система отделена от доступа скриптов в браузере. Но 1С здесь решила сделать «все для пользователей» в результате при установке Расширений для работы с файлами, мы получаем доступ к локальной файловой системе. Да с подтверждением разрешения, но пускает и в техническом понимании это вызывает взрыв мозга.
Берем вот так просто и копируем выделенные файлы с сервера на указанную папку пользовательской машины в браузере.
Выделяем файлы для переноса, выделаем паку назначения и нажимаем копировать.
А функция НачатьЗапускПриложения с доступностью в браузере заставляет сердце йокать и подозревать что-то сильно нехорошее.
Но главное же быть полезным, а не правдивым ведь правда 😉
И для ИСКЛЮЧИТЕЛЬНО для полезности предлагаю обработку для работы с файловыми системами клиента и сервера в виде всеми любимых двух панелей по типу FAR, Norton Commander. — https://infostart.ru/public/1295065/
Р.S.
Проблема в мобильной приложении это поиск корневых папок, Android это будет типа /storage/emulated/0 или другое специально подобранное и доступ опять такой как у всей платформы 1С. Возможность накосячить большая 😉