|   |   | 
| 
 | Функционирование асинхронной функции | ☑ | ||
|---|---|---|---|---|
| 0
    
        Dragonofdwarfs 04.10.22✎ 10:43 | 
        Всем привет! Друзья, подскажите пожалуйста, можно ли написать асинхронную функцию в 1с в рамках такой задачи: При открытии самописной расширенной формы списка номенклатуры я создаю ТЗ параметров номенклатуры с колонками: ссылка, параметр, индексирую её по ссылке, чтобы поиск был моментальным, помещаю её в реквизит формы. При активизации строки пользователем, данные в табличную часть параметров очищаются и моментально пробрасываются по текущей ссылке. Всё звучит отлично, только вот форма открывается долго, порядка 7 секунд, и во всём виновато создание этой ТЗ. Так вот, я хочу поместить создание этой тз в асинх функцию, чтобы форма открылась гораздо быстрее, а тз с параметрами подтянулась чуть позже,т.е чтобы пользователь мог уже работать с формой. Написал всё по науке, но выполнение получается синхронным, т.е дополнительный поток исполнения кода не появляется, форма всё так же ждёт создания этой тз и затем открывается. Как быть? Как правильно написать асинх функцию, чтобы она работала как надо?     | |||
| 1
    
        Dragonofdwarfs 04.10.22✎ 10:50 | 
        Так выглядит например моя тестовая обрабока по этим асинх функциям, но выполнение всё так же синхронное, т.е сначала выполняется код, возвращающий сообщение о значении итератора, а потом выводится 123 и сообщение, а по идее должен пойти выполняться код, затем сразу же должно вывестись сообщение 123, а затем как асинх функция отработает - сообщение о значении итератора! 
 &НаКлиенте Асинх Процедура КнопкаВыполнитьНажатие(Кнопка) Результат = ВывестиСообщениеОЗначенииИтератораАсинх(); Сообщить("123"); Сообщить(Ждать Результат); КонецПроцедуры &НаКлиенте Асинх Функция ВывестиСообщениеОЗначенииИтератораАсинх() Сч = 0; Пока Сч < 1000000 Цикл Сч = Сч + 1; КонецЦикла; Возврат("Значение итератора = " + Сч); КонецФункции | |||
| 2
    
        Dragonofdwarfs 04.10.22✎ 10:59 | 
        Такое ощущение, что модуль асинх нужен чисто как синтаксический сахар, чтобы описывать оповещение об окончании исполнения какого-то участка кода     | |||
| 3
    
        polosov 04.10.22✎ 11:12 | 
        (0) Странный подход конечно.
 Попробуй фоновым заданием формировать свою таблицу. | |||
| 4
    
        lodger 04.10.22✎ 11:22 | 
        а) ты не понял зачем нужен асинх
 б) асинх не надо использовать для попытки создать многопоточность в) сделай это по классике - фоновое задание и обработчик ожидания | |||
| 5
    
        Мультук гуру 04.10.22✎ 11:25 | ||||
| 6
    
        Dragonofdwarfs 04.10.22✎ 11:35 | 
        Но так фоновое задание не запишет  же эту таблицу в реквизит открытой формы в другом сеансе!     | |||
| 7
    
        polosov 04.10.22✎ 11:39 | 
        (6) ФЗ вернет тебе адрес в хранилище на твою ТЗ. Получишь ее и передашь в реквизит.     | |||
| 8
    
        lodger 04.10.22✎ 11:45 | 
        (0) когда ТЗ является реквизитом формы, то у неё нет индексов. можешь не индексировать.     | |||
| 9
    
        mTema32 04.10.22✎ 11:47 | 
        (0) "Процедура КнопкаВыполнитьНажатие(Кнопка)" - на обычных формах штоле?     | |||
| 10
    
        Мультук гуру 04.10.22✎ 11:48 | 
        (0) 
 7 секунд. Там что-то совсем ? Или как всегда пользователь хочет взглянуть на таблицу и 1млн строк ? | |||
| 11
    
        Dragonofdwarfs 04.10.22✎ 11:49 | 
        (9) да, на обычных     | |||
| 12
    
        Dragonofdwarfs 04.10.22✎ 11:50 | 
        (8) адрес в хранилище? Что это значит, куда и как мне сохранить эту тз?     | |||
| 13
    
        Мультук гуру 04.10.22✎ 11:53 | 
        (12) 
 Лучше покажи код формирования это тз Возможно там можно что-то оптимизировать Сколько строк то хоть получается ? | |||
| 14
    
        Dragonofdwarfs 04.10.22✎ 11:54 | 
        (10) По факту то, что я описал выше занимает 4,5 секунды, но форма открывается 7, потому что там ещё другие данные подтягиваются     | |||
| 15
    
        Dragonofdwarfs 04.10.22✎ 11:58 | 
        Вот код, который несёт максимальную нагрузку
 Функция ПолучитьТаблицуДопРеквизитовНоменклатуры(МассивНоменклатуры = Неопределено) Экспорт Если МассивНоменклатуры = Неопределено Тогда Запрос = Новый Запрос("ВЫБРАТЬ | ТарифныеКоэффициентыПроизводителейСрезПоследних.Коэффициент КАК Коэффициент, | ВЫБОР | КОГДА КурсыВалютСрезПоследних.Курс <> 1 | ТОГДА ЦеныНоменклатурыСрезПоследних.Цена * (ВЫРАЗИТЬ(КурсыВалютСрезПоследних.Курс + 0.5 КАК ЧИСЛО(10, 0))) * 1.03 | ИНАЧЕ ЦеныНоменклатурыСрезПоследних.Цена | КОНЕЦ КАК Тариф, | ТарифныеКоэффициентыПроизводителейСрезПоследних.Коэффициент * ВЫБОР | КОГДА КурсыВалютСрезПоследних.Курс <> 1 | ТОГДА ЦеныНоменклатурыСрезПоследних.Цена * (ВЫРАЗИТЬ(КурсыВалютСрезПоследних.Курс + 0.5 КАК ЧИСЛО(10, 0))) * 1.03 | ИНАЧЕ ЦеныНоменклатурыСрезПоследних.Цена | КОНЕЦ КАК ЦенаРасчетная, | СпрНоменклатура.Ссылка КАК Ссылка, | СпрНоменклатура.Подгруппа КАК Подгруппа, | СпрНоменклатура.КатегорияНоменклатуры КАК Категория |ИЗ | Справочник.Номенклатура КАК СпрНоменклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&Дата, ) КАК КурсыВалютСрезПоследних | ПО ЦеныНоменклатурыСрезПоследних.Валюта = КурсыВалютСрезПоследних.Валюта | ПО СпрНоменклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТарифныеКоэффициентыПроизводителей.СрезПоследних(&Дата, ) КАК ТарифныеКоэффициентыПроизводителейСрезПоследних | ПО (СпрНоменклатура.Ссылка = ТарифныеКоэффициентыПроизводителейСрезПоследних.Номенклатура | И СпрНоменклатура.Производитель = ТарифныеКоэффициентыПроизводителейСрезПоследних.Производитель)"); Запрос.УстановитьПараметр("Дата", ТекущаяДата()); Запрос.УстановитьПараметр("ТипЦен", Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Тариф")); Результат = Запрос.Выполнить().Выгрузить(); Результат.Индексы.Добавить("Ссылка"); Возврат(Результат); КонецЕсли; Запрос = Новый Запрос("ВЫБРАТЬ | Номенклатура.Ссылка КАК Ссылка, | Номенклатура.Подгруппа КАК Подгруппа, | Номенклатура.КатегорияНоменклатуры КАК КатегорияНоменклатуры |ПОМЕСТИТЬ СпрНоменклатура |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Ссылка В(&МассивНоменклатуры) |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТарифныеКоэффициентыПроизводителейСрезПоследних.Коэффициент КАК Коэффициент, | ВЫБОР | КОГДА КурсыВалютСрезПоследних.Курс <> 1 | ТОГДА ЦеныНоменклатурыСрезПоследних.Цена * (ВЫРАЗИТЬ(КурсыВалютСрезПоследних.Курс + 0.5 КАК ЧИСЛО(10, 0))) * 1.03 | ИНАЧЕ ЦеныНоменклатурыСрезПоследних.Цена | КОНЕЦ КАК Тариф, | ТарифныеКоэффициентыПроизводителейСрезПоследних.Коэффициент * ВЫБОР | КОГДА КурсыВалютСрезПоследних.Курс <> 1 | ТОГДА ЦеныНоменклатурыСрезПоследних.Цена * (ВЫРАЗИТЬ(КурсыВалютСрезПоследних.Курс + 0.5 КАК ЧИСЛО(10, 0))) * 1.03 | ИНАЧЕ ЦеныНоменклатурыСрезПоследних.Цена | КОНЕЦ КАК ЦенаРасчетная, | СпрНоменклатура.Ссылка КАК Ссылка, | СпрНоменклатура.Подгруппа КАК Подгруппа, | СпрНоменклатура.КатегорияНоменклатуры КАК Категория |ИЗ | СпрНоменклатура КАК СпрНоменклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&Дата, ) КАК КурсыВалютСрезПоследних | ПО ЦеныНоменклатурыСрезПоследних.Валюта = КурсыВалютСрезПоследних.Валюта | ПО СпрНоменклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТарифныеКоэффициентыПроизводителей.СрезПоследних(&Дата, ) КАК ТарифныеКоэффициентыПроизводителейСрезПоследних | ПО (СпрНоменклатура.Ссылка = ТарифныеКоэффициентыПроизводителейСрезПоследних.Номенклатура | И СпрНоменклатура.Ссылка.Производитель = ТарифныеКоэффициентыПроизводителейСрезПоследних.Производитель)"); Запрос.УстановитьПараметр("Дата", ТекущаяДата()); Запрос.УстановитьПараметр("ТипЦен", Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Тариф")); Запрос.УстановитьПараметр("МассивНоменклатуры", МассивНоменклатуры); Результат = Запрос.Выполнить().Выгрузить(); Если Результат.Количество() > 10000 Тогда Результат.Индексы.Добавить("Ссылка"); КонецЕсли; Возврат(Результат); КонецФункции | |||
| 16
    
        Мультук гуру 04.10.22✎ 12:42 | 
        (15) 
 1) Индексы здесь не нужны. В данной ситуации - напрасная трата времени 2) В этом виде (выбрать всю номенклатуру) - оно быстрее работать не будет. Вопрос в том, а точно нужно всё и сразу ? 3) Можно посмотреть в сторону "а как это сделано в Обработки.ПодборНоменклатуры" 4) Обычно в подобных формах стараются ограничить количество строк отборами Прочее а) Если вы используете ЛЕВОЕ СОЕДИНЕНИЕ -- используйте ЕСТЬNULL, ибо дальше окажется, что пусто на экране вовсе не ноль б) Между РегистрСведений.КурсыВалют.СрезПоследних(&ТекущаДата, ) и РегистрСведений.КурсыВалют.СрезПоследних(, ) есть разница. Она описана в ИТС | |||
| 17
    
        Dragonofdwarfs 04.10.22✎ 13:29 | 
        (16) Спасибо огромное! Буду пробовать)     | |||
| 18
    
        mistеr 04.10.22✎ 14:42 | 
        (0) Оффтопик, но чем не устроили типовые возможности поиска номенклатуры?     | |||
| 19
    
        rudnitskij 04.10.22✎ 15:21 | 
        (15) "ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних
 | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&Дата, ) КАК КурсыВалютСрезПоследних | ПО ЦеныНоменклатурыСрезПоследних.Валюта = КурсыВалютСрезПоследних.Валюта" зачем соединять все цены со всеми курсами валют? Поправьте этот момент, получите заметное ускорение | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |