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

  1  2   
1С:Предприятие :: 1С:Предприятие 8 общая

Синхронные vs асинхронные

Синхронные vs асинхронные
Я
   Cool_Profi
 
21.09.18 - 14:21
Начал тут переделывать код под асинхронные вызовы...
С оповещениями и выборами файлов понятно..

Но вот тут такой код у меня нарисовался

&НаКлиенте
Функция ПолучитьТекстИзФайла(п_ПутьКФайлу)
    л_Файл = Новый Файл(п_ПутьКФайлу);
    
    Если НЕ л_Файл.Существует() Тогда
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Файл " + п_ПутьКФайлу + " не существует. Загрузка невозможна.");
        Возврат Неопределено;
    КонецЕсли;
    
    л_ТекстДок = Новый ТекстовыйДокумент;
    л_ТекстДок.Прочитать(п_ПутьКФайлу);
    
    Возврат л_текстДок.ПолучитьТекст();
    
КонецФункции

Как видно - он проверяет наличие файла и при существовании - возвращает текст из него.
Как такое переделать на асинхроны без заведения лишних переменных...
 
 
   Lexey_
 
1 - 21.09.18 - 14:29
(0) НачатьПроверкуСуществования()
   Hans
 
2 - 21.09.18 - 14:30
У тебя этот код превратится в 3 -4 процедуры.
   Cool_Profi
 
3 - 21.09.18 - 14:31
(1) Это и ежу понятно. Как дальше значение возвращать? Кроме как заведение внешней переменной с результатом опроса - я не вижу пока
   Hans
 
4 - 21.09.18 - 14:32
(3) Параметры пробрасываются ведь в Описание оповещения.
   Hans
 
5 - 21.09.18 - 14:33
(4) Которые потом появляются в "ПроверкаФАйлаЗавершение"
   Cool_Profi
 
6 - 21.09.18 - 14:35
(4) Да, но там же процедура в оповещении... И более того...
У меня эта функция вызывается где-то так:

ИмяФайла = ....;
Полученныйтекст =  ПолучитьТекстИзФайла(ИмяФайла);

Если ПолученныйТекст = Неопределено Тогда
  Возврат;
Иначе
  обработатьТекст(ПолученныйТекст);
КОнецЕсли;

И вот тут начинаются несовсемпонятки...
   Hans
 
7 - 21.09.18 - 14:44
Вот это у тебя будут последние строчки в процедуре

ИмяФайла = ....;
ПолучитьТекстИзФайла(ИмяФайла);


А потом в ОбработчикеОповещения НачатьЧтениеЗавершение

будешь дальше работать с текстом:

Если ПолученныйТекст = Неопределено Тогда
  Возврат;
Иначе
  обработатьТекст(ПолученныйТекст);
КОнецЕсли;
   Hans
 
8 - 21.09.18 - 14:45
Т. е. получается вместо нормально структурированой процедуры - овнокод.
   Cool_Profi
 
9 - 21.09.18 - 14:51
(8) Вот и я про то говорю... Намудрили... Но переделывать, похоже, придётся... 1с (фирма) может на проверке зарубить (((
   Cyberhawk
 
10 - 21.09.18 - 15:18
(9) Тиражная конца какая-то? "1С:Совместимо" мутишь?
 
 Рекламное место пустует
   Cool_Profi
 
11 - 21.09.18 - 15:19
(10) Устроился на работу в контору, которая уже не первый год такое делает. И проходит успешно. И свои коробки продаёт
   Вафель
 
12 - 21.09.18 - 16:20
вот такое вот Г у нас в тиражных )))
   Franchiser
 
13 - 21.09.18 - 16:25
(11) беги оттуда
   Numerus Mikhail
 
14 - 21.09.18 - 16:25
А кто-нибудь может объяснить зачем в конкретно этом случае нужно так делать? Какие плюсы у этого будут?
   Cyberhawk
 
15 - 21.09.18 - 16:26
(12) (13) Почему Г?
   Cool_Profi
 
16 - 21.09.18 - 16:27
(13) В нащшей деревне не так много приличных рабодателей, чтобы так ими раскидываться
   Cool_Profi
 
17 - 21.09.18 - 16:27
(15) По определению
   Cyberhawk
 
18 - 21.09.18 - 16:29
(14) https://1c.ru/rus/products/1c/predpr/compat/soft/requirements.htm
Пункт 2.5.16
"При разработке конфигураций, предназначенных для работы в веб-клиенте, запрещено использовать модальные формы и диалоги. ... Для этого свойство конфигурации "Режим использования модальности" должен быть установлено в "Не использовать", а вместо модальных методов следует вызывать их немодальные аналоги с блокированием окна владельца или всего интерфейса."
Видимо у ТС конфа заявлена с поддержкой веб-клиента.
   Cyberhawk
 
19 - 21.09.18 - 16:30
(16) Какой регион (примерно)?
   упороный
 
20 - 21.09.18 - 16:30
(16) Калуга?
   Cool_Profi
 
21 - 21.09.18 - 16:34
(20) Нет
(19) Дальнее подмосковье
   novichok79
 
22 - 21.09.18 - 17:01
мои 5 копеек говнокода

&НаКлиенте
Процедура ОбработатьВыборЛогФайла(ВыбранныйЭлемент)
    
    РезультатПередачи = ЯРоняю1ССервер.ПередатьФайлНаКлиентВХранилище(ВыбранныйЭлемент.Значение, УникальныйИдентификатор);

    АдресВХранилище = РезультатПередачи.АдресВХранилище;
    ТекстОшибки = РезультатПередачи.ТекстОшибки;
    
    Если Не ПустаяСтрока(ТекстОшибки) Тогда 

        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, , Элементы.НадписьЛогФайлы.Имя);
        
    Иначе 
        
        Если Не ЗначениеЗаполнено(АдресВХранилище) Тогда 
            
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
            СтрШаблон(НСтр("ru = 'Файл ""%1"" не найден на сервере!'"), ВыбранныйЭлемент.Значение), , 
            Элементы.НадписьЛогФайлы.Имя);
            
        ИначеЕсли ТипЗнч(АдресВХранилище) = Тип("Строка") И ЭтоАдресВременногоХранилища(АдресВХранилище) Тогда
            
            ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(АдресВХранилище);
            ВременныйФайл = ПолучитьИмяВременногоФайла("txt");

            ДополнительныеПараметры = Новый Структура;
            ДополнительныеПараметры.Вставить("ВременныйФайл", ВременныйФайл);
            
            Обработчик = Новый ОписаниеОповещения(
            "ОбработатьВыборЛогФайлаУдачнаяЗапись", ЭтотОбъект, ДополнительныеПараметры, 
            "ОбработатьВыборЛогФайлаОшибкаПриЗаписи", ЭтотОбъект);
            
            ДвоичныеДанныеФайла.НачатьЗапись(Обработчик, ВременныйФайл);
            
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьВыборЛогФайлаУдачнаяЗапись(ДополнительныеПараметры) Экспорт
    
    ВременныйФайл = ДополнительныеПараметры.ВременныйФайл;
    
    Попытка
        
        ЗапуститьПриложение(ВременныйФайл);
        
    Исключение

        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
        СтрШаблон(НСтр("ru = 'Не удалось открыть лог-файл ""%1"" по причине ошибки:
                        |%2'"), ДополнительныеПараметры.ВременныйФайл,
                        ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())), ,
                        Элементы.НадписьЛогФайлы.Имя);
        
    КонецПопытки;

    ЯРоняю1СКлиент.ДобавитьФайлВоВременные(ВременныйФайл);

КонецПроцедуры

&НаКлиенте
Процедура ОбработатьВыборЛогФайлаОшибкаПриЗаписи(ИнформацияОбОшибке, СтандартнаяОбработка, ДополнительныеПараметры) Экспорт 
    
    СтандартнаяОбработка = Ложь;

    ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
    СтрШаблон(НСтр("ru = 'Не удалось открыть лог-файл ""%1"" по причине ошибки:
                    |%2'"), ДополнительныеПараметры.ВременныйФайл,
                    ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)), ,
                    Элементы.НадписьЛогФайлы.Имя);
    
КонецПроцедуры
   Numerus Mikhail
 
23 - 21.09.18 - 17:06
(18) Но ведь Существует() никак не связан с модальностью.
Или я чего-то не знаю?
   Cool_Profi
 
24 - 21.09.18 - 17:09
(23) Проверка конфигурации на него тыкает пальцем. И есть метод начать проверку существования. Значит, связан.

Только не с модальностью, а с синхронностью.
   Garykom
 
25 - 21.09.18 - 17:12
Гм кто хотя бы в курсе каким образом веб-клиент 1С работает с файловой системой?
   Garykom
 
26 - 21.09.18 - 17:12
(25)+ Поймете как и через какое место - сразу пропадут все вопросы и про модальность и про синхронность!
   Numerus Mikhail
 
27 - 21.09.18 - 17:13
(25) Где про это почитать?
   Garykom
 
28 - 21.09.18 - 17:15
(27) Эээто же стандартно и легко догадаться.

JS в браузере работает в песочнице и дальше нее выползти не может, но может по сети общаться локально.

И можно запустить локальное внешнее сетевое приложение (плагин или расширение браузера) которое уже общается с JS внутри веб-страницы (веб-клиента 1С) и работает с файловой системой через операционку.
   Skylark
 
29 - 21.09.18 - 18:04
(0) Кури в типовых модули начинающиеся на "ПередачаФайлов" (или "РаботаСФайлами"? не помню точно). И примеры использования процедур из них типа

ПередачаФайлов.ПередатьФайлыНаСервер(ОповещениеОЗагрузкеФайлов, ПомещаемыеФайлы, ЭтаФорма.УникальныйИдентификатор);
   Cyberhawk
 
30 - 21.09.18 - 18:12
(23) Да, точно.
В приведенном фрагменте текста (требования для "1С:Совместимо") кстати не упоминается о запрете использования синхронных вызовов
   Garykom
 
31 - 21.09.18 - 18:16
(30) Скорее всего дело не в "1С:Совместимо" (ибо никто не мешает писать конфы под ОФ или даже старые платформы) а во Фреше и веб-клиентах.
   Cool_Profi
 
32 - 26.09.18 - 11:01
Возвращаясь к теме.
Пришлось переделать на асинхронные. Вот такое получилось:

&НаКлиенте
Процедура ПолучитьТекстИзФайла(п_ПутьКФайлу)
    л_ТекстДок = Новый ТекстовыйДокумент;
    л_ТекстДок.НачатьЧтение(Новый ОписаниеОповещения("ПолучитьТекстИзФайла_Завершение", ЭтотОбъект,,"ПолучитьТекстИзФайла_Ошибка", ЭтотОбъект), п_ПутьКФайлу);
КонецПроцедуры

&НаКлиенте
Процедура  ПолучитьТекстИзФайла_Завершение(п_текстФайла) Экспорт
    ЭтотОбъект.ТекстКлассификатора = п_текстФайла;
    Оповестить("Чтение закончено");
КонецПроцедуры

&НаКлиенте 
Процедура ПолучитьТекстИзФайла_Ошибка() Экспорт
    а = 1;
КонецПроцедуры

Но в завершении прилетает неопределено...
Ошибок нет. Всё выполняется на клиенте, файл существует и права на него есть точно.

Что я не так сделал?
   Вафель
 
33 - 26.09.18 - 11:02
(32) лучше через ЧтениеТекста делать
 
 
   Вафель
 
34 - 26.09.18 - 11:02
И он синхронный
   Cool_Profi
 
35 - 26.09.18 - 11:07
(34) Вот именно, что синхронный. А мне нужна асинхронность.
   Вафель
 
36 - 26.09.18 - 11:07
(35) зачем?
   Вафель
 
37 - 26.09.18 - 11:07
Он синхронный и это не приводит к ошибке
   Cool_Profi
 
38 - 26.09.18 - 11:09
(36) "РегистрСведений.МойРег.Форма.ФормаСписка.Форма Использование синхронного вызова: "Прочитать""

Нарушение 1с-совместимо
   Cool_Profi
 
39 - 26.09.18 - 11:09
(37) У меня ошибки при выполнении и так нет )) А вот правила нарушаются
   Lexey_
 
40 - 26.09.18 - 11:11
(32) "Но в завершении прилетает неопределено... "
НачатьЧтение()
Параметры:
<ОписаниеОповещения> (необязательный)
Тип: ОписаниеОповещения.
Содержит описание процедуры, которая будет вызвана после завершения чтения файла со следующими параметрами:•<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения.
   Вафель
 
41 - 26.09.18 - 11:11
(38) у тебя именно ЧтениеТекста было?
   Lexey_
 
42 - 26.09.18 - 11:12
(32) что передаешь, то и прилетает
   Cool_Profi
 
43 - 26.09.18 - 11:15
(40) А где тогда текст прочитанный?
(41) нет
   tesseract
 
44 - 26.09.18 - 11:15
(32)>>ЭтотОбъект,,"ПолучитьТекстИзФайла_Ошибка", ЭтотОбъект)

Почему ЭтотОбъект? Форма же должна быть, у тебя оповещение в форму должно возвращаться.

(33) Чтение текста не читает файл при открытии, это для буферизованной обработки больших файлов. Теперь уже есть двоичные данные, они лучше тк можно передавать в другие объекты.

(40) Туда просто пустую структуру.
   Cool_Profi
 
45 - 26.09.18 - 11:16
(44) ЭтотОбъект в новых платформах в модуле формы - это старая ЭтаФорма
   Lexey_
 
46 - 26.09.18 - 11:18
(43) как где? в переменной л_ТекстДок
   Cool_Profi
 
47 - 26.09.18 - 11:19
(46) л_текстДок - это локальная переменная. В другой она просто не существует.
Или я чего-то не понимаю...

Где можно почитать про эти асинхроные вызовы?
   Lexey_
 
48 - 26.09.18 - 11:22
(47) ну так передай ее через параметр описания оповещения
   Cool_Profi
 
49 - 26.09.18 - 11:25
(48) Я вроде уже допёр...

Зы. Дайте мне пулемёт и билет в Москву...
 
 Рекламное место пустует
   tesseract
 
50 - 26.09.18 - 11:27
(45) С какой версии ЭтотОбъект стал формой?

(49) У нас 1С Бит и тензор и так много кого привозит.
   Вафель
 
51 - 26.09.18 - 11:27
(50) давно уже так
   tesseract
 
52 - 26.09.18 - 11:29
(51) Не замечал. Реквизиты формы и уникальный идентификатор?
   Cool_Profi
 
53 - 26.09.18 - 11:30
(50) У меня в 8,3,12 - на клиенте это управляемая форма
   Cool_Profi
 
54 - 26.09.18 - 11:31
   tesseract
 
55 - 26.09.18 - 11:34
(53) Это общая форма, или форма объекта? Хотя на клиенте да, там нет объекта как такового. Возможно как раз не применяю тк контекст может прыгать. Лучше используй форму.
   Вафель
 
56 - 26.09.18 - 11:35
(52) с самых первых версий 8.3
   tesseract
 
57 - 26.09.18 - 11:36
(56) Да я уже понял - ЭтотОбъект просто контекстно зависимый.
   Вафель
 
58 - 26.09.18 - 11:38
(57) Это синоним ЭтаФорма просто - для унификации
   Вафель
 
59 - 26.09.18 - 11:39
Хотя я так и не понял чем чтение текста не угодило
   Cool_Profi
 
60 - 26.09.18 - 11:39
(55) Это форма встроенной обработки. Для объектов метаданных то же самое
   Cool_Profi
 
61 - 26.09.18 - 11:40
(59) А у него есть асинхронный вызов чтения?
   Вафель
 
62 - 26.09.18 - 11:41
(61) он там НЕ нужен, его не нужно переделывать.
Не все объекты нужно переделывать под асинхронное.
Поставь в конфе запретить синхронные и увидь
   tesseract
 
63 - 26.09.18 - 11:42
(58) Если процедура выполняется на сервере, там ЭтотОбъект и ЭтаФорма - будут разными.

(59) Там надо поток делать. Если у кула 8/3/12 - поток будет быстрее. ЧтениеТекста отлично работает через поток.
   Cool_Profi
 
64 - 26.09.18 - 11:42
(62) Есть требования к коробочным конфигурациям - не должно быть синхронных вызовов. Так что тут правила пишу не я
   tesseract
 
65 - 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) из файла можно без всяких потоков читать
   tesseract
 
69 - 26.09.18 - 12:02
(66) Посмотри в отладчике.

(68) ЧтениеТекста поддерживает асинхронное чтение  только через поток.  Если у тебя Вебклиент, то это единственный выход, ТекстовыйДокумент сцука тяжелый.
   Новиков
 
70 - 26.09.18 - 12:04
(69) я посмотрел и глазами, и отладчиком.
ЭтаФорма = ЭтотОбъект ИСТИНА

Так чем они отличаются?
   tesseract
 
71 - 26.09.18 - 12:06
(70) Контекстно зависимое.
   Вафель
 
72 - 26.09.18 - 12:09
(71) что ты подразумеваешь по этим словом
   tesseract
 
73 - 26.09.18 - 12:14
(72) В разных процедурах будет получен объект разного типа. Я на клиенте предпочитаю не работать и давно сказал, что я был не прав. Предпочитаю строгую типизацию.
   Новиков
 
74 - 26.09.18 - 12:14
(71) Коллега, конкретики можно поболее. Конкретный кейс, где эти два объекта разные и как это проявляется? Можешь привести пример?
   Cool_Profi
 
75 - 26.09.18 - 12:24
(63) Ты ошибаешься. На клиенте и на сервере в модуле формы - ЭтотОбъект - это управляемая форма.
   Вафель
 
76 - 26.09.18 - 12:27
чтение текста на веб клиенте нельзя. поэтому мой совет отменяется
   Новиков
 
77 - 26.09.18 - 12:31
(75) ну вот. Испортил все малину.
   tesseract
 
78 - 26.09.18 - 12:32
(74) Вызови метод объекта из формы.

(75) В первом случае будут элементы формы с событиями и прочим, во втором - данные переданные на сервер.


(76) Пролистал - вместо него теперь НачатьЧтение, читает что угодно.
   Вафель
 
79 - 26.09.18 - 12:38
(78)  где ты увидел НачатьЧтение?
   tesseract
 
80 - 26.09.18 - 12:44
(79) В справке - тоже самое, но теперь и двоичные данные может читать.
   Вафель
 
81 - 26.09.18 - 12:45
сам объект ЧтениеТекста не доступен в веб клиенте
   singlych
 
82 - 26.09.18 - 12:46
(32) Параметр у оповещения ПолучитьТекстИзФайла_Завершение должен быть только один, и это - структура ДополнительныеПараметры. В нее надо помещать твой текстовый док в конструкторе оповещения. Типа
...
л_ТекстДок = Новый ТекстовыйДокумент;
ДополнительныеПараметры = Новый Структура("ТектДок", л_ТекстДок);
Оповещение = Новый ОписаниеОповещения("ПолучитьТекстИзФайла_Завершение", ЭтотОбъект, ДополнительныеПараметры,"ПолучитьТекстИзФайла_Ошибка", ЭтотОбъект);
л_ТекстДок.НачатьЧтение(Оповещение, п_ПутьКФайлу);
....

а в ПолучитьТекстИзФайла_Завершение пишешь

Процедура  ПолучитьТекстИзФайла_Завершение(ДополнительныеПараметры) Экспорт
    ЭтотОбъект.ТекстКлассификатора = ДополнительныеПараметры.ТекстДок.ПолучитьТекст();
    Оповестить("Чтение закончено");
КонецПроцедуры

как-то так
   Новиков
 
83 - 26.09.18 - 12:46
(78) я который раз уже прошу - приведи конкретный кусок кода, где наглядно бы показывались отличия этих двух объектов. Ты сознательно уходишь от ответа. Ты в курсе чем отличаются эти объекты - так покажи код. Зачем ты пишешь - вызови метод объекта из формы? Покажи код, где эти два объекта различаются - это сложно или что?
   singlych
 
84 - 26.09.18 - 12:47
(82) а, уже все рассказали.
   tesseract
 
85 - 26.09.18 - 12:51
(83) А самому слабо? Переменные будут доступны? Типы значений у реквизитов формы будут сохраняться при серверном и клиентском вызове?
   tesseract
 
86 - 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) Двоичные данные можно передавать на сервер.
   Cool_Profi
 
95 - 26.09.18 - 13:04
Возвращаемся к спору о ЭтотОбъект.
В модуле формы - на сервере и на клиенте ЭтотОбъект и ЭтаФорма - эквиваленты.
В модуле объекта - ЭтотОбъект - уже объект, а ЭтаФорма недоступна.
   Cyberhawk
 
96 - 26.09.18 - 13:05
(95) Открыл америку ))
   Вафель
 
97 - 26.09.18 - 13:06
(94) можно и сам файл на сервер передать
   Мыш
 
98 - 26.09.18 - 13:06
(97) Тоже вариант, да. Зависит от задачи.
   Ник080808
 
99 - 26.09.18 - 13:07
(95) ЭтотОбъект и ЭтаФорма - эквиваленты.  - Это как форма и объект эквивалентны?
   Вафель
 
100 - 26.09.18 - 13:08
(99) не форма и объект, а Эта форма и Этот объект )))
  1  2   

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