|
|
| ||
СинийКот 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 | |||
СинийКот 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/ |
|
Список тем форума |