Вход | Регистрация
 

Асинхронность в цикле

Асинхронность в цикле
Я
   СинийКот
 
13.10.20 - 18:30
Я уже здесь много задавал вопросов по асинхронности, как поступить с общим модулем типовой конфы, который весь написан на синхронных методах. В итоге стал переписывать весь общий модуль, постепенно, много уже сделал, но застрял на моменте, когда синхронный вызов осуществляется в цикле, а цикл, соответственно, выполняется в функции. Чтобы не быть голословным, скину фргамент кода, в котором проблема.

Функция ПолучитьУникальноеИмяСПутемАсихронно(ПараметрыВыполнения) Экспорт
<...>
Пока НЕ Успешно И ЦиклНомер < 100 Цикл
<...>
ФайлПопытки = ПолныйПодКаталог + ИмяФайла;
ФайлНаДиске = Новый Файл(ФайлПопытки);
Если НЕ ФайлНаДиске.Существует() Тогда  
    ИтоговыйПуть = ПодКаталог + ИмяФайла;
    Успешно = Истина;
КонецЕсли;
КонецЦикла;

Возврат ИтоговыйПуть;
КонецФункции

Я, соответственно, исправляю на НачатьПроверкуСуществования(). И никак не могу получить ИтоговыйПуть для дальнейшего использования.
   Garykom
 
1 - 13.10.20 - 18:55
(0) Логику поменяй
   Garykom
 
2 - 13.10.20 - 18:57
(0) Для начала ответь на вопрос, почему 100? Почему не 1000 или не 1 лям?
   Ненавижу 1С
 
3 - 13.10.20 - 19:19
(0) ну ты бы при успехе хотя бы из цикла выходил досрочно
   Ненавижу 1С
 
4 - 13.10.20 - 19:20
+(3) выходишь, сорри
   Ненавижу 1С
 
5 - 13.10.20 - 19:22
попахивает рекурсией
   rphosts
 
6 - 13.10.20 - 19:23
(0) у тебя в ИтоговыйПуть входит в конце НомерПопытки?
   rphosts
 
7 - 13.10.20 - 19:24
+ (6) Или НомерПопытки часть ИмяФайла?
   H A D G E H O G s
 
8 - 13.10.20 - 19:25
&НаКлиенте
Процедура ПолучитьУникальноеИмяСПутемАсихронноЗавершение(ФайлСуществует,ДополнительныеПараметры) Экспорт
    Если ФайлСуществует Тогда
        ДополнительныеПараметры.Счетчик=ДополнительныеПараметры.Счетчик+1;
        Если ДополнительныеПараметры.Счетчик>100 Тогда
            ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗавершении,Неопределено);
            Возврат;
        КонецЕсли;
        
        Оповещение=Новый ОписаниеОповещения("ПолучитьУникальноеИмяСПутемАсихронноЗавершение",ЭтотОбъект,ДополнительныеПараметры);
        ИмяФайла=СтрЗаменить(ДополнительныеПараметры.ШаблонИмениФайла,"$",Формат(ДополнительныеПараметры.Счетчик,"ЧГ="));
        ДополнительныеПараметры.Вставить("ИмяФайла",ИмяФайла);
        Файл=Новый Файл(ИмяФайла);
        Файл.НачатьПроверкуСуществования(Оповещение);
        Возврат;
    КонецЕсли;
    ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗавершении,ДополнительныеПараметры.ИмяФайла);
КонецПроцедуры

&НаКлиенте
Процедура ПолучитьУникальноеИмяСПутемАсихронно(ИмяФайла,ОповещениеОЗавершении)
    Файл=Новый Файл(ИмяФайла);
    ДополнительныеПараметры=Новый Структура();
    ДополнительныеПараметры.Вставить("ОповещениеОЗавершении",ОповещениеОЗавершении);
    ДополнительныеПараметры.Вставить("Счетчик",0);
    ДополнительныеПараметры.Вставить("ШаблонИмениФайла",Файл.Путь+"\"+Файл.ИмяБезРасширения+"_$"+Файл.Расширение);
    ПолучитьУникальноеИмяСПутемАсихронноЗавершение(Истина,ДополнительныеПараметры);
КонецПроцедуры

&НаКлиенте
Процедура Команда1Завершение(ИмяФайла,ЧтоМыПередаемВТочкуВыхода) Экспорт
    // Точка выхода

    Если ИмяФайла<>Неопределено Тогда
        Сообщить(ИмяФайла);
    КонецЕсли;
КонецПроцедуры


&НаКлиенте
Процедура Команда1(Команда)
    // Точка входа

    ЧтоМыПередаемВТочкуВыхода=Новый Структура;
    ОповещениеОЗавершении=Новый ОписаниеОповещения("Команда1Завершение",ЭтотОбъект,ЧтоМыПередаемВТочкуВыхода);
    ПолучитьУникальноеИмяСПутемАсихронно("c:\tmp\test.txt",ОповещениеОЗавершении);
КонецПроцедуры
   H A D G E H O G s
 
9 - 13.10.20 - 19:26
(2) Для начала надо покурить типовые, Игорь
   rphosts
 
10 - 13.10.20 - 19:28
(9) если счётчик цикла в составе имени файла - каталог можно прочитать за 1 проход и собственно посмотреть что там за файло уже есть.
   H A D G E H O G s
 
11 - 13.10.20 - 19:37
(10) СинийКот скорее всего подает на 1С:Совместимо и такое не прокатит.
Правда, это не мешает ему указать это в файл ОтсутствиеОшибок.xls с указанием "Особенность типовой".

Больше причин переходить на асихронность я не вижу.
   rphosts
 
12 - 13.10.20 - 19:41
(11) не обязательно, пару лет назад в нетленку нужно было запихать БИДО(https://its.1c.ru/db/biddoc), а для этого перевести на БСП... на одну из последних... пришлось перетряхнуть херову гору кода переходя на асинхрон.
   СинийКот
 
13 - 13.10.20 - 19:53
(11) Я писал в какой-то из тем, что заставляют на веб-клиент пересаживать сотрудников. Они там файлы не могут подгружать в программу, потому что модуль РаботаСФайламиСЛужебныйКлиент, который за это отвечает, весь на синхронных вызовах и вообще запрещает в Google Chrome и Firefox работать
(10) ИмяФайла прилетает в структуре ПараметрыВыполнения. В ней же ИмяКаталога, ПодКаталог это ИмяКаталога плюс разделители. Вроде номера попытки нет в составе имени, как я понимаю.
   H A D G E H O G s
 
14 - 13.10.20 - 20:02
(13) Хреновая из меня ванга
   RomanYS
 
15 - 13.10.20 - 21:13
(9) Да уж... открыл БП2
Трэш и угар
...
#Если Не ВебКлиент Тогда

    // ТекущаяДата() используется только для генерации случайного числа,

    // поэтому приведение к ТекущаяДатаСеанса не требуется.

    ГенераторСлучая = Новый ГенераторСлучайныхЧисел(Секунда(ТекущаяДата()));
#КонецЕсли

    
    Пока НЕ Успешно И ЦиклНомер < 100 Цикл
        НомерКаталога = 0;
#Если Не ВебКлиент Тогда

        НомерКаталога = ГенераторСлучая.СлучайноеЧисло(0, 25);
#Иначе

        // ТекущаяДата() используется только для генерации случайного числа,

        // поэтому приведение к ТекущаяДатаСеанса не требуется.

        НомерКаталога = Секунда(ТекущаяДата()) % 26;
#КонецЕсли
...

И модуль ..КлиентСервер, т.е. ТСу придётся переписывать ТОЛЬКО под клиент, а для сервера нужно умудриться оставить как есть.
   СинийКот
 
16 - 14.10.20 - 13:19
(8) Большое спасибо! Заменить цикл рекурсией как-то не пришло в голову. Продвинулся дальше - к следующему синхронному вызову:)
   sikuda
 
17 - 14.10.20 - 14:14
(16) Но самое важное, чтобы ты понял что это НИКАКОЕ НЕ АСИХРОННОЕ, это убирание методы перекручивания "1С модальности"
&НаКлиенте
Процедура ПолучитьМассивДисковКомпьютераЗавершение(Существует, ДополнительныеПараметры) Экспорт
    
    Номер = ДополнительныеПараметры.Номер;
    Файл  = ДополнительныеПараметры.Файл;
    Поз   = ДополнительныеПараметры.Поз;
    
    Если Существует Тогда
        НовыйЭлемент = ДеревоПапок.ПолучитьЭлементы().Добавить();
        НовыйЭлемент.Папка = Файл.ПолноеИмя;
        НовыйЭлемент.ЭтоПапка = Истина;
        НовыйЭлемент.ДочерниеЗагружены = Ложь;
        НовыйЭлемент.ПолучитьЭлементы().Добавить();
        Элементы.ДеревоПапок.Обновить();
    КонецЕсли;
    
    Если Номер < НачальныйСписокКорневыхПапок.Количество() - 1 Тогда
        Номер = Номер + 1;
        Файл = Новый Файл(НачальныйСписокКорневыхПапок[Номер].Значение);
        Файл.НачатьПроверкуСуществования(Новый ОписаниеОповещения("ПолучитьМассивДисковКомпьютераЗавершение", ЭтаФорма, Новый Структура("Файл, Номер, Поз", Файл, Номер, Поз)));
    КонецЕсли;    
    
КонецПроцедуры

   H A D G E H O G s
 
18 - 14.10.20 - 14:18
(17) Я правильно понимаю, что 1С подвиснет, когда будет искать существование файла (в далекой сети vpn, к примеру) при Файл.НачатьПроверкуСуществования()
?
   sikuda
 
19 - 14.10.20 - 14:20
(18) Ну там надо делать правильную точку входа. http://catalog.mista.ru/public/1295065/
   СинийКот
 
20 - 15.10.20 - 14:24
А еще вопрос, кто-нибудь когда-нибудь видел в 1С ошибку "File find is not opened"? В интернете и СП вообще ни слова о таком.
   ДенисЧ
 
21 - 15.10.20 - 14:26
(20) Дословно ошибку. И лучше - с картинкой
   СинийКот
 
22 - 15.10.20 - 15:19
   ДенисЧ
 
23 - 15.10.20 - 15:20
(22) А код, который к этому приводит?
   Вафель
 
24 - 15.10.20 - 16:20
жди 18 релиз. Там это будет легко провернуть
   СинийКот
 
25 - 15.10.20 - 17:36
(23)Код это гигантский общий модуль, одна процедура вызывается из другой. Даже не знаю какой из фрагментов скинуть для понимания... Если назову процедуры или скину некоторые, это вряд ли что-то даст. Я просто хотел узнать - вдруг у кого-то она появлялась.
И еще так же вылезает "Ошибка создания каталога" при создании каталога, соответственно, хотя все вроде написано согласно правилам 1С.
(24) Да, хорошо бы конечно дождаться промисов и всего остального, но увы решение требуют сейчас...
   H A D G E H O G s
 
26 - 15.10.20 - 17:39
(25) ProcessMonitor от Руссиновича в помощь
   sikuda
 
27 - 15.10.20 - 18:01
(25) Web-клиент? Права на папку записи есть?
   ДедМорроз
 
28 - 15.10.20 - 19:19
В web-браузеое с антивирусом,последний может блокировать операции,так как ему показалось,что надо.
   rphosts
 
29 - 15.10.20 - 19:21
(22) лезешь поискать в каталоге к которому нет доступа?
   mikecool
 
30 - 15.10.20 - 21:25
(25) а промисы разве не вышли три дня назад?
 
 Рекламное место пустует
   Cyberhawk
 
31 - 15.10.20 - 21:36
(30) А разве они режим совместимости не требуют повышать до 8.3.18?
   sikuda
 
32 - 15.10.20 - 22:03
(30) promise это часть ECMAscript6 и он вышел если не ошибаюсь в 2016, а "Обещания" от 1С появились три дня назад в 1С 8.3.18. И не надо это путать...
   sikuda
 
33 - 16.10.20 - 11:10
И важно понимать, что ПолучитьФайлССервера -> ПолучитьФайлССервераАсинх это здоровая тенденция
А ПоказатьВопрос -> ВопросАсинх -  это срамной костыль ;)
Кстати где в Вэб нужно применять promise или async для показа Вопроса?
https://www-1c.ru/wp-content/plugins/codemirror1c/run/question/


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.