|
Синхронные vs асинхронные | ☑ | ||
---|---|---|---|---|
0
Cool_Profi
21.09.18
✎
14:21
|
Начал тут переделывать код под асинхронные вызовы...
С оповещениями и выборами файлов понятно.. Но вот тут такой код у меня нарисовался &НаКлиенте Функция ПолучитьТекстИзФайла(п_ПутьКФайлу) л_Файл = Новый Файл(п_ПутьКФайлу); Если НЕ л_Файл.Существует() Тогда ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Файл " + п_ПутьКФайлу + " не существует. Загрузка невозможна."); Возврат Неопределено; КонецЕсли; л_ТекстДок = Новый ТекстовыйДокумент; л_ТекстДок.Прочитать(п_ПутьКФайлу); Возврат л_текстДок.ПолучитьТекст(); КонецФункции Как видно - он проверяет наличие файла и при существовании - возвращает текст из него. Как такое переделать на асинхроны без заведения лишних переменных... |
|||
1
Lexey_
21.09.18
✎
14:29
|
(0) НачатьПроверкуСуществования()
|
|||
2
Hans
21.09.18
✎
14:30
|
У тебя этот код превратится в 3 -4 процедуры.
|
|||
3
Cool_Profi
21.09.18
✎
14:31
|
(1) Это и ежу понятно. Как дальше значение возвращать? Кроме как заведение внешней переменной с результатом опроса - я не вижу пока
|
|||
4
Hans
21.09.18
✎
14:32
|
(3) Параметры пробрасываются ведь в Описание оповещения.
|
|||
5
Hans
21.09.18
✎
14:33
|
(4) Которые потом появляются в "ПроверкаФАйлаЗавершение"
|
|||
6
Cool_Profi
21.09.18
✎
14:35
|
(4) Да, но там же процедура в оповещении... И более того...
У меня эта функция вызывается где-то так: ИмяФайла = ....; Полученныйтекст = ПолучитьТекстИзФайла(ИмяФайла); Если ПолученныйТекст = Неопределено Тогда Возврат; Иначе обработатьТекст(ПолученныйТекст); КОнецЕсли; И вот тут начинаются несовсемпонятки... |
|||
7
Hans
21.09.18
✎
14:44
|
Вот это у тебя будут последние строчки в процедуре
ИмяФайла = ....; ПолучитьТекстИзФайла(ИмяФайла); А потом в ОбработчикеОповещения НачатьЧтениеЗавершение будешь дальше работать с текстом: Если ПолученныйТекст = Неопределено Тогда Возврат; Иначе обработатьТекст(ПолученныйТекст); КОнецЕсли; |
|||
8
Hans
21.09.18
✎
14:45
|
Т. е. получается вместо нормально структурированой процедуры - овнокод.
|
|||
9
Cool_Profi
21.09.18
✎
14:51
|
(8) Вот и я про то говорю... Намудрили... Но переделывать, похоже, придётся... 1с (фирма) может на проверке зарубить (((
|
|||
10
Cyberhawk
21.09.18
✎
15:18
|
(9) Тиражная конца какая-то? "1С:Совместимо" мутишь?
|
|||
11
Cool_Profi
21.09.18
✎
15:19
|
(10) Устроился на работу в контору, которая уже не первый год такое делает. И проходит успешно. И свои коробки продаёт
|
|||
12
Вафель
21.09.18
✎
16:20
|
вот такое вот Г у нас в тиражных )))
|
|||
13
Franchiser
гуру
21.09.18
✎
16:25
|
(11) беги оттуда
|
|||
14
Numerus Mikhail
21.09.18
✎
16:25
|
А кто-нибудь может объяснить зачем в конкретно этом случае нужно так делать? Какие плюсы у этого будут?
|
|||
15
Cyberhawk
21.09.18
✎
16:26
|
(12) (13) Почему Г?
|
|||
16
Cool_Profi
21.09.18
✎
16:27
|
(13) В нащшей деревне не так много приличных рабодателей, чтобы так ими раскидываться
|
|||
17
Cool_Profi
21.09.18
✎
16:27
|
(15) По определению
|
|||
18
Cyberhawk
21.09.18
✎
16:29
|
(14) https://1c.ru/rus/products/1c/predpr/compat/soft/requirements.htm
Пункт 2.5.16 "При разработке конфигураций, предназначенных для работы в веб-клиенте, запрещено использовать модальные формы и диалоги. ... Для этого свойство конфигурации "Режим использования модальности" должен быть установлено в "Не использовать", а вместо модальных методов следует вызывать их немодальные аналоги с блокированием окна владельца или всего интерфейса." Видимо у ТС конфа заявлена с поддержкой веб-клиента. |
|||
19
Cyberhawk
21.09.18
✎
16:30
|
(16) Какой регион (примерно)?
|
|||
20
упороный
21.09.18
✎
16:30
|
(16) Калуга?
|
|||
21
Cool_Profi
21.09.18
✎
16:34
|
(20) Нет
(19) Дальнее подмосковье |
|||
22
novichok79
21.09.18
✎
17:01
|
мои 5 копеек говнокода
&НаКлиенте Процедура ОбработатьВыборЛогФайла(ВыбранныйЭлемент) РезультатПередачи = ЯРоняю1ССервер.ПередатьФайлНаКлиентВХранилище(ВыбранныйЭлемент.Значение, УникальныйИдентификатор); АдресВХранилище = РезультатПередачи.АдресВХранилище; ТекстОшибки = РезультатПередачи.ТекстОшибки; Если Не ПустаяСтрока(ТекстОшибки) Тогда ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, , Элементы.НадписьЛогФайлы.Имя); Иначе Если Не ЗначениеЗаполнено(АдресВХранилище) Тогда ОбщегоНазначенияКлиентСервер.СообщитьПользователю( СтрШаблон(НСтр("ru = 'Файл ""%1"" не найден на сервере!'"), ВыбранныйЭлемент.Значение), , Элементы.НадписьЛогФайлы.Имя); ИначеЕсли ТипЗнч(АдресВХранилище) = Тип("Строка") И ЭтоАдресВременногоХранилища(АдресВХранилище) Тогда ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(АдресВХранилище); ВременныйФайл = ПолучитьИмяВременногоФайла("txt"); ДополнительныеПараметры = Новый Структура; ДополнительныеПараметры.Вставить("ВременныйФайл", ВременныйФайл); Обработчик = Новый ОписаниеОповещения( "ОбработатьВыборЛогФайлаУдачнаяЗапись", ЭтотОбъект, ДополнительныеПараметры, "ОбработатьВыборЛогФайлаОшибкаПриЗаписи", ЭтотОбъект); ДвоичныеДанныеФайла.НачатьЗапись(Обработчик, ВременныйФайл); КонецЕсли; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ОбработатьВыборЛогФайлаУдачнаяЗапись(ДополнительныеПараметры) Экспорт ВременныйФайл = ДополнительныеПараметры.ВременныйФайл; Попытка ЗапуститьПриложение(ВременныйФайл); Исключение ОбщегоНазначенияКлиентСервер.СообщитьПользователю( СтрШаблон(НСтр("ru = 'Не удалось открыть лог-файл ""%1"" по причине ошибки: |%2'"), ДополнительныеПараметры.ВременныйФайл, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())), , Элементы.НадписьЛогФайлы.Имя); КонецПопытки; ЯРоняю1СКлиент.ДобавитьФайлВоВременные(ВременныйФайл); КонецПроцедуры &НаКлиенте Процедура ОбработатьВыборЛогФайлаОшибкаПриЗаписи(ИнформацияОбОшибке, СтандартнаяОбработка, ДополнительныеПараметры) Экспорт СтандартнаяОбработка = Ложь; ОбщегоНазначенияКлиентСервер.СообщитьПользователю( СтрШаблон(НСтр("ru = 'Не удалось открыть лог-файл ""%1"" по причине ошибки: |%2'"), ДополнительныеПараметры.ВременныйФайл, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)), , Элементы.НадписьЛогФайлы.Имя); КонецПроцедуры |
|||
23
Numerus Mikhail
21.09.18
✎
17:06
|
(18) Но ведь Существует() никак не связан с модальностью.
Или я чего-то не знаю? |
|||
24
Cool_Profi
21.09.18
✎
17:09
|
(23) Проверка конфигурации на него тыкает пальцем. И есть метод начать проверку существования. Значит, связан.
Только не с модальностью, а с синхронностью. |
|||
25
Garykom
гуру
21.09.18
✎
17:12
|
Гм кто хотя бы в курсе каким образом веб-клиент 1С работает с файловой системой?
|
|||
26
Garykom
гуру
21.09.18
✎
17:12
|
(25)+ Поймете как и через какое место - сразу пропадут все вопросы и про модальность и про синхронность!
|
|||
27
Numerus Mikhail
21.09.18
✎
17:13
|
(25) Где про это почитать?
|
|||
28
Garykom
гуру
21.09.18
✎
17:15
|
(27) Эээто же стандартно и легко догадаться.
JS в браузере работает в песочнице и дальше нее выползти не может, но может по сети общаться локально. И можно запустить локальное внешнее сетевое приложение (плагин или расширение браузера) которое уже общается с JS внутри веб-страницы (веб-клиента 1С) и работает с файловой системой через операционку. |
|||
29
Skylark
21.09.18
✎
18:04
|
(0) Кури в типовых модули начинающиеся на "ПередачаФайлов" (или "РаботаСФайлами"? не помню точно). И примеры использования процедур из них типа
ПередачаФайлов.ПередатьФайлыНаСервер(ОповещениеОЗагрузкеФайлов, ПомещаемыеФайлы, ЭтаФорма.УникальныйИдентификатор); |
|||
30
Cyberhawk
21.09.18
✎
18:12
|
(23) Да, точно.
В приведенном фрагменте текста (требования для "1С:Совместимо") кстати не упоминается о запрете использования синхронных вызовов |
|||
31
Garykom
гуру
21.09.18
✎
18:16
|
(30) Скорее всего дело не в "1С:Совместимо" (ибо никто не мешает писать конфы под ОФ или даже старые платформы) а во Фреше и веб-клиентах.
|
|||
32
Cool_Profi
26.09.18
✎
11:01
|
Возвращаясь к теме.
Пришлось переделать на асинхронные. Вот такое получилось: &НаКлиенте Процедура ПолучитьТекстИзФайла(п_ПутьКФайлу) л_ТекстДок = Новый ТекстовыйДокумент; л_ТекстДок.НачатьЧтение(Новый ОписаниеОповещения("ПолучитьТекстИзФайла_Завершение", ЭтотОбъект,,"ПолучитьТекстИзФайла_Ошибка", ЭтотОбъект), п_ПутьКФайлу); КонецПроцедуры &НаКлиенте Процедура ПолучитьТекстИзФайла_Завершение(п_текстФайла) Экспорт ЭтотОбъект.ТекстКлассификатора = п_текстФайла; Оповестить("Чтение закончено"); КонецПроцедуры &НаКлиенте Процедура ПолучитьТекстИзФайла_Ошибка() Экспорт а = 1; КонецПроцедуры Но в завершении прилетает неопределено... Ошибок нет. Всё выполняется на клиенте, файл существует и права на него есть точно. Что я не так сделал? |
|||
33
Вафель
26.09.18
✎
11:02
|
(32) лучше через ЧтениеТекста делать
|
|||
34
Вафель
26.09.18
✎
11:02
|
И он синхронный
|
|||
35
Cool_Profi
26.09.18
✎
11:07
|
(34) Вот именно, что синхронный. А мне нужна асинхронность.
|
|||
36
Вафель
26.09.18
✎
11:07
|
(35) зачем?
|
|||
37
Вафель
26.09.18
✎
11:07
|
Он синхронный и это не приводит к ошибке
|
|||
38
Cool_Profi
26.09.18
✎
11:09
|
(36) "РегистрСведений.МойРег.Форма.ФормаСписка.Форма Использование синхронного вызова: "Прочитать""
Нарушение 1с-совместимо |
|||
39
Cool_Profi
26.09.18
✎
11:09
|
(37) У меня ошибки при выполнении и так нет )) А вот правила нарушаются
|
|||
40
Lexey_
26.09.18
✎
11:11
|
(32) "Но в завершении прилетает неопределено... "
НачатьЧтение() Параметры: <ОписаниеОповещения> (необязательный) Тип: ОписаниеОповещения. Содержит описание процедуры, которая будет вызвана после завершения чтения файла со следующими параметрами:•<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения. |
|||
41
Вафель
26.09.18
✎
11:11
|
(38) у тебя именно ЧтениеТекста было?
|
|||
42
Lexey_
26.09.18
✎
11:12
|
(32) что передаешь, то и прилетает
|
|||
43
Cool_Profi
26.09.18
✎
11:15
|
(40) А где тогда текст прочитанный?
(41) нет |
|||
44
tesseract
26.09.18
✎
11:15
|
(32)>>ЭтотОбъект,,"ПолучитьТекстИзФайла_Ошибка", ЭтотОбъект)
Почему ЭтотОбъект? Форма же должна быть, у тебя оповещение в форму должно возвращаться. (33) Чтение текста не читает файл при открытии, это для буферизованной обработки больших файлов. Теперь уже есть двоичные данные, они лучше тк можно передавать в другие объекты. (40) Туда просто пустую структуру. |
|||
45
Cool_Profi
26.09.18
✎
11:16
|
(44) ЭтотОбъект в новых платформах в модуле формы - это старая ЭтаФорма
|
|||
46
Lexey_
26.09.18
✎
11:18
|
(43) как где? в переменной л_ТекстДок
|
|||
47
Cool_Profi
26.09.18
✎
11:19
|
(46) л_текстДок - это локальная переменная. В другой она просто не существует.
Или я чего-то не понимаю... Где можно почитать про эти асинхроные вызовы? |
|||
48
Lexey_
26.09.18
✎
11:22
|
(47) ну так передай ее через параметр описания оповещения
|
|||
49
Cool_Profi
26.09.18
✎
11:25
|
(48) Я вроде уже допёр...
Зы. Дайте мне пулемёт и билет в Москву... |
|||
50
tesseract
26.09.18
✎
11:27
|
(45) С какой версии ЭтотОбъект стал формой?
(49) У нас 1С Бит и тензор и так много кого привозит. |
|||
51
Вафель
26.09.18
✎
11:27
|
(50) давно уже так
|
|||
52
tesseract
26.09.18
✎
11:29
|
(51) Не замечал. Реквизиты формы и уникальный идентификатор?
|
|||
53
Cool_Profi
26.09.18
✎
11:30
|
(50) У меня в 8,3,12 - на клиенте это управляемая форма
|
|||
54
Cool_Profi
26.09.18
✎
11:31
|
||||
55
tesseract
26.09.18
✎
11:34
|
(53) Это общая форма, или форма объекта? Хотя на клиенте да, там нет объекта как такового. Возможно как раз не применяю тк контекст может прыгать. Лучше используй форму.
|
|||
56
Вафель
26.09.18
✎
11:35
|
(52) с самых первых версий 8.3
|
|||
57
tesseract
26.09.18
✎
11:36
|
(56) Да я уже понял - ЭтотОбъект просто контекстно зависимый.
|
|||
58
Вафель
26.09.18
✎
11:38
|
(57) Это синоним ЭтаФорма просто - для унификации
|
|||
59
Вафель
26.09.18
✎
11:39
|
Хотя я так и не понял чем чтение текста не угодило
|
|||
60
Cool_Profi
26.09.18
✎
11:39
|
(55) Это форма встроенной обработки. Для объектов метаданных то же самое
|
|||
61
Cool_Profi
26.09.18
✎
11:40
|
(59) А у него есть асинхронный вызов чтения?
|
|||
62
Вафель
26.09.18
✎
11:41
|
(61) он там НЕ нужен, его не нужно переделывать.
Не все объекты нужно переделывать под асинхронное. Поставь в конфе запретить синхронные и увидь |
|||
63
tesseract
26.09.18
✎
11:42
|
(58) Если процедура выполняется на сервере, там ЭтотОбъект и ЭтаФорма - будут разными.
(59) Там надо поток делать. Если у кула 8/3/12 - поток будет быстрее. ЧтениеТекста отлично работает через поток. |
|||
64
Cool_Profi
26.09.18
✎
11:42
|
(62) Есть требования к коробочным конфигурациям - не должно быть синхронных вызовов. Так что тут правила пишу не я
|
|||
65
tesseract
26.09.18
✎
11:43
|
(61) Есть - если создать на основании потока, но не забывай объявлять ссылку в реквизитах формы или переменной на клиенте, а то потеряешь саму ссылку на поток.
|
|||
66
Новиков
26.09.18
✎
11:58
|
(63) >>Там ЭтотОбъект и ЭтаФорма - будут разными.
В чем же отличие? |
|||
67
Вафель
26.09.18
✎
11:59
|
(64) ладно, что с убогово взять
|
|||
68
Вафель
26.09.18
✎
11:59
|
(63) из файла можно без всяких потоков читать
|
|||
69
tesseract
26.09.18
✎
12:02
|
(66) Посмотри в отладчике.
(68) ЧтениеТекста поддерживает асинхронное чтение только через поток. Если у тебя Вебклиент, то это единственный выход, ТекстовыйДокумент сцука тяжелый. |
|||
70
Новиков
26.09.18
✎
12:04
|
(69) я посмотрел и глазами, и отладчиком.
ЭтаФорма = ЭтотОбъект ИСТИНА Так чем они отличаются? |
|||
71
tesseract
26.09.18
✎
12:06
|
(70) Контекстно зависимое.
|
|||
72
Вафель
26.09.18
✎
12:09
|
(71) что ты подразумеваешь по этим словом
|
|||
73
tesseract
26.09.18
✎
12:14
|
(72) В разных процедурах будет получен объект разного типа. Я на клиенте предпочитаю не работать и давно сказал, что я был не прав. Предпочитаю строгую типизацию.
|
|||
74
Новиков
26.09.18
✎
12:14
|
(71) Коллега, конкретики можно поболее. Конкретный кейс, где эти два объекта разные и как это проявляется? Можешь привести пример?
|
|||
75
Cool_Profi
26.09.18
✎
12:24
|
(63) Ты ошибаешься. На клиенте и на сервере в модуле формы - ЭтотОбъект - это управляемая форма.
|
|||
76
Вафель
26.09.18
✎
12:27
|
чтение текста на веб клиенте нельзя. поэтому мой совет отменяется
|
|||
77
Новиков
26.09.18
✎
12:31
|
(75) ну вот. Испортил все малину.
|
|||
78
tesseract
26.09.18
✎
12:32
|
(74) Вызови метод объекта из формы.
(75) В первом случае будут элементы формы с событиями и прочим, во втором - данные переданные на сервер. (76) Пролистал - вместо него теперь НачатьЧтение, читает что угодно. |
|||
79
Вафель
26.09.18
✎
12:38
|
(78) где ты увидел НачатьЧтение?
|
|||
80
tesseract
26.09.18
✎
12:44
|
(79) В справке - тоже самое, но теперь и двоичные данные может читать.
|
|||
81
Вафель
26.09.18
✎
12:45
|
сам объект ЧтениеТекста не доступен в веб клиенте
|
|||
82
singlych
26.09.18
✎
12:46
|
(32) Параметр у оповещения ПолучитьТекстИзФайла_Завершение должен быть только один, и это - структура ДополнительныеПараметры. В нее надо помещать твой текстовый док в конструкторе оповещения. Типа
... л_ТекстДок = Новый ТекстовыйДокумент; ДополнительныеПараметры = Новый Структура("ТектДок", л_ТекстДок); Оповещение = Новый ОписаниеОповещения("ПолучитьТекстИзФайла_Завершение", ЭтотОбъект, ДополнительныеПараметры,"ПолучитьТекстИзФайла_Ошибка", ЭтотОбъект); л_ТекстДок.НачатьЧтение(Оповещение, п_ПутьКФайлу); .... а в ПолучитьТекстИзФайла_Завершение пишешь Процедура ПолучитьТекстИзФайла_Завершение(ДополнительныеПараметры) Экспорт ЭтотОбъект.ТекстКлассификатора = ДополнительныеПараметры.ТекстДок.ПолучитьТекст(); Оповестить("Чтение закончено"); КонецПроцедуры как-то так |
|||
83
Новиков
26.09.18
✎
12:46
|
(78) я который раз уже прошу - приведи конкретный кусок кода, где наглядно бы показывались отличия этих двух объектов. Ты сознательно уходишь от ответа. Ты в курсе чем отличаются эти объекты - так покажи код. Зачем ты пишешь - вызови метод объекта из формы? Покажи код, где эти два объекта различаются - это сложно или что?
|
|||
84
singlych
26.09.18
✎
12:47
|
(82) а, уже все рассказали.
|
|||
85
tesseract
26.09.18
✎
12:51
|
(83) А самому слабо? Переменные будут доступны? Типы значений у реквизитов формы будут сохраняться при серверном и клиентском вызове?
|
|||
86
tesseract
26.09.18
✎
12:52
|
(81) НачатьЧтение - это фактически асинхронный аналог ЧтениеТекста.
|
|||
87
Вафель
26.09.18
✎
12:52
|
(85) конечно
|
|||
88
Вафель
26.09.18
✎
12:53
|
(86) покажи как ты на веб клиенте прочитаешь файл без текстового документа
|
|||
89
Новиков
26.09.18
✎
12:54
|
(85) ты делаешь вброс, а не я. Ты это декларируешь, направил меня в отладчик - я посмотрел, отличий нет, ну что соответствует документации, которую ты не читал. Я прошу в корректной форме - представь куски кода, ты перешел на слабо. Ну, дальше будем продолжать? Никакого кода, подтверждающего свою правоту ты не предоставишь. Поэтому, зря ты так нервничаешь. Достаточно признать свою ошибку :) Мы же не дети и не спорим на деньги.
|
|||
90
Мыш
26.09.18
✎
12:58
|
Можно ещё так: НачатьСозданиеДвоичныхДанныхИзФайла()
|
|||
91
Вафель
26.09.18
✎
12:59
|
(90) как ты из двоичных данных вытянешь текст?
|
|||
92
Мыш
26.09.18
✎
13:01
|
(91)
Поток = ДвоичныеДанные.ОткрытьПотокДляЧтения(); ЧтениеТекста = Новый ЧтениеТекста(Поток); |
|||
93
Вафель
26.09.18
✎
13:02
|
(92) см (81)
|
|||
94
Мыш
26.09.18
✎
13:03
|
(93) Двоичные данные можно передавать на сервер.
|
|||
95
Cool_Profi
26.09.18
✎
13:04
|
Возвращаемся к спору о ЭтотОбъект.
В модуле формы - на сервере и на клиенте ЭтотОбъект и ЭтаФорма - эквиваленты. В модуле объекта - ЭтотОбъект - уже объект, а ЭтаФорма недоступна. |
|||
96
Cyberhawk
26.09.18
✎
13:05
|
(95) Открыл америку ))
|
|||
97
Вафель
26.09.18
✎
13:06
|
(94) можно и сам файл на сервер передать
|
|||
98
Мыш
26.09.18
✎
13:06
|
(97) Тоже вариант, да. Зависит от задачи.
|
|||
99
Ник080808
26.09.18
✎
13:07
|
(95) ЭтотОбъект и ЭтаФорма - эквиваленты. - Это как форма и объект эквивалентны?
|
|||
100
Вафель
26.09.18
✎
13:08
|
(99) не форма и объект, а Эта форма и Этот объект )))
|
|||
101
Новиков
26.09.18
✎
13:09
|
(95) про модуль объекта речи не было. Коллега грозился подтвердить отличие этих двух объектов в модуле формы :)
|
|||
102
tesseract
26.09.18
✎
13:17
|
(95) У меня хреново с диалектикой, тут тяжело спорить:-)
(101) Это тебе так показалось. |
|||
103
Ник080808
26.09.18
✎
13:18
|
(100) шо, в этотобъект реквизиты формы тоже участвуют? ща проверю
|
|||
104
singlych
26.09.18
✎
14:50
|
Ну вы блин проснулись спустя пять лет.
https://its.1c.ru/db/metod8dev#content:5293:hdoc:pereimenovaniya_metodov_i_svojstv |
|||
105
Вафель
26.09.18
✎
14:51
|
(103) это синонимы
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |