Имя: Пароль:
1C
1С v8
Синхронные vs асинхронные
,
0 Cool_Profi
 
21.09.18
14:21
Начал тут переделывать код под асинхронные вызовы...
С оповещениями и выборами файлов понятно..

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

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

Как видно - он проверяет наличие файла и при существовании - возвращает текст из него.
Как такое переделать на асинхроны без заведения лишних переменных...
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) это синонимы
Основная теорема систематики: Новые системы плодят новые проблемы.