|
Асинхронность в цикле | ☑ | ||
---|---|---|---|---|
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С модальности"
|
|||
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/ |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |