Имя: Пароль:
1C
1С v8
Синхронные 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) это синонимы
AdBlock убивает бесплатный контент. 1Сергей