Асинхронное нечто, или так, как раньше!

Публикация № 1746248 23.10.22

Разработка - Механизмы платформы 1С

Все же знают, что раньше было лучше! Возврат к истокам и погружение в детали...

Я вот никак не хотел больше писать статьи, т.к. лениво, да и на работе много интересного. Но сердце все-равно рвется из груди в попытках донести крупицы мудрости (ну или глупости - все зависит от аудитории). И чтобы не растекаться мыслью по древу, перейду к сути...

 

ВВЕДЕНИЕ

Суть в том, что с какой-то (вроде бы 8.3.18+) версии платформы появились у 1С асинхронные варианты методов для диалоговых окон, копирования файлов, подключения внешних компонент и всего того, что немного раньше делалось при помощи объекта "ОписаниеОповещения", представляющего из себя организацию "промиса" (того самого "обещания" из асинхронного программирования). Но код с "коллбэками" (обратными вызовами) был несколько громоздким. Да, 1С сделала в конфигураторе опцию рефакторинга, который старый синхронный вызов автоматически преобразовывал в новый асинхронный, но все-равно кода стало больше, а больше - это запутаннее.  В том же менеджере работы с оборудованием передача "промисов" между функциями существенно затрудняла анализ и обратный инжиниринг для выколупывания протоколов работы с ВК.

Итак, "промисы" в первой итерации от 1С получились громоздкими, запутывали код, превращали его в "спагетти" без всех этих операторов безусловного перехода. И однажды 1С все же решила сделать тот самый await, который сразу и сильно упростил код, возвратив его обратно к линейной последовательности строк.

В своей статье предлагаю рассмотреть подходы к асинхронным диалогам и обращу внимание на некоторые особенности отдельных случаев. Надеюсь, что после прочтения этой статьи Вы перестанете писать "неасинхронно", даже если Ваша конфигурация до сих пор на обычных формах ("моя" - да).

В путь!

 

ИСТОРИЧЕСКИЙ ЛИКБЕЗ

Когда деревья были большими, а партизаны - толстыми, все программирование было линейным. Код выполнялся строка за строкой. Потом пришел Дейкстра и придумал процедурное программирование. Потом пришел Страуструп и придумал объекты. Нет, я не утверждаю, что это были именно Дейкстра и Страуструп, но они у меня четко так ассоциируются с вот этими двумя эпохами.

Дальше закон Мура стал тормозить, стало активно развиваться параллельное программирование, когда задача решалась сначала на множестве компьютеров, потом на множестве процессоров в одном компьютере, потом на множестве ядер в одном процессоре, а сейчас уже на множестве ядер на ускорителях (видеокартах и прочих специализированных устройствах). Наступила эра параллельного программирования, о которой я писал аж дважды: тыдыщь и тыдыщь.

Ну и где-то тут появилась и асинхронность, как механизм утилизации производительности одного ядра. Т.е. асинхронность - это способность выполнять несколько задач на одном ядре, переключая задачи в моменты ожидания. И вот мне почему-то кажется, что данный момент многие программисты как-то опускают. А ведь компьютер стал достаточно "сложным организмом", в нем помимо центрального процессора есть еще овер дофига других. Сначала это были математические (арифметические) сопроцессоры, с ними все эти процессоры управления памятью и внешними шинами (северные и южные мосты), потом графические ускорители, физические ускорители, тензорные и прочие процессоры для задач "искусственного интеллекта" (перемножения матриц и прочего их преобразования, с чем неплохо справляются и видеокарты - попер маркетинг).

И вот во всем этом море устройств операционная система уже не могла оставаться просто "многопоточной", к многопоточности добавилась асинхронность (в принципе это уже давно так - прерывания рулят), которая потихонечку прописалась в API.

Итак, к чему это я? К тому, чтобы читатель некоторым образом увидел историю развития и ощутил проблемы, которые решались в ходе развития, т.к. согласно ТРИЗ, все улучшения упираются в какие-то ухудшения, появляются качели эффективности, выражающиеся в том, что решение одной проблемы может породить несколько других проблем на другом уровне, которые нужно тоже как-то комплексно решать: разнести во времени (циклы чтения/записи памяти) или пространстве (ядра процессора), поменять отношение (50 градусов - когда-то это была высокая температура для процессора, а сейчас это вообще очень холодно, а 80 градусов стало почти нормой под нагрузкой).

Ну а дальше перейдем к асинхронности 1С.

 

РАНЬШЕ (за "миллион лет" до н.э.)

В старых версиях платформы обычные формы вполне себе работали с так называемой модальностью - кода открытие диалогов блокирует форму и ждет события с результатом. Выглядело это как-то так:

Результат = ОткрытьФормуМодально(ИмяФормы, Параметры, ...);

Ну и в переменной "Результат" появлялись данные выбора. Для диалогов использовалось что-то типа "Выбрать" или "Ввести" (ВвестиСтроку/Число/Дату/Значение). Таким образом код останавливался и ждал, когда пользователь что-то выберет, после чего можно было бы спокойно и без нервотрепки обработать результат.

Какие у этого минусы? Да, собственно, никаких для обычного разработчика. В то, что 1С не смогла прилично реализовать это для веб-клиента, я не верю. Единственный, на мой скромный взгляд, смысл в этом только как следование за трендами. Но в части диалогов модальный вызов ничем не отличается от немодального. В части подключения внешних компонент это уже оправдано, т.к. они вполне могут ожидать какие-то данные от оборудования при инициализации, которые при асинхронном подходе действительно будут сокращать время запуска 1С. То же самое и с копированием файлов - это позволяет пользователю не ждать завершения их копирования и перейти к другим задачам. Но тут экономия времени минимальна.

 

ПЕРВЫЙ БЛИН...

Да, первая реализация асинхронности была так себе - код стал запутанным. Функции "Выбрать*" превратились в "ПоказатьВыбор*", функции "Ввести*" в "ПоказатьВвод*", в "ОткрытьФорму" появилась возможность получить и обработать результат выбора с помощью отдельной процедуры, которая могла располагаться не только в форме, но и в общем модуле. Но для всего этого потребовалось писать еще одну процедуру на каждый диалог выбора/ввода/формы. В части кода, то он мог быть сгеренирован платформой, но его просто тупо становилось больше. Зато многие получили и профит - писали одну процедуру на множество диалогов, а иногда даже выносили это в отдельный модуль. В общем помимо проблем такой подход породил и новые возможности организации кода, его структурирования.

В общем, был ли этот блин комом или нет - решать вам, господа и товарищи читатели.

 

АСИНХ

И вот появился тот самый Асинх, ради которого я снова решил писать много букв. С одной стороны, этот суффикс получили все старые диалоговые методы/функции. Т.е. вот как-то так менялись названия: "Выбор*" -> "ПоказатьВыбор*" -> "Выбор*Асинх". Помимо этого у процедур и функций появился префикс "Асинх", который указывает, что процедура асинхронная.

Давайте разберемся с тем, как теперь это работает. Я, например, не увидел понимания этого у многих своих коллег, поэтому даже планирую провести на эту тему внутреннее обучение.

Итак, работает это все просто.

1. Вы вызываете асинхронную функцию.

2. Асинхронная функция помещается в очередь на выполнение.

3. Вместо результата планировщик (или как его там назвать) возвращает объект типа "Обещание" (промис), фактически адрес структуры состояния функции.

4. Чтобы получить результат, вам надо подождать. В 1С сделали тот самый "Ждать Обещание".

И вроде бы что это дает? Да вот нифига пока* не дает, но позволяет вернуться к старому, т.е. делать все почти также, как делали это в стародревние времена.

* Жду асинхронных запросов к HTTP-сервисам - там резон действительно есть.

 

ПРИМЕРЫ

Давайте разберем "исторические" примеры превращения кода из модального в асинхронный.

Модальный код:

Диалог = Новый ДиалогВыбораФайлов(Режим);
Если Диалог.Выбрать() Тогда
  ИмяФайла = Диалог.ПолноеИмяФайла;
КонецЕсли;

Код с описанием оповещения:

Диалог = Новый ДиалогВыбораФайлов(Режим);
Диалог.Показать(Новый ОписаниеОповещения("ПриВыбореФайла", "ЭтаФорма", ДополнительныеПараметры));
...
&НаКлиенте
Процедура ПриВыбореФайла(Результат, ДополнительныеПараметры) Экспорт

  Если ЗначениеЗаполнено(Результат) Тогда
    ИмяФайла = Результат[0];
  КонецЕсли;

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

Код увеличился, появилась еще одна процедура. Благо, что ее можно было засунуть хоть в общий модуль и вообще сделать одну процедуру на все случаи жизни.

Асинхронно:

&НаКлиенте
Асинх Процедура ВыбратьИмяФайла(Команда)

  Диалог = Новый ДиалогВыбораФайлов(Режим);
  Результат = Ждать Диалог.ВыбратьАсинх();
  Если ЗначениеЗаполнено(Результат) Тогда
    ИмяФайла = Результат[0];
  КонецЕсли;

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

Смотрите, если мы вызываем этот код, как команду, то в стандартной процедуре обработки команды нужно прописать префикс "Асинх". Это связано с тем, что оператор "Ждать" можно вызывать только в асинхронных процедурах и функциях.

Кстати, смотрел один ролик, в котором автор говорил, что смысла в асинхронных процедурах вроде как нет, ибо "Ждать" возвращает результат обещания, а он имеет смысл только в функциях. Я, лично, считаю наоборот, т.к. "самописная" асинхронная функция ничего не дает, если внутри нее не вызывается асинхронный диалог или копирование файлов, подключение внешних компонент и все такое прочее асинхронное. А вот асинхронная процедура позволяет использовать "Ждать"*.

: Асинх / Async представляет собой модификатор, который может применяться к процедуре или функции, написанной на встроенном языке. Использование данного модификатора делает процедуру или функцию асинхронной. Важной особенностью является также то, что оператор Ждать может использоваться только внутри Асинх процедур/функций.

Т.е. у нас "Ждать" из обычной процедуры вызвать нельзя, поэтому процедуры обработки событий формы (команд и прочих мест), которые предполагают использование асинхронных диалогов, должны теперь быть с префиксом "Асинх". Городить дополнительные функции для этого не нужно.

Кстати, заметил, что если в диалоге нажать отмену, то код после "Ждать" не выполняется. Таким образом можно вообще не проверять переменную на заполненность, а отмена выбора в цепочке вопросов приведет к дальнейшей отмене всей оставшейся цепочки. Но тут могу быть неправ - проверяйте.

 

ОСОБЕННОСТИ

Основной особенностью новой жизни (ну помимо дописывания префикса "Асинх" к событиям формы) является то, что 1С будет исполнять асинхронную функцию уже после того, как отработает "базовое событие" формы. Что под этим подразумевается? То, что если у вас есть событие с аргументом "СтандартнаяОбработка", то вне зависимости от того, что там внутри этого кода произошло, система после выхода из процедуры будет смотреть на этот флаг, и если он в Истина, то будет произведена стандартная отработка. Например, для таблицы значений будет открыто значение, для табличного документа тоже. С асинхронными функциями сложнее, т.к. они будут работать уже после того, как стандартное событие отработает. И если Вы внутри такой функции поставите "СтандартнаяОбработка = ложь", то система это не увидит, ибо она обработает стандартное событие до того, как асинхронная функция вернет хоть какой-то результат.

Как бороться? Правильно, вызывать асинхронную процедуру из синхронного обработчика событий.

 

ВЫВОД

Основной вывод: опять получилось букв больше, чем хотелось бы. Ну и второй вывод: юзайте асинхронные диалоги, т.к. они экономят строки кода.

ВСЕМ ДОБРА!

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. lmnlmn 67 24.10.22 14:00 Сейчас в теме
Кстати, заметил, что если в диалоге нажать отмену, то код после "Ждать" не выполняется.

Не знаю как просто в диалогах, а про ПолучитьФайл(ы)ССервераАсинх в СП есть следующая ремарка: "Результат выполнения обещания заполняется сразу (в веб-клиенте - до показа диалога, в остальных клиентах - после показа диалога) значением Неопределено."
По человечески это означает то что в веб-клиенте Обещание выполняется сразу как и последующий код в то время как диалог мозолит пользователю глаза. Будьте внимательны, коллеги.
starik-2005; +1 Ответить
2. Hans 2 24.10.22 14:04 Сейчас в теме
Почему нельзя было Асинх писать в конце заголовка процедуры?
tech96; goracio_99; Yashazz; Brunnen G; +4 Ответить
16. ixijixi 1420 25.10.22 08:35 Сейчас в теме
(2) Тоже резануло. Или инструкцией препроцессора &Асинх
Revachol; Yashazz; 0x00; +3 Ответить
3. sikuda 669 24.10.22 14:10 Сейчас в теме
Шутка: "Обращение в службу поддержки 1С — Здравствуйте, а не подскажите где поставить флажок в 1С чтобы не переписывать функцию Вопрос на Ждать ВопросАсинх и убрать непонятную приставку Асинх в функции?
Ответ от телеграмм канала 1С: «А что непонятного то? Уж куда проще, чем ОписаниеОповещения»… "
Ну и примерно об этом статья...

Для себя же пока не реализовал подобное в браузере не понял как это в принципе может реализоваться, только тогда и понимание встало на место - https://blog.sikuda.ru/?p=3257
NikusXXZ; +1 Ответить
4. Serg O. 205 24.10.22 14:12 Сейчас в теме
По теме Асинх - было неплохое видео от Андрея Овсянкина
https://www.youtube.com/watch?v=vt1aoPXx9fY
mrChOP93; starik-2005; +2 Ответить
8. starik-2005 2809 24.10.22 14:21 Сейчас в теме
(4)
было неплохое видео
Я как раз с ним и не согласен в плане асинхронных функций )))
А видео - да, отличное! Очень рекомендую всем посмотреть.
5. Strobe 24.10.22 14:12 Сейчас в теме
Жду асинхронных запросов к HTTP-сервисам - там резон действительно есть.


точно так же, без них приходится за помощью к внешним скриптам бегать
9. NikeeNik 66 24.10.22 14:32 Сейчас в теме
(5) таки в 21 версии асинх методы для HTTP-запросов есть:

ВызватьHTTPМетодАсинх
ЗаписатьАсинх
ИзменитьАсинх
ОтправитьДляОбработкиАсинх
ПолучитьАсинх
ПолучитьЗаголовкиАсинх
УдалитьАсинх
starik-2005; Jimbo; Serg O.; +3 Ответить
11. starik-2005 2809 24.10.22 14:50 Сейчас в теме
6. Sashares 31 24.10.22 14:17 Сейчас в теме
И если Вы внутри такой функции поставите "СтандартнаяОбработка = ложь", то система это не увидит, ибо она обработает стандартное событие до того, как асинхронная функция вернет хоть какой-то результат.


Не так.
В асинхронные процедуры и функции параметры передаются по значению, а не по ссылке, поэтому менять значения параметров, в том числе ставить СтандартнаяОбработка = Ложь в асинхронных процедурах/функциях не имеет смысла, т.к. они никуда не вернутся.
7. starik-2005 2809 24.10.22 14:20 Сейчас в теме
10. NikeeNik 66 24.10.22 14:36 Сейчас в теме
С одной стороны, этот суффикс получили все старые диалоговые методы/функции

Вот только сегодня с утра пытался вспомнить - есть ли асинх метод для ОткрытьФорму() и таки его нет, хотя тут возникает вопрос - возможно ли это вообще?
12. Alxby 937 24.10.22 16:51 Сейчас в теме
(10)Нет такого метода. И что-то мне подсказывает, что появится нескоро (если вообще появится).
13. starik-2005 2809 24.10.22 17:14 Сейчас в теме
(10)
ОткрытьФорму()
Чтобы получить вариант модального выбора вместо процедуры из описания оповещения? Видимо сложность с тем, что в форме свои синхронные процедуры и функции.
18. NikeeNik 66 25.10.22 09:09 Сейчас в теме
(13) Немного потыкал на примерах - в асинх процедуре вполне вызываются другие асинх процедуры, процедуры на сервере с контекстом формы, можно открывать другие формы со своими серверными вызовами, обработчиками ожидания и тп. Так что наверное можно ожидать появления ОткрытьФормуАсинх(), хотя кто его знает.
22. Darklight 30 26.10.22 18:19 Сейчас в теме
Хм... асинх методы появились в 18-ом релизе платформы - но я думал для их исользования
(18)Попробовал вот так
&НаКлиенте
асинх функция ОткрытьФормуАсинх(ПутьКФрме, ПараметрыФормы=неопределено)                                
	Поток = Новый ПотокВПамяти();
	оп = Новый ОписаниеОповещения("ОткрытьФормуЗавершение",ЭтаФорма,
		Новый Структура("ДополнительныеПараметры, Семафор, Результат",
		?(ТипЗнч(ПараметрыФормы)=Тип("Структура") И ПараметрыФормы.Свойство("ДополнительныеПараметры"), ПараметрыФормы.ДополнительныеПараметры,неопределено),
		Поток));
	ОткрытьФорму(ПутьКФрме,ПараметрыФормы,?(ТипЗнч(ПараметрыФормы)=Тип("Структура") И ПараметрыФормы.Свойство("Владелец"), ПараметрыФормы.Владелец,неопределено),,,,оп);
	Пока ждать Поток.РазмерАсинх()=0 Цикл
		
	КонецЦикла;
	
КонецФункции

&НаКлиенте
асинх процедура ОткрытьФормуЗавершение(Результат, ДополнительныеПараметры) экспорт
	ДополнительныеПараметры.Вставить("Результат", Результат);
	ждать ДополнительныеПараметры.Поток.ЗаписатьАсинх(Новый БуферДвоичныхДанных(1),0,1);
Конецпроцедуры
Показать


Но не получилось - просто
Пока ждать Поток.РазмерАсинх()=0 Цикл
		
КонецЦикла;


блокируете ГУИ намертво.

Хотя в других ЯП await на одном асинхронном методе позволяет выполняться "параллельном" асинхронному методу - но ГУИ - это особый случай, хотя ничто особо не должно было мешать 1С сделать так, чтобы ожидание не блокировало ГУИ - хоть какая-то значимая польза была бы!
14. triviumfan 37 24.10.22 20:48 Сейчас в теме
Очень сухо. Мало примеров и объяснений. Про функцнии и процедуры ничего не понял. Про особенности подавно - там вообще не разобраться без пол-литра. Не ожидал. Думал, может хоть "Старик" сможет нормально объяснить, но нет.
Сергей, халтура.
Krotov_Valery; tolyan_ekb; ixijixi; bulpi; mrChOP93; r2d255; +6 Ответить
15. starik-2005 2809 25.10.22 00:57 Сейчас в теме
(14)
халтура
Ну так я честно написал, что для кого-то мудрость вековая, для других глупость, какой свет не видывал. Вся суть этой асинхронности для 1С смысла особого не имеет, вот в этом и есть основной посыл.
17. starik-2005 2809 25.10.22 09:01 Сейчас в теме
(14)
сухо
Ладно, расскажу подробнее.
Вот, допустим, есть у тебя код какой-нить, который дважды два считает. Этот код выполняется на твоем процессоре, а не на сервере лунном. В итоге ты думаешь, что асинхронно он у тебя может несколько дважды два сразу считать, но нет - не может. Т.е. он каждые дважды два будет считать последовательно, даже если ты обернешь это в "асинх".
А теперь допустим второе - у тебя дважды два считает сервер лунный, но две секунды - это к Луне и обратно. Ты сделал запрос, он улетел через роутеры на лунный сервер, твой комп ничего не делает - ждет. И вот тут если ты синхронно сто запросов обработаешь, то как минимум на ожидание сигнала ты потратишь по две секунды с каждого запроса, что выльется в два на сто, т.е. двести секунд. Но если ты сделаешь это асинхронно, то ты создашь за некоторое мгновение сто запросов лунному серверу, не ожидая ответа. В стародревние времена у тебя был бы коллбэк, который для каждых из этих ста запросов сработал бы, и ты вынужден бы был обрабатывать это все отдельно, хотя на джавах и прочем есть лямбда, поэтому функцию можно прописать прям в вот здесь. Но асинхронность дает тебе положить все результаты асинхронных функций в массив, т.е. как-то так:
Для А = 1 ПО 100 Цикл
  Ресурс = "/лунный.сервер.рф/"+А;
  МассивОжиданий(Запрос.ПолучитьАсинх(Ресурс, Заголовки));
КонецЦикла;
Для Каждого Ответ ИЗ МассивОжиданий Цикл
  РеальныйОтвет = Ждать Ответ;
  РазобратьсяСОтветом(РеальныйОтвет);
КонецЦикла;
Все. Ты не ждешь две секунды перед каждым следующим вызовом лунного сервера. И ты получаешь более простой вариант кода, чем с коллбэками, хотя, по-сути, ничего не поменялось.
Darklight; +1 Ответить
19. Somebody1 68 25.10.22 09:57 Сейчас в теме
Вот здесь у проекта "Курсы по 1С" есть достаточно исчерпывающая статья. Один раз прочитал — всё понял.

P.S. Никак ссылку не получается нормально вставить. Инфостарт, что ты делаешь, с конкурентами борешься?
oninfostart; starik-2005; +2 Ответить
20. starik-2005 2809 25.10.22 10:47 Сейчас в теме
(19)
достаточно исчерпывающая статья
Могу сказать только, что статья содержит ну просто невменяемо много букв и не содержит ничего из того, чего бы не было в этой статье с минимальным количеством букв, если не считать раздел про обработку исключений. Фактически статья ограничивает кейсы диалогами и высосанным из пальца копированием файла. В новых версиях 1С появился и асинхронный HTTP-запрос, что уже делает асинхронность чуть-чуть полезнее. В остальном ее полезность в том, чтобы тот самый callback hell преодолеть при последовательных вопросах, но сам по себе диалог, который задает последовательно больше одного вопроса, так себе, если, конечно, это не тест какой-нить, но там каждый вопрос - это отдельный фрейм, а не асинхронное нечто над формой...
23. lmnlmn 67 27.10.22 00:05 Сейчас в теме
(20) В лунном свете избавление от Callback Hell маленький шажок для человечества, но большой для 1С ))
24. starik-2005 2809 27.10.22 10:11 Сейчас в теме
(23) В этот ад только программисты-грешники, которые реализуют плохую архитектуру, попадали.
21. Indgo 316 25.10.22 12:06 Сейчас в теме
Как то писал я кошелек Etherium для 1С
Есть у меня такая процедура
&НаКлиенте
Процедура Баланс()
	элементы.ГиперсслкаКошелек.Заголовок = "Получение данных!";
	 Документ = Элементы.ДокументHTML.Документ;
	 //Объект.БалансКошелькаETH=АсинхронныеВызовы.БалансАсинхронно(Документ);	
	 Документ.defaultView.Check_balance();
	 БалансКошелькаETH =  Документ.defaultView.async_balance();
	 Если БалансКошелькаETH="Nll" тогда
		 ПодключитьОбработчикОжидания("Баланс",1);
	 иначе                                         
		 объект.БалансКошелькаETH=БалансКошелькаETH; 
		 ОтключитьОбработчикОжидания("Баланс");
		 элементы.ГиперсслкаКошелек.Заголовок = Документ.defaultView.GetWallet();
		Документ.defaultView.return_OK() 

	 КонецЕсли;	 
КонецПроцедуры
Показать


В свою очередь имеется асихронный вызов функции JavaScript
async function Check_balance() {
	  let balancePromise  = wallet.getBalance();
	  balancePromise.then((balance) => {
		 let parsed_balance = ethers.utils.formatEther(balance);
		 window.balance = parsed_balance;
		 document.write(JSON.stringify(balance))
	    return parsed_balance;

Так вот я не смогу добиться асихронного вызова функции:
Объект.БалансКошелькаETH=АсинхронныеВызовы.БалансАсинхронно(Документ);	

Пришлось делать через
ПодключитьОбработчикОжидания("Баланс",1) 
с плясками и бубенами с перезаписью переменной window.balance
25. Lapitskiy 1057 28.10.22 06:34 Сейчас в теме
28. starik-2005 2809 28.10.22 19:19 Сейчас в теме
26. kser87 2290 28.10.22 17:01 Сейчас в теме
Никто так и не смог объяснить, зачем все это сделали
27. starik-2005 2809 28.10.22 19:16 Сейчас в теме
(26) Для, прости-хоспади, простоты. Типа пишешь теперь без колбэков. Все. Никакой многопоточности.
29. acrk 725 30.10.22 23:31 Сейчас в теме
В третьем примере (асинхронно) есть только описание процедуры. А где код, который приведет в попаданию в эту процедуру ?

Я понимаю так:
1.
...
Диалог = Новый ДиалогВыбораФайлов(Режим);
Если Диалог.Выбрать() Тогда
  ИмяФайла = Диалог.ПолноеИмяФайла;
  ... ОБРАБОТКА ФАЙЛА ...
КонецЕсли;


2.
...
Диалог = Новый ДиалогВыбораФайлов(Режим);
Диалог.Показать(Новый ОписаниеОповещения("ПриВыбореФайла", "ЭтаФорма", ДополнительныеПараметры));
// ЭТОТ КОД ПРИВЕДЕТ НАС В ПРОЦЕДУРУ "ПриВыбореФайла"
...
&НаКлиенте
Процедура ПриВыбореФайла(Результат, ДополнительныеПараметры) Экспорт

  Если ЗначениеЗаполнено(Результат) Тогда
    ИмяФайла = Результат[0];
   ... ОБРАБОТКА ФАЙЛА ...
  КонецЕсли;

КонецПроцедуры
Показать

3.
... где тот код, который приведет в асинхронную процедуру ?
30. starik-2005 2809 31.10.22 21:04 Сейчас в теме
(29)
.. где тот код, который приведет в асинхронную процедуру ?
Э... А это что?
&НаКлиенте
Асинх Процедура ВыбратьИмяФайла(Команда)

  Диалог = Новый ДиалогВыбораФайлов(Режим);
  Результат = Ждать Диалог.ВыбратьАсинх();
  Если ЗначениеЗаполнено(Результат) Тогда
    ИмяФайла = Результат[0];
  КонецЕсли;

КонецПроцедуры
Показать
Эта процедура асинхронна уже, кода никакого не надо - достаточно юзать "Ждать".

ЗЫ: Сдается мне, что Вы слишком переоцениваете асинхронность вообще. Она - это тот самый выход из того самого ада коллбэков, в который попадают плохие программисты. Все, больше она ни для чего не нужна.
31. acrk 725 02.11.22 12:12 Сейчас в теме
Я не понимаю, что значит "юзать "Ждать""?
Напишите ту строчку кода, которая "юзает "Ждать"".
Или программа сама как-то это делает, в смысле "ждет"? Как часто?
32. starik-2005 2809 02.11.22 18:50 Сейчас в теме
(31)
Напишите ту строчку кода, которая "юзает "Ждать"".
Э...
Результат = Ждать Диалог.ВыбратьАсинх();
Это ровно то, что и...
Обещание = Диалог.ВыбратьАсинх(); // открыли диалог
Результат = Ждать Обещание; // ждем, пока в нем что-то нажмут, в переменной "Результат" то, что там нажали.
33. acrk 725 02.11.22 22:41 Сейчас в теме
(32) Это я понимаю....

А зачем было вот это:
Асинх Процедура ВыбратьИмяФайла(Команда)
...

?
Что изменилось бы, если бы не было "Асинх" ?
34. starik-2005 2809 02.11.22 23:20 Сейчас в теме
(33)
Что изменилось бы, если бы не было "Асинх" ?
Так черным же по белому, что нельзя использовать "Ждать" в неасинхронных процедурах и функциях...
35. acrk 725 02.11.22 23:42 Сейчас в теме
(34) Да. Пришлось опять погрузиться в изучение вопроса (Давно делал, забыл уже)
Собственно претензия моя состоит в том, что правильно было бы так написать:

1. Модальный код:
&НаКлиенте
Процедура ВыбратьИмяФайла(Команда)
Диалог = Новый ДиалогВыбораФайлов(Режим);
Если Диалог.Выбрать() Тогда
ИмяФайла = Диалог.ПолноеИмяФайла;
КонецЕсли;
КонецПроцедуры

2. Код с описанием оповещения:
&НаКлиенте
Процедура ВыбратьИмяФайла(Команда)
Диалог = Новый ДиалогВыбораФайлов(Режим);
Диалог.Показать(Новый ОписаниеОповещения("ПриВыбореФайла", "ЭтаФорма", ДополнительныеПараметры));
КонецПроцедуры
...
&НаКлиенте
Процедура ПриВыбореФайла(Результат, ДополнительныеПараметры) Экспорт
Если ЗначениеЗаполнено(Результат) Тогда
ИмяФайла = Результат[0];
КонецЕсли;
КонецПроцедуры

Код увеличился, появилась еще одна процедура. Благо, что ее можно было засунуть хоть в общий модуль и вообще сделать одну процедуру на все случаи жизни.

3. Асинхронно:
&НаКлиенте
Асинх Процедура ВыбратьИмяФайла(Команда)
Диалог = Новый ДиалогВыбораФайлов(Режим);
Результат = Ждать Диалог.ВыбратьАсинх();
Если ЗначениеЗаполнено(Результат) Тогда
ИмяФайла = Результат[0];
КонецЕсли;
КонецПроцедуры

Практически вернулись к привычной модальной записи, но имеем асинхронность, которую требует современное программное окружение 1С, вроде браузеров.
38. starik-2005 2809 05.11.22 11:51 Сейчас в теме
(35)
которую требует современное программное окружение 1С, вроде браузеров
Ну алерт ничего такого не требует. Вот лямбды - да, было бы прикольно в 1С увидеть, т.к. в всех этих браузерах асинхронность через код или прописанный в промисах прямо, или через авайт тот самый. Второе само по себе проще выглядит. А UB (неопределенное поведение) - это далеко не бич современных систем, по крайней мере по сравнению с CH (адом коллбэков).
36. ovasiliev 6 03.11.22 18:41 Сейчас в теме
Ну не знаю, я привык к технологии с описаниями оповещения. Именно потому, что она логически законченная, надёжная и работает без неожиданностей. Пусть и кода в два раза больше, но для меня он читается лучше, потому что логически структурированнее.
Как по мне, технология Асинх введена в 1С всё же для любителей синхронно выглядящего кода. И чтобы было модно, "как в C#".
37. acrk 725 04.11.22 17:53 Сейчас в теме
Оставьте свое сообщение

См. также

Версионирование объектов VS История данных

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Давайте разберемся в механизме «История данных» и поэкспериментируем для наглядности. Сравним «Версионирование объектов» и «Историю данных».

06.03.2023    3559    dsdred    34    

107

Оператор GOTO в 1С - табу или волшебная палочка?

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В ежедневной практике программирования на платформе 1С оператор Goto (Перейти) практически не встречается. Не удивительно, что половина специалистов даже не подозревает о существовании данного оператора. Ну, а знающим он внушает ужас, и его стараются избегать. Так что же это за редкий оператор, и для чего он нужен?

19.02.2023    4998    Dementor    72    

43

Идентификатор объекта в запросе. Вы этого хотели?

Запросы Механизмы платформы 1С Платформа 1С v8.3 Запросы Бесплатно (free)

В платформе 8.3.22 появилась возможность получать идентификатор в запросе. Лично я ждал этого давно, но по итогу ждал большего. Что не так?

12.01.2023    8189    dsdred    13    

63

Маленькие хитрости большой платформы (часть 1)

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Ничего сверхсекретного, просто несколько полезных приёмов, как упростить себе жизнь и ускорить разработку: от банальных советов до неочевидных, на первый взгляд, приёмов.

29.12.2022    3804    zeltyr    25    

39

Практическая шпаргалка по новым возможностям языка запросов 1С

Механизмы платформы 1С Запросы Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

В предлагаемой статье решил привести примеры применения новых возможностей языка запросов 1С, начиная с версии платформы 8.3.20.

21.11.2022    14966    quazare    34    

109

Программы для исполнения 54-ФЗ Промо

С 01.02.2017 контрольно-кассовая техника должна отправлять электронные версии чеков оператору фискальных данных - правила установлены в 54-ФЗ ст.2 п.2. Инфостарт предлагает подборку программ, связанных с применением 54-ФЗ, ККТ и электронных чеков.

О цикле обратном замолвите слово...

Механизмы платформы 1С Языки и среды Платформа 1С v8.3 Платформа 1C v8.2 Бесплатно (free)

Однажды, написав статью, расписывающую достоинства 1С, я упомянул среди недостатков - мне не хватает "обратного цикла". При этом, столкнулся с непониманием - "а зачем тебе обратный цикл". Сегодня я отвечу на этот вопрос.

08.09.2022    5323    DrAku1a    69    

30

1С и Unicode

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Разбираемся, как 1С работает с текстом и отдельными символами в контексте Unicode.

05.09.2022    3709    Irwin    30    

80

Шпаргалка по функциям АСИНХ

Механизмы платформы 1С Платформа 1С v8.3 Россия Бесплатно (free)

При знакомстве с новой механикой работы с асинхронностью (обещание, ждать и асинх) делал пометки, которыми и хочу поделиться. Ничего сверхъестественного в них нет, просто небольшие примеры и некоторые всплывшие нюансы использования.

29.07.2022    12919    zeltyr    17    

137

Экспертный кейс. История расследования одного небыстрого закрытия месяца в 1C:ERP. Пример неочевидных путей расследования в виде детективной истории

HighLoad оптимизация Механизмы платформы 1С Запросы Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

В данной статье хотим рассказать об одном нашем непростом расследовании, в котором удалось собрать сразу несколько проблем на разных уровнях инфраструктуры заказчика и изначальной методологии ведения учета. Само расследование в какой-то момент стало напоминать детективную историю, с роялями в кустах, ошибками платформы, странным поведением пользователей и магическим поведением хорошо знакомых механизмов. Но мы реалисты, поэтому все проблемы были выявлены и устранены ;)

11.07.2022    5365    it-expertise    27    

56

Распознавание и загрузка документов в 1С Промо

Универсальная программа-обработка для распознавания любых сканов или фото первичных документов в 1С (счета-фактуры, УПД, ТТН, акты и тд). Точность распознания до 98%.

от 11 рублей

Состав индексов с дополнительным упорядочиванием на уровне СУБД (MS SQL) при индексации реквизитов

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В момент обсуждения с коллегами работы индексов в 1С был затронут один из вопросов, который касался темы - каким образом происходит построение индексов при индексации реквизитов у объектов 1С (конкретнее, когда свойство реквизита "Индексировать" устанавливается в "Индексировать с доп. упорядочиванием"). Ранее я всегда опирался на знания, полученные в процессе чтения официальной документации от компании 1С, опубликованной на ITS. Наши мнения в этом вопросе разошлись и, как оказалось позже, мои знания не были актуальными, в итоге было проведено некоторое исследование по данному вопросу, чтобы выяснить истину.

15.06.2022    2704    sinichenko_alex    9    

33

Динамическое обновление - это зло?

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Копнем глубже в тему "Что же такое динамическое обновление" и почему оно может привести к проблемам. И может ли?

09.05.2022    16408    Infostart    77    

227

Об одной неочевидной проблеме перехода на версию платформы 8.3.20

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

При переходе на платформу 8.3.20 мы столкнулись с ошибкой "Повторяющийся псевдоним "Ссылка" Ссылка AS Ссылка,Presentation AS Presentation,Ссылка AS Ссылка" в ряде типовых конфигураций. Причём, эта проблема оказались неизвестна ни Яндексу, ни Гуглу. Путём мучительных экспериментов нам удалось найти решение. Пока я ещё не уверен, действительно это решение или обходной костыль, а настоящая проблема -- в чём-то другом, но это решение работает в ситуации, когда всё сломалось, а проблему надо решать срочно. Предположительная причина: платформа 8.3.20 более строго относится к типизации данных в запросах, чем предыдущие версии, вываливая в случае несоблюдения новшеств малопонятные ошибки.

08.04.2022    6236    Kernelbug    26    

34

Отборы динамического списка

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Динамический список предоставляет несколько объектов "Отбор". В статье разбирается, какой для чего нужен и как их использовать на форме. Рассматриваются только возможности платформы (без БСП).

28.03.2022    22701    Gladkov_Anton    5    

65

Фишки платформы 1С 8.3 для начинающего разработчика

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

В данной заметке рассмотрены вспомогательные инструменты платформы, которыми часто пренебрегают начинающие программисты 1С.

11.03.2022    10586    Dimbayyyy    98    

61

Программы для исполнения 488-ФЗ: Маркировка товаров Промо

1 января 2019 года вступил в силу ФЗ от 25.12.2018 № 488-ФЗ о единой информационной системе маркировки товаров с использованием контрольных (идентификационных) знаков, который позволяет проследить движение товара от производителя до конечного потребителя. Инфостарт предлагает подборку программ, связанных с применением 488-ФЗ и маркировкой товаров.

Экспертный кейс. Расследование деградации производительности системы. Проведение документа “Поступление товаров и услуг” (1С:ERP 2)

Механизмы платформы 1С Запросы HighLoad оптимизация Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

В ходе проведения нагрузочного тестирования одним из наших клиентов была выявлена сильная деградация производительности системы в целом и, в частности, выполнения ключевой операции “Проведение документа поступление товаров и услуг” в течение выполнения теста. Согласно данным подсистемы БСП “Оценка производительности”, время выполнения ключевой операции “Проведение документа поступление товаров и услуг” возрастало в процессе тестирования с 15-20 секунд в начале тестирования до 150-200 секунд в его финале.

02.03.2022    4010    it-expertise    48    

30

Модульная архитектура или пара слов о расширениях. Часть I (мысли, рассуждения)

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Статья-размышление о том, какое может быть применение технологии расширений 1С и зачем нам, разработчикам/программистам на 1С, знать общепринятые паттерны проектирования приложений. Итак, а что если я вам скажу, что технология расширений 1С - это одно из прекрасных новшеств компании 1С? Пусть эта статья будет хвалебной одой расширениям 1С.

14.02.2022    6457    amon_ra    67    

25

Синхронный и асинхронный вызов в новых версиях платформы

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Начиная с платформы 8.3.18.1128 переработана технология работы с асинхронными вызовами. В данной статье хочу описать новые асинхронные вызовы и сравнить их с предыдущими на примере функции - Вопрос на клиенте.

31.01.2022    6570    Shining_ninja    17    

35

Несколько простых приемов для удобной работы в конфигураторе

Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Простая и удобная среда разработки 1С:Предприятия позволяет практически любому человеку начать работать под капотом 1С - в конфигураторе. Время идет, новички становятся программистами, специалистами, а об удобных приемах работы узнают годами, по ходу своего карьерного пути. А здорово было бы, если бы все знали удобные приемы в начале своего пути? Эти несколько приемов будут полезны новичкам, так как они затрагивают ту область работы, с которой приходится сталкиваться в начале карьеры.

12.11.2021    12070    acces969    95    

138

Как спроектировать структуру регистра сведений

Механизмы платформы 1С Платформа 1С v8.3 Запросы Бесплатно (free)

«Что может быть проще?» — это первое, что приходит в голову. Но что, если это не так? В этой статье мы попробуем затронуть некоторые вопросы, которые могут возникнуть при проектировании больших регистров.

08.11.2021    8595    Neti    60    

108

Готовые переносы данных из различных конфигураций 1C Промо

Рекомендуем готовые решения для переноса данных из различных конфигураций 1C. C техподдержкой от разработчиков и гарантией от Инфостарт.

О вложенных попытках, исключениях и о представлении ошибок

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данной статье, на небольшом примере, мне бы хотелось показать, как себя ведут вложенные "Попытка-Исключение". А также о том, чем отличаются методы ОписаниеОшибки() и ИнформацияОбОшибке().

07.11.2021    11852    Nicholas    22    

46

Обработчик ожидания. Нюансы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

ПодключитьОбработчикОжидания: некоторые подробности и особенности работы

24.08.2021    24154    Yashazz    25    

62

Прогресс-бар в поле динамического списка

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Изображаем прогресс-бары в колонке динамического списка

23.08.2021    4453    Yashazz    13    

39

ПриПолученииДанныхНаСервере + Контекст формы. Лайфхак

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Передать свои произвольные данные в событие, которое "без контекста"? Легко!

13.08.2021    7073    Yashazz    16    

43

Новичок новичку: как добавить программно кнопку на форму путем расширения

Механизмы платформы 1С Платформа 1С v8.3 Россия Бесплатно (free)

Рассказываю очень простым языком, как добавить программно кнопку в типовую конфигурацию. Сам новичок в этом деле и рассказываю на "новичковом" языке.

13.05.2021    39239    user1312100    28    

69

1СПАРК РИСКИ. Сервис оценки благонадежности контрагентов. Промо

СПАРК помогает предотвратить мошенничество со стороны компаний и предпринимателей, благодаря актуальным сведениям о компаниях и системе выявления факторов риска.Сервис позволяет управлять налоговыми рисками и комплексно оценивать благонадежность контрагентов.

Программное создание расширения

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Создание нового расширения "на лету", только штатными средствами 1С.

06.04.2021    6911    Yashazz    16    

77

Советы из Желтой тетради 📒 #1

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В этой публикации я собрал в одном месте часть советов и лайфхаков, которые открыл для себя в последнее время. Регулярно я публикую их в своём телеграм-блоге "Жёлтая тетрадь 📒 Блог программиста 1С", здесь же - дайджест этих публикаций.

15.03.2021    6387    builin    120    

52

Расширенный автоподбор при вводе по строке в поле ввода в управляемых формах

Механизмы платформы 1С Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Бесплатно (free)

Началось все с того, что штатный автоподбор при вводе по строке в поле ввода для некоторых больших справочников устраивать перестал. Вообще, для способа поиска строки "Любая часть" он работает на первый взгляд очень хорошо: работает как полнотекстовый (т.е. по нескольким словам) даже без активации полнотекстового поиска, красиво подсвечивает слова поиска в результатах. Казалось бы, все отлично. Но есть неприятное ограничение - всего лишь 10 значений в результирующем списке (у вас может быть несколько больше, так как платформа неявно добавляет результаты поиска по истории ввода). Для небольших справочников или справочников с разнородным ассортиментом все хорошо. Но не в моей ситуации. А простых путей увеличить количество выдаваемых строк на момент написания статьи мне обнаружить не удалось. Пришлось полностью переопределять автоподбор. Ниже речь пойдет именно об этом. И, к слову, в типовых конфигурациях для некоторых справочников используются похожие приемы для увеличения количества строк результата автоподбора.

21.01.2021    10207    herfis    9    

48

Работа с 1С:Аналитика Промо

Онлайн-курс предусматривает изучение возможностей системы “1С:Аналитика”, которая работает как составная часть платформы “1С:Предприятие” и обеспечивает оперативный просмотр и анализ необходимых данных.

4500 рублей

О формах 1С замолвите слово... Необычное использование знакомого всем объекта

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Неочевидно, но форму 1С можно использовать как универсальный объект, который доступен на клиенте и имеет уникальный набор свойств, методов, событий и конструктор, принимающий параметры. При этом у формы может не быть интерфейса, и ее можно даже не открывать. О реальных примерах применения такого подхода пойдет рассказ.

13.01.2021    10529    CyberCerber    46    

101

Наследование свойств элементов, или Как пользователь может сломать вашу форму

Механизмы платформы 1С Платформа 1С v8.3 Платформа 1C v8.2 Конфигурации 1cv8 Бесплатно (free)

В 1С можно установить свойства ТолькоПросмотр, Доступность и Видимость не только на элементы формы, но и на группы элементов. Но стоит ли так делать? Оказывается, пользователь может обойти запреты, которые установлены на папку. Об этом подробнее в видео.

12.01.2021    6408    SeiOkami    27    

111

Ускоряем медленный/долгий и тормозной стандартный поиск по динамическому списку, настраиваем его под себя

Механизмы платформы 1С Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Бесплатно (free)

Пользователи привыкли искать на форме списка, но, вбивая в поиск некорректные данные, могут завесить всю систему, а если еще искать нужно по НЕ полям списка, то решение только в своём поиске - все это решим в публикации с открытым кодом.

14.12.2020    39657    SizovE    2    

40

Передача параметров по значению в языке 1С

Механизмы платформы 1С Платформа 1С v8.3 ИТ-компания Бесплатно (free)

Все мы знаем, что в 1С можно написать такое: Процедура ОбработатьОбъект(Знач Объект) КонецПроцедуры Т.е. тем самым мы передаем в процедуру параметр по значению Далее в статье будут рассмотрены некоторые особенности передачи по значению объектов НЕпримитивных типов.

26.11.2020    6115    direktorSan    9    

29

Установка отбора для поля ввода управляемой формы через ПараметрыВыбора (без переопределения событий "НачалоВыбора", "Автоподбор")

Механизмы платформы 1С Платформа 1С v8.3 Управляемые формы Бесплатно (free)

Зачастую возникает необходимость ограничить вывод элементов какого-нибудь справочника или перечисления при редактировании поля ввода (отфильтровать доступные для выбора элементы) эта публикация показывает простой и эффективный способ реализации этого.

15.11.2020    16467    Eugen-S    11    

69

Подборка решений для взаимодействия со ФГИС «Меркурий» Промо

С 1 июля 2019 года все компании, участвующие в обороте товаров животного происхождения, должны перейти на электронную ветеринарную сертификацию (ЭВС) через ФГИС «Меркурий». Инфостарт предлагает подборку программ, связанных с этим изменением.

Групповое изменение реквизитов объектов расширений

Механизмы платформы 1С Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Бесплатно (free)

Доработка встроенной обработки "Групповое изменение реквизитов" для возможности изменения ссылочных реквизитов с ссылками на объекты расширения. Работает в Комплексной конфигурации 2.4.

07.11.2020    3213    Alfn    14    

23

Лайфхаки для разработчиков 1С. Часть 1

Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Россия Бесплатно (free)

Собрали 20 лайфхаков, которые используют наши программисты при работе с 1С. Формы, контрагенты, СКД, процедуры, глюки платформы и многое другое. В этой статье публикуем первую часть.

30.09.2020    9390    Neti    47    

68

Контекст любого объекта конструкцией #Если Фамилия Тогда

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Делаем инициализацию переменной в "своей" инструкции препроцессора, для получения контекстной подсказки объекта через точку. В дальнейшем в компилированном коде сама инициализация игнорируется, т.к. "своя" инструкция препроцессора НИКОГДА не выполняется.

17.08.2020    3520    sapervodichka    36    

25

Новое отображение ошибок в 1С

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим развитие механизма отображения ошибок в 1С (начиная с 8.3.17)

10.08.2020    37607    SeiOkami    45    

144

Динамический список, ключи записей. Нюансы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Заметки об особенностях динамических списков с произвольным запросом и видом ключа, отличным от "Авто"

07.08.2020    11132    Yashazz    6    

23