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

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

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

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

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

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


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

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

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

&НаКлиенте
Процедура ПолучитьМассивДисковКомпьютераЗавершение(Существует, ДополнительныеПараметры) Экспорт
    
    Номер = ДополнительныеПараметры.Номер;
    Файл  = ДополнительныеПараметры.Файл;
    Поз   = ДополнительныеПараметры.Поз;
    
    Если Существует Тогда
        НовыйЭлемент = ДеревоПапок.ПолучитьЭлементы().Добавить();
        НовыйЭлемент.Папка = Файл.ПолноеИмя;
        НовыйЭлемент.ЭтоПапка = Истина;
        НовыйЭлемент.ДочерниеЗагружены = Ложь;
        НовыйЭлемент.ПолучитьЭлементы().Добавить();
        Элементы.ДеревоПапок.Обновить();
    КонецЕсли;
    
    Если Номер < НачальныйСписокКорневыхПапок.Количество() - 1 Тогда
        Номер = Номер + 1;
        Файл = Новый Файл(НачальныйСписокКорневыхПапок[Номер].Значение);
        Файл.НачатьПроверкуСуществования(Новый ОписаниеОповещения("ПолучитьМассивДисковКомпьютераЗавершение", ЭтаФорма, Новый Структура("Файл, Номер, Поз", Файл, Номер, Поз)));
    КонецЕсли;    
    
КонецПроцедуры
18 H A D G E H O G s
 
14.10.20
14:18
(17) Я правильно понимаю, что 1С подвиснет, когда будет искать существование файла (в далекой сети vpn, к примеру) при Файл.НачатьПроверкуСуществования()
?
19 sikuda
 
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) Да, хорошо бы конечно дождаться промисов и всего остального, но увы решение требуют сейчас...
26 H A D G E H O G s
 
15.10.20
17:39
(25) ProcessMonitor от Руссиновича в помощь
27 sikuda
 
15.10.20
18:01
(25) Web-клиент? Права на папку записи есть?
28 ДедМорроз
 
15.10.20
19:19
В web-браузеое с антивирусом,последний может блокировать операции,так как ему показалось,что надо.
29 rphosts
 
15.10.20
19:21
(22) лезешь поискать в каталоге к которому нет доступа?
30 mikecool
 
15.10.20
21:25
(25) а промисы разве не вышли три дня назад?
31 Cyberhawk
 
15.10.20
21:36
(30) А разве они режим совместимости не требуют повышать до 8.3.18?
32 sikuda
 
15.10.20
22:03
(30) promise это часть ECMAscript6 и он вышел если не ошибаюсь в 2016, а "Обещания" от 1С появились три дня назад в 1С 8.3.18. И не надо это путать...
33 sikuda
 
16.10.20
11:10
И важно понимать, что ПолучитьФайлССервера -> ПолучитьФайлССервераАсинх это здоровая тенденция
А ПоказатьВопрос -> ВопросАсинх -  это срамной костыль ;)
Кстати где в Вэб нужно применять promise или async для показа Вопроса?
https://www-1c.ru/wp-content/plugins/codemirror1c/run/question/