Семеро одного не ждут? Асинхронное исследование асинхронности

Публикация № 1454459

Разработка - Практика программирования

Асинх Асинхронные функции Ждать Обещание Async Await Promise

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

Появление долгожданного средства, аналогичного Async/Await в других языках, дало возможность существенно улучшить написание кода.

 

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

 

Эксперимент 1. Собственные асинхронные функции

Создадим 4 асинхронных функции, так, чтобы они вызывались каскадно:

Эксперимент1(Команда) // Функция0
    - Функция1()
        - Функция2()
            - Функция3()
                - Функция4()

Вызов каждой функции сделаем опционально: с ключевым словом Ждать и без него (в зависимости от соответствующего флажка). Будем фиксировать время, прошедшее от старта эксперимента, в следующих точках: начало выполнения функции (оно же вызов вложенной функции), начало выполнения кода после вызова вложенной функции и завершение выполнения. Тело функции - простая задержка на определенное количество секунд. Для наших функций выберем задержки 1, 2, 4, 8, 16. Надеюсь, всем понятно, почему выбран ряд степеней двойки?:) Код получившихся функций имеет вид:

&НаКлиенте
Асинх Функция Функция1()
	ДобавитьВЛог("Функция1: Старт");
	Если Ждать2 Тогда   
		Ответ2 = Ждать Функция2();
	Иначе
		Ответ2 = Функция2();
	КонецЕсли;   	
	ДобавитьВЛог("Функция1: После вызова Функция2");	
	Задержка(2);	
	ДобавитьВЛог("Функция1: Финиш");
	Возврат 1;
КонецФункции 

Результаты будем выводить в список значений на форме. Почему не в окно сообщений? Потому что, как показал эксперимент, при работе асинхронных функций порядок вывода сообщений с помощью Сообщить() не соответствует ожидаемому. Дополнительно выведем на форму значения переменных ОтветN - результатов возврата соответствующих функций ФункцияN. Кроме этого создадим обработчик ожидания, который каждую секунду будет выводить на форму текущее время.

Итак, начнем.

 

Эксперимент 1.1

Запустим наши асинхронные функции без использования Ждать

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

Через полминуты получим результат:

Функция0: Старт :: 0сек.
Функция1: Старт :: 0сек.
Функция2: Старт :: 0сек.
Функция3: Старт :: 0сек.
Функция4: Старт :: 0сек.
Функция4: Финиш :: 16сек.
Функция3: После вызова Функция4 :: 16сек.
Функция3: Финиш :: 24сек.
Функция2: После вызова Функция3 :: 24сек.
Функция2: Финиш :: 28сек.
Функция1: После вызова Функция2 :: 28сек.
Функция1: Финиш :: 30сек.
Функция0: После вызова Функция1 :: 30сек.
Функция0: Финиш :: 31сек.

Ответ1: Обещание	
Ответ2: Обещание
Ответ3: Обещание
Ответ4: Обещание

Как видим последовательность выполнения кода точно такая же, как и в случае, когда функции не асинхронные.

Вывод: работа асинхронных функций без ключевого слова Ждать ничем не отличается от работы обычных функций, разве что возвращаемое значение - Обещание.

 

Эксперимент 1.2

Сделаем теперь вызов Функция3 с помощью Ждать

Результат:

Функция1: Старт :: 0сек.
Функция2: Старт :: 0сек.
Функция3: Старт :: 0сек.
Функция4: Старт :: 0сек.
Функция4: Финиш :: 16сек.
Функция3: После вызова Функция4 :: 16сек.
Функция3: Финиш :: 24сек.
Функция1: После вызова Функция2 :: 24сек.
Функция1: Финиш :: 26сек.
Функция0: После вызова Функция1 :: 26сек.
Функция0: Финиш :: 27сек.
Функция2: После вызова Функция3 :: 27сек.
Функция2: Финиш :: 31сек.
Функция0: Старт :: 0сек.

Ответ1: Обещание	
Ответ2: Обещание
Ответ3: 1
Ответ4: Обещание

Что мы видим: после старта Функции2, запускается Функция3 и Функция4, они полностью отрабатывают, после этого работа Функции2 прерывается (несмотря на то что Функция3 полностью завершилась и результат уже готов), управление передается Функции1. Функция2 заканчивает свою работу после окончании работы всех вышестоящих функций. На первый взгляд выглядит это довольно странно, хотя определенная логика в этом есть: Ждать применяется не к функции, а к результату функции, т.е. вместо

Ответ3 = Ждать Функция3();

можно написать

Результат = Функция3();
Ответ3 = Ждать Результат;

и тогда становится понятно, почему Функция3 выполняется полностью.

Вывод: Ждать не влияет на процесс выполнения вызываемой функции. Он влияет только на порядок выполнения кода вызывающей функции после Ждать, вне зависимости от готовности результата вызванной функции.

 

Эксперимент 1.3

Добавим теперь Ждать к вызову Функции2 и Функции4

и получим результат:

Функция0: Старт :: 0сек.
Функция1: Старт :: 0сек.
Функция2: Старт :: 0сек.
Функция3: Старт :: 0сек.
Функция4: Старт :: 0сек.
Функция4: Финиш :: 16сек.
Функция2: После вызова Функция3 :: 16сек.
Функция2: Финиш :: 20сек.
Функция0: После вызова Функция1 :: 20сек.
Функция0: Финиш :: 21сек.
Функция3: После вызова Функция4 :: 21сек.
Функция3: Финиш :: 29сек.
Функция1: После вызова Функция2 :: 29сек.
Функция1: Финиш :: 31сек.

Ответ1: Обещание	
Ответ2: 1
Ответ3: Обещание
Ответ4: 1

Как видим, отработала Функция4, Функция3 приостановилась после возврата из Функции4, завершилась Функция2, Функция1 приостановилась после возврата из Функции2, завершился обработчик нажатия кнопки. После этого продолжилось выполнение Функции3 и Функции1. Так же, как и в предыдущих случаях блокировался пользовательский интерфейс и не выполнялся обработчик ожидания.

Вывод: При каскадном выполнении все функции, содержащие Ждать, приостанавливают свою работу, пока не выполнятся все вышестоящие функции. Приостановленное выполнение продолжится в том же порядке, в котором было остановлено.

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

Идем дальше. Может с применением платформенных асинхронных функций будет получше?

 

Эксперимент 2. Интерактивные функции платформы

На замену функциям модального режима(напр. Предупреждение) и функциям немодального режима (напр. ПоказатьПредупреждение) пришли асинхронные функции (напр. ПредупреждениеАсинх). Для обеспечения взаимодействия с пользователем кроме ПредупреждениеАсинх появились также ВопросАсинх и ОткрытьЗначениеАсинх. Проведем эксперимент №2.

&НаКлиенте
Процедура Эксперимент2(Команда)
	НачалоЭксперимента();
	ДобавитьВЛог("Проц: Старт");
	ИнтерактивныеФункции();
	ДобавитьВЛог("Проц: После вызова ИнтерактивныеФункции");	
	ЗапускОжиданияОтвета(1);
	ЗапускОжиданияОтвета(2);
	ЗапускОжиданияОтвета(3);	
	ДобавитьВЛог("Проц: Финиш");
КонецПроцедуры

&НаКлиенте
Асинх Процедура ИнтерактивныеФункции()
	ДатаСтарта = ТекущаяДата();
	ДобавитьВЛог("ИнтерактивныеФункции: Старт");
	Ответ1 = ПредупреждениеАсинх("Предупреждение 1");
	ДобавитьВЛог("ИнтерактивныеФункции: После вызова ПредупреждениеАсинх");
	Ответ2 = ОткрытьЗначениеАсинх("Значение 2");
	ДобавитьВЛог("ИнтерактивныеФункции: После вызова ОткрытьЗначениеАсинх");
	Ответ3 = ВопросАсинх("Вопрос 3", РежимДиалогаВопрос.ДаНет);
	ДобавитьВЛог("ИнтерактивныеФункции: После вызова ВопросАсинх");		
	ДобавитьВЛог("ИнтерактивныеФункции: Финиш");
КонецПроцедуры

&НаКлиенте
Асинх Процедура ЗапускОжиданияОтвета(Номер)
	ДобавитьВЛог("ЗапускОжиданияОтвета " + Номер + ": Старт");
	Если 	  Номер = 1 Тогда   Ответ1 = Ждать Ответ1;
	ИначеЕсли Номер = 2 Тогда   Ответ2 = Ждать Ответ2;
	ИначеЕсли Номер = 3 Тогда   Ответ3 = Ждать Ответ3;
	ИначеЕсли Номер = 4 Тогда   Ответ4 = Ждать Ответ4;	
	КонецЕсли; 
	ДобавитьВЛог("ЗапускОжиданияОтвета " + Номер + ": Финиш");
КонецПроцедуры

Код выше последовательно выполняет ПредупреждениеАсинхОткрытьЗначениеАсинх и ВопросАсинх. После этого запускается ожидание результата каждого вызова. 

Результат на экране:

 

 

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

Последовательно закроем все диалоговые окна и получим:

 

 

Обещание каждой функции превратилось в какое-либо значение. Каждая процедура ЗапускОжиданияОтвета завершилась отдельно от других — то есть система сохраняла контекст каждой функции до тех пор, пока пользователь не сделал свой выбор. К сожалению, каждое диалоговое окно блокировало интерфейс, включая предыдущие диалоговые окна, поэтому а) нельзя посмотреть, что будет, если закрывать окна в произвольном порядке, б) IRL для пользователя процесс будет выглядеть последовательным: последовательно открылись диалоговые окна, в обратном порядке их последовательно закрыли.

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

С интерактивными функциями все понятно, а что с файловыми?

 

Эксперимент 3. Функции работы с файлами

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

&НаКлиенте
Асинх Процедура Эксперимент3(Команда)
	НачалоЭксперимента();
	ДобавитьВЛог("Эксперимент 3: Старт");
	ФайловыеФункции();
	ДобавитьВЛог("Эксперимент 3: После вызова ФайловыеФункции");
	ЗапускОжиданияОтвета(1);
	ЗапускОжиданияОтвета(2);
	ДобавитьВЛог("Эксперимент 3: Финиш");
КонецПроцедуры

&НаКлиенте
Асинх Процедура ФайловыеФункции()
	НачалоЭксперимента();
	ДобавитьВЛог("ФайловыеФункции: Старт");
	Ответ1 = КопироватьФайлАсинх("D:\1\BigFile1", "D:\1\BigFile1Copy");
	ДобавитьВЛог("ФайловыеФункции: После вызова копирования 1");
	Ответ2 = КопироватьФайлАсинх("D:\1\BigFile2", "D:\1\BigFile2Copy");
	ДобавитьВЛог("ФайловыеФункции: После вызова копирования 2");
	ДобавитьВЛог("ФайловыеФункции: Финиш");
КонецПроцедуры

В третьем эксперименте сделаем программно копии файлов BigFile1 (размер ~4,2 Гб) и BigFile2 (размер ~1,4 Гб).

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

Только спустя некоторое время мы видим:

 

 

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

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

Может передача файлов на сервер будет работать лучше?

 

Эксперимент 4. Функции обмена файлами с сервером

&НаКлиенте
Процедура Эксперимент4(Команда)
	НачалоЭксперимента();
	ДобавитьВЛог("Эксперимент 4: Старт");
	ФайловыеФункции2();
	ДобавитьВЛог("Эксперимент 4: После вызова ФайловыеФункции2");
	ЗапускОжиданияОтвета(1);
	ЗапускОжиданияОтвета(2);
	ДобавитьВЛог("Эксперимент 4: Финиш");
КонецПроцедуры

&НаКлиенте
Асинх Процедура ФайловыеФункции2()
	НачалоЭксперимента();
	ДобавитьВЛог("ФайловыеФункции2: Старт");
	Ответ1 = ПоместитьФайлНаСерверАсинх(,,, "D:\1\File1");
	ДобавитьВЛог("ФайловыеФункции2: После вызова помещения файла 1");
	Ответ2 = ПоместитьФайлНаСерверАсинх(,,, "D:\1\File2");
	ДобавитьВЛог("ФайловыеФункции2: После вызова помещения файла 2");
	ДобавитьВЛог("ФайловыеФункции2: Финиш");
КонецПроцедуры

Здесь мы помещаем на сервер File1 (размер 56 Мб) и File2 (размер 23 Мб).

Итак запускаем...

Бинго! Все работает так, как нам бы хотелось:

Сразу после запуска:

 

 

через несколько секунд:

 

 

и в конце:

 

Таким образом передача 2 файлов на сервер начинается и заканчивается независимо друг от друга, время завершения операции передачи каждого файла коррелирует с его размером, то есть мы можем утверждать, что передаются они параллельно. При этом, во время передачи не блокируется интерфейс, пользователь может продолжать работать в системе, открывать другие окна и т.п.

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

На этом наши эксперименты завершены. Все эксперименты проводились в клиент-серверном режиме, в тонком клиенте, на платформе 8.3.18.1363. В следующих версиях поведение платформы может измениться. За рамками исследования остался веб-клиент, функции вроде ПодключитьРасширениеРаботыСФайламиАсинхЗапуститьПриложениеАсинх и т.п., асинхронные методы объектов МенеджерФайловыхПотоковТабличныйДокумент и других. Желающие могут продолжить эксперименты самостоятельно, обработка приложена к статье.

Хотелось бы отметить, что несмотря на все преимущества методики Асинх/Ждать не стоит отказываться от функций, использующих ОписаниеОповещения. В ряде случаев применение ОписаниеОповещения предпочтительнее. Во-первых: когда различные исходы функции требуют различной обработки и/или в процессе выполнения надо дать возможность вызывать пользовательский код - можно передать в параметрах несколько обработчиков. Для примера можно привести функцию ПоместитьФайлНаСерверАсинх(<ОписаниеОповещенияОХодеВыполнения>, <ОписаниеОповещенияПередНачалом>, <Адрес>, <ПутьКФайлу>, <УникальныйИдентификаторФормы>). Здесь совмещены оба подхода - Асинх/Ждать и  ОписаниеОповещения. Во-вторых: ОписаниеОповещения можно передать параметром внутрь каскада выполняющихся функций, для того, чтобы какая-то из них (а может и не одна), имела возможность вернуть свой результат в вызывающий модуль. Тем самым это напоминает передачу указателя на функцию в некоторых языках. Преимуществом же Асинх/Ждать является большая наглядность, сокращение объема кода и полный доступ к контексту выполнения вызывающего кода после завершения асинхронной функции (напомню, что при использовании ОписаниеОповещения необходимый контекст надо передать в ДополнительныеПараметры).

И напоследок, пара ложек дегтя. Первая ложка: отсутствует функция ОткрытьФормуАсинх. В моих проектах бОльшая часть случаев использования ОписаниеОповещения относится к открытию форм и обработке результатов закрытия. Вторая ложка: почему нельзя определить, что находится внутри Обещание без использования Ждать? Ведь Ждать вызывает приостановку выполнения кода, а это может быть вовсе не нужно. Надеемся, в будущем это будет доработано.

PS: Как всегда, в комментариях приветствуются замечания, дополнения и сообщения об ошибках. 

PPS: А что же все-таки значит в заголовке "... Асинхронное исследование ..."?

 

 

Скачать файлы

Наименование Файл Версия Размер
Асинхронное исследование асинхронности

.epf 8,23Kb
0
.epf 8,23Kb Скачать

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. alexey_kurdyukov 69 08.06.21 06:53 Сейчас в теме
Тот вариант, когда Асинх методы вызываются в не Асинх функции, а она в свою очередь тоже откуда-то вызывается у меня как-то раз завершился тем, что вывалилась пара сотен вопросов, после чего упала даже не платформа, а винда в синий экран. Так что, я бы использовал это вот всё с осторожностью.
TimkoNzt; bulpi; +2 Ответить
2. tormozit 6318 08.06.21 07:21 Сейчас в теме
В обычном приложении Сообщить() работает синхронно. Можно было бы не городить свой буфер сообщений.
DrAku1a; sinichenko_alex; +2 Ответить
3. Alxby 581 08.06.21 10:30 Сейчас в теме
(2) В управляемом приложении для эксперимента 1.3 логирование с помощью Сообщить() дает вот такой результат:
Функция1: Финиш :: 31сек.
Функция3: Финиш :: 29сек.
Функция0: Финиш :: 21сек.
Функция0: После вызова Функция1 :: 20сек.
Функция2: Финиш :: 20сек.
Функция2: После вызова Функция3 :: 16сек.
Функция4: Финиш :: 16сек.
Функция4: Старт :: 0сек.
Функция3: Старт :: 0сек.
Функция2: Старт :: 0сек.
Функция1: Старт :: 0сек.
Функция0: Старт :: 0сек.
Функция1: После вызова Функция2 :: 29сек.
Функция3: После вызова Функция4 :: 21сек.

А в обычном, да, работает нормально, более того, сообщения в окне сообщений появляются в процессе, а не по завершению эксперимента.
5. tormozit 6318 08.06.21 15:17 Сейчас в теме
(3)
более того, сообщения в окне сообщений появляются в процессе

Ну в общем то это и называется "синхронно". Конечно еще можно было бы трактовать как синхронный вывод в буфер с асинхронным отображением, но это кажется лишено смысла для вывода оперативной информации, которой обычно являются сообщения пользователю. Хотя при большом потоке сообщений асинхронное (например раз в секунду) отображение станет вполне актуальным.
Il; sinichenko_alex; +2 Ответить
7. Alxby 581 08.06.21 15:35 Сейчас в теме
(5)Так я с этим и не спорю:). Я лишь хочу уточнить, что в управляемом приложении не сохраняется порядок вывода сообщений. Кстати, можно попробовать СообщениеПользователю, вполне возможно там будет другой эффект
10. Yashazz 3794 08.06.21 22:01 Сейчас в теме
(7) поэкспериментируйте с ПолучитьСообщенияПользователю, там тоже могут ждать прелюбопытные сюрпризы - и в составе результата, и в порядке его элементов.
sinichenko_alex; +1 Ответить
9. Yashazz 3794 08.06.21 21:59 Сейчас в теме
(2) Можно было вообще и просто писать в ЖР)
12. Alxby 581 08.06.21 22:14 Сейчас в теме
(9)Можно, но ЖР анализировать менее удобно
28. kalyaka 673 10.06.21 10:10 Сейчас в теме
(2)Поясните, пожалуйста, почему при исполнении следующего кода порядок сообщений в тонком клиенте один, а в браузере Chrome другой?
Ответ представителя 1С: "порядок появления сообщений в тонком клиенте не соответствует порядку выполнения вызовов метода Сообщить().
По этому поводу зарегистрирована ошибка.
"
&НаКлиенте
Асинх Процедура ВыполнитьАсинхронно()
   Ждать 1;
   Сообщить("Начало асинхронного выполнения");
КонецПроцедуры

&НаКлиенте
Процедура КомандаВыполнить(Команда)
   Сообщить("Начало синхронного кода");
    ВыполнитьАсинхронно();
   Сообщить("Завершение синхронного кода");
КонецПроцедуры
Показать
Тонкий клиент:

Начало асинхронного выполнения
Начало синхронного кода
Завершение синхронного кода

Chrome:

Начало синхронного кода
Завершение синхронного кода
Начало асинхронного выполнения
4. 7OH 32 08.06.21 15:11 Сейчас в теме
"В следующих версиях поведение платформы может измениться."
А в истории такие случаи разве были хоть раз ?
Фраза "Нет ничего более постоянного, чем временное" - это 100% про 1С
---
Кстати тоже проводит эксперименты похожие.
Через свой "буфер" вывода и через сообщить порядок вывода был неожиданно разным в последовательности.
sinichenko_alex; +1 Ответить
6. Alxby 581 08.06.21 15:21 Сейчас в теме
(4)Я исхожу из того, что все, что не описано в документации, разработчики платформы вправе поменять без какого-либо уведомления. Вполне возможно, что в новых версиях эти эксперименты будут давать немного другой результат, при сохранении в целом описанного функционала, например копирование файлов будет многопоточно-параллельно.
8. starik-2005 2320 08.06.21 18:27 Сейчас в теме
Да, собственные "асинхронные" функции ни разу не асинхронны. Печалька.
ivanov660; Yashazz; +2 Ответить
11. Yashazz 3794 08.06.21 22:03 Сейчас в теме
Автор, не обижайтесь, но подобные исследования это на 90% пустая трата времени. Вот когда устаканится, уложится, релизов 3-4 пройдёт, тогда будет иметь смысл копать.
13. Alxby 581 08.06.21 22:19 Сейчас в теме
(11)Какие обиды? Исследование родилось не на пустом месте, а из вполне практических задач. Времени с момента появления этого функционала прошло вполне достаточно, чтобы большинство "детских болезней" были исправлены, так что на мой взгляд исследование вполне своевременно.
user598655_ilia-bers; +1 Ответить
14. anosin 28 08.06.21 23:15 Сейчас в теме
(13) интересна предметная область таких практических задач. Можно на пальцах пояснить про задачи?
15. Alxby 581 09.06.21 15:30 Сейчас в теме
(14)да ничего особенного. В рамках глубокого рефакторинга кода понадобилось выяснить особенности работы и границы применимости этого механизма
17. Darklight 27 09.06.21 16:22 Сейчас в теме
(11)Вы не правы. Исследования нужны и в самом начале - что бы люди сразу знали - "что по чём" и не строили иллюзий по поводу крутости новой функциональности
18. Yashazz 3794 09.06.21 18:07 Сейчас в теме
(17) Соглашусь. Да, кто-то должен быть первопроходцем. Но я ведь говорю о ценности этой публикации, где не грабли собраны и не баги описаны, а проведено исследование с целью подтверждения некоторой гипотезы.
24. Darklight 27 10.06.21 09:20 Сейчас в теме
(18)В статье людям показали на что можно сейчас рассчитывать. На что пока не стоит. Как пользоваться, как работает. Да, исследование далеко не полное - и это снижает его ценность, но она всё-равно есть; и даже просто почитать людям будет интересно, даже если пользоваться этим они и не собирались
16. Darklight 27 09.06.21 16:13 Сейчас в теме
Теперь у хейтеров будет меньше поводов считать язык 1С недоязыком:)

У хейтеров появится ещё больше доводов упрекать платформу, ибо толку в асинхронных функциях без параллельности совсем не много (а толковой параллельности нет даже на большинстве встроенных функций 1С, не говоря уже о том, что их просто до безобразия мало).

Главное назначение асинхронных функций в статье не раскрыто - а лишь дано поверхностное описание в конце - без чётких примеров и пояснения назначения - а именно:

Они хороши именно при работе со встроенными асинхронными функциями 1С (чаще всего интерактивными, или для файловых операций) - чтобы не дробить текст алгоритма на кучу функций-продолжений, которые используются вместе с "ОписаниеОповещения", передавая весь контекст (о как я намучился когда-то с последовательным поиском каталогов и файлов - с промежуточной обработкой результата - и это у меня ещё не было там интерактивной работы - только один последовательный алгоритм; особо помучился с циклическими поиском - ведь если на найдено, скажем, несколько каталога - то каждый из них нужно обработать отдельно - выполним в там свой поиск и ещё раз и ещё раз во вложении... и это я ещё чтение/запись файлов не стал делать асинхронным - просто не требовалось для без модальности).
Вот такие Асинх/Ждать мне бы позволили разместить весь алгоритм в одной двух асинхронных функциях.

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

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

Для работы с Фоновыми заданиями асинхронность тоже не помешала бы - но пока нету!

Автор не рассмотрел ещё одну важную тему экспериментов - асинхронные клиент-серверные вызовы. Интересно что с этим? Конечно ждать настоящей асинхронности (не параллельной) таких вызовов от 1С просто глупо! Но хотя бы какой-нибудь....
А ну да - асинхронных функций на сервере вообще нет, так что их нельзя даже с клиента запустить. Об этом стоило бы упомянуть!
И это ещё один повод хейтить 1С Предприятие 8 - ведь в других платформах асинхронные вызовы в серверном и клиент-серверном контексте - это основа всех современных алгоритмов обработки данных и клиент-серверного взаимодействия!

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

Но за статью всё равно + :-)

P.S
Кстати, интересно, для применения конструкций Асинх/Ждать нужна только платформа не моложе 8.3.18 - или нужно ещё и совместимость с 8.3.18 ставить в конфигурации? Если нужна совместимость - то толку от этой асинхронности сейчас совсем совсем мало. А к тому моменту, когда к этому режиму совместимости подтянутся типовые, и тем более, когда они начнут это активно использовать внутри конфигураций - вот тогда и смысл в применении будет, да и глюков будет поменьше, а возможностей побольше - хотя бы на йоту!

P.P.S
Интересно - а что там на выходе в байткоде... на неуправляемом приложении вроде бы можно получить для клиентского контекста. Как они это реализовали - всё на старых опКодах или новые ввели?
Il; info1i; Yashazz; +3 Ответить
20. Alxby 581 09.06.21 20:20 Сейчас в теме
(16)Отвечу по порядку. Действительно, в статье не описано подробно назначение и применение этого механизма. С одной стороны не хотелось загромождать публикацию, а с другой - по моему мнению, не стоит дублировать синтаксис-помощник и методические рекомендации от 1С - там это в нужном объеме описано (даже если "...документацию никто не читает"). Асинхронные функции и объект Обещание доступны только на клиенте, поэтому говорить о фоновых заданиях и клиент-серверных вызовах смысла не имеет (возможно что только пока). Функция4() содержит то же что и остальные, только без вызова подчиненной, так как она последняя. Для желающих весь код - в приложенной обработке, если есть проблемы со стартмани, могу выслать в личку. Конечно совместимость с 8.3.18 ставить не нужно, 1С обычно не ломает функционал в последующих версиях платформы, но чисто теоретически поведение может измениться - например функции станут работать параллельно - но ведь это же хорошо, верно? А по поводу байт-кода - см. https://www.youtube.com/watch?v=vt1aoPXx9fY. Там же более подробно рассказано и о механизме, и о применении асинхронных вызовов.
25. Darklight 27 10.06.21 09:39 Сейчас в теме
(20)Документация это хорошо, но многие ли её читают? А те кто читают, многие ли понимают всю суть? Документацию 1С пишет из рук вон плохо далеко не всегда особо содержательно и понятно, читается она, обычно, достаточно тяжело (сейчас говорю про документацию к платформе), а встроенная справка и синтаксис помощник - это вообще жесть (синтаксис помощник ругать не хочу - обычно со своей работой задачей он справляется, но это не совсем документация, по которой нужно изучать функционал, хотя отчасти можно). Да даже, если взять техническую документацию, которую пишет Микрософт, которая спроектирована достаточно хорошо (ну за десятилетия и нехилые вложения средств в юзерфрендли они научились, хотя бы техничку писать хорошо). То и тут, люди пишут пишут всякие статьи о новых фишках, исследования и т.п. - повторяя, проверяя и разжёвывая то, что достаточно чётко (но не всегда полно и понятно) написано в оф. документации. Даже есть сайты, которые пишут полностью свою, независимую (пусть и ограниченную) документацию - так как имеют своё виденье правильности подачи материала (ну и хотят заработать на рекламе). Дословно цитировать документацию не нужно. Нужно разъяснять своими словами, подкрепляя примерами конкретных исследований, привнося свой взгляд на вещи, давая свои собственные рекомендации по использованию, расставляя свои акценты. А то документации может написано одно (эффективные маркетологи и сюда уже добрались), а на деле - совсем другое!

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

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

За видео спасибо
22. Perfolenta 194 09.06.21 22:53 Сейчас в теме
(16)
асинхронных функций на сервере вообще нет

могу конечно ошибаться, но как мне кажется, для клиента они транслируют код 1С в JavaScript, а там есть похожая асинхронность...
а на сервере работает интерпретатор 1С и у него нет реализации асинхронности...
23. kalyaka 673 10.06.21 08:56 Сейчас в теме
(22) на веб-клиенте все транслируется в javascript и 1С не исключение. Javascript - это байт-код для веба, движек JS - виртуальная машина исполнения в браузерах
26. Darklight 27 10.06.21 09:40 Сейчас в теме
(22)JavaScript в 1С есть только в WEB-Клиенте. Но есть ещё Тонкий и Толстый клиенты , и вообще - неуправляемое приложение
27. kalyaka 673 10.06.21 09:55 Сейчас в теме
(26)
И тонкий клиент (при работе через веб), и веб-клиент пользуются одним и тем же набором веб-сервисов для общения с сервером приложений 1С. Реализация у клиентов, конечно, разная – тонкий клиент написан на С++, веб-клиент – на JavaScript.
Про веб-клиент 1С
29. Darklight 27 10.06.21 11:34 Сейчас в теме
(27)К чему Вы это. Речь шла только про выполнение асинхронного кода на стороне клиента
30. kalyaka 673 10.06.21 11:39 Сейчас в теме
(29) к тому что на всех клиентах по идее все должно быть одинаково реализовано. Для web клиента просто функциональность оттранслирована в JS. Для серверной части своя, отличная от клиентской части реализация платформы и в ней нету асинхронности.
31. Darklight 27 10.06.21 11:39 Сейчас в теме
(21)
Для web клиента просто функциональность оттранслирована в JS

Уже можно считать, что не одинаково
32. kalyaka 673 10.06.21 12:10 Сейчас в теме
(31) ну на уровне стековой машины логика должна быть одинакова
34. Darklight 27 10.06.21 14:53 Сейчас в теме
(32)А я всё надеялся что на WEB-клиенте весь код 1С преобразуется код в JavaScript без стековой машины
36. kalyaka 673 10.06.21 15:32 Сейчас в теме
(34) ну это не точно. Однако почему то оператор Выполнить в веб-клиенте не поддерживается, а вот Вычислить - да.
Наверно все-таки стековая машина порождает код на JS, тогда логично. В JS же выполнить код нельзя, а вот вычислить (eval) - можно.
37. Darklight 27 10.06.21 15:51 Сейчас в теме
(36)Зачем там вообще стековая машина! Когда весь код 1С модно транслировать в код "JavaScript". Вон язык "Kotlin" транслирует в JS куда более сложный код!
"JavaScript" - Это интерпретируемый язык. Тут нельзя получить примитивные инструкции из примитивных (стековая машина) и примитивно их отправить на выполнение. Весь вызываемый алгоритм должен быть полностью детерминирован
38. kalyaka 673 10.06.21 15:59 Сейчас в теме
(37) ну я предполагаю, что стековая машина на сервере не исполняет код, а транслирует в JS для клиента. Т.е. получается такой транспайлер из 1С в JS. Возможно правильнее здесь использовать термин компилятор в JS.
А если бы стековую машину тащить на клиента, то и байткод на 1С тоже тогда туда надо тащить. Код веб-клиента то открыт, может кто и расковыряет как оно там на вебе :)
39. Darklight 27 10.06.21 17:02 Сейчас в теме
(38)Я думаю, что на WEB-клиенте стековой машины никакой нет. А просто трансляция 1C -> 1C один в один
33. Perfolenta 194 10.06.21 12:26 Сейчас в теме
(26) как там внутри эти клиенты организованы я не знаю, поэтому утверждать ничего не могу... но логично предположить, что если на клиенте появилась асинхронность в языке, а на сервере нет, то там работают два разных интерпретатора...
но так как в JS такая асинхронность есть, я и предположил, что они просто слегка модифицировали транслятор с языка 1С в JS... может быть в тонком клиенте внутри тоже код JS работает, но я этого не знаю, просто предположил...
35. Darklight 27 10.06.21 14:56 Сейчас в теме
(33)
может быть в тонком клиенте внутри тоже код JS работает, но я этого не знаю, просто предположил

Наврядли - ведь код JavaScript нужно на чём-то выполнять. Ради этого жуткого "бутерброда" внедрять в Тонкий клиент JS-машину.... он тонким то после этого останется?
40. Perfolenta 194 11.06.21 09:40 Сейчас в теме
(35) JS машина это очень небольшая библиотечка, а если у Вас уже есть трансляция кода 1С в JS для веб-клиента, то технических проблем я не вижу... наоборот, три абсолютно разных программы-клиента это гораздо более сложный "бутерброд", чем две...
честно говоря, я так и не понял, работают ли асинхронные функции в обычных формах... если нет, то это скорее подтверждает мою гипотезу, а если работает, то опровергает...
19. Yashazz 3794 09.06.21 18:10 Сейчас в теме
Скорее всего дело было так: собрались авторы какой-то типовой конфигурации всем коллективом, озверев от необходимости писать кучу вызовов и лишнего кода, пришли к авторам платформы, и эдак проникновенно, вежливо, по-братски попросили хоть что-то с этим сделать. Поскольку тем посылать этих было некомильфо, обещали "что-то придумать", ну и прикрутили кривую приблуду, которая кроме как для файловых операций всерьёз нигде не имеется, не работает и хз как внутри реализована.
21. Alxby 581 09.06.21 20:21 Сейчас в теме
(19)Почаще бы так собирались. Я бы тоже поучаствовал)
41. mixsture 13.06.21 16:41 Сейчас в теме
По-моему, довольно ожидаемые результаты. Собственно, развитие асинхронности в js шло примерно также. Сначала все подофигели от сложности callback-лапше-кода (и даже придумали термин callback hell). Поэтому дальше родился promise-подход, а дальше async/await. Async/await позволяет писать и видеть перед собой программу будто она синхронная, но куски ее в реальности работают асинхронно. Насколько я знаю, async/await - это как синтаксический сахар, он будто бы дописывает громоздкие конструкции callback за вас. Поэтому ничего нового от него ожидать и не стоит (реальной многопоточности). Это просто удобное и наглядное представление кода.
Насколько я помню, в js он работает также - если вы напишите 2 своих функции с бесконечными циклами внутри, то запустить их параллельно с async/await не выйдет. Это возможно только для специально поддерживаемых функций (которые чаще всего вокруг ввода-вывода).
Оставьте свое сообщение

См. также

Безопасная работа с транзакциями во встроенном языке Промо

Практика программирования v8 1cv8.cf Абонемент ($m)

Разбираемся с опасностями использования транзакций во встроенном языке 1С. Познаем ошибку "В данной транзакции уже происходили ошибки". Учимся защищаться от них.

1 стартмани

25.03.2019    41320    tormozit    58    

Динамическая расшифровка СКД (на примере отчета)

Практика программирования v8 v8::СКД 1cv8.cf Абонемент ($m)

Предлагаю Вашему неподкупному вниманию вариант более-менее унифицированной реализации динамически формирующейся расшифровки СКД на примере простейшего отчета для конфигурации УТ 11.

1 стартмани

08.12.2020    850    mr_sav    2    

СКД: все, что вы хотели знать о подмене схемы компоновки данных в отчетах и обработках

Практика программирования v8 v8::СКД 1cv8.cf Абонемент ($m)

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

1 стартмани

07.12.2020    3409    user1502278    17    

Cбор и анализ ошибок при помощи Sentry, или как упростить жизнь себе и пользователям

Практика программирования Интеграция v8 Абонемент ($m)

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

1 стартмани

09.10.2020    5366    hexhoc    12    

Как выполнить отчет на СКД через COM и получить данные отчета? Промо

Практика программирования v8 УПП1 Россия Абонемент ($m)

Для чего это нужно. Например, нужно в одной базе получить какой-либо показатель из другой базы. Этот показатель вычисляется в каком-либо сложном отчете, который написан на СКД. Можно, конечно, "скопипастить" текст запроса из другой базы, немного подправить его и выполнять в том же COM подключении. Но с этим теряется гибкость: если отчет изменился, то нужно помнить о том, что где-то есть его "немного модифицированная" копия. В статье будет рассмотрен пример получения данных из базы ЗУП.

2 стартмани

08.05.2018    28063    wowik    3    

Программная корректировка при выводе отчета СКД

Практика программирования v8 v8::СКД 1cv8.cf Абонемент ($m)

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

1 стартмани

08.10.2020    7351    dabu-dabu    13    

Библиотека программного изменения формы (УФ)

Инструментарий разработчика Работа с интерфейсом Универсальные функции v8 1cv8.cf Абонемент ($m)

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

1 стартмани

07.08.2020    5721    BuriyLesha    17    

Загрузка, скачивание, удаление файлов с помощью НачатьПомещениеФайлаНаСервер() и НачатьПолучениеФайлаССервера()

Практика программирования v8 1cv8.cf Абонемент ($m)

В платформе 8.3.15 появились новые методы НачатьПомещениеФайлаНаСервер() и НачатьПолучениеФайлаССервера(). В данной статье рассмотрено готовое решение проверенное и прекрасно работающее на тонком и веб-клиенте.

1 стартмани

25.07.2020    8331    Flashill    13    

Как нарисовать граф на 1С Промо

Практика программирования v8 Абонемент ($m)

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

1 стартмани

09.08.2013    72157    ildarovich    117    

Параллельные вычисления расчета факториала числа N

Практика программирования v8 1cv8.cf Абонемент ($m)

Распараллеливание алгоритма с помощью фоновых заданий (асинхронные вычисления)

1 стартмани

29.06.2020    3505    Rustig    18    

1С+Firebase. Оперативное отображение информации

Интеграция Работа с интерфейсом v8 1cv8.cf Абонемент ($m)

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

1 стартмани

06.04.2020    2988    oyti    0    

Управление состоянием для шаблона MVC и работы с данными объекта

Работа с интерфейсом v8 1cv8.cf Абонемент ($m)

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

1 стартмани

18.03.2020    4045    kalyaka    35    

Простой способ индексирования интервалов Промо

Практика программирования v8 Абонемент ($m)

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

1 стартмани

28.09.2016    41076    ildarovich    22    

Методика обновления формы объекта данных при изменении объекта

Практика программирования v8 v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

09.03.2020    14887    tormozit    14    

Отправка уведомлений с помощью командной строки, Оповещения с сервера на клиент с помощью командной строки

Практика программирования v8 1cv8.cf Россия Абонемент ($m)

Отправка уведомлений с помощью команды командной строки msg. Оповестить пользователей из серверного модуля или регламентного задания, с помощью командной строки msg.

1 стартмани

05.03.2020    7091    user5300    3    

Вывод сообщений в HTML поле средствами 1С

Практика программирования v8 v8::УФ Абонемент ($m)

Пример использования вывода большого количества сообщений в поле HTML. С возможностью открывать ссылочные объекты и создавать новые объекты передавая параметры прямо из HTML поля. Протестировано на релизах 8.3.12 и 8.3.15+

2 стартмани

31.01.2020    7095    burni4    16    

Бесплатная проверка контрагентов в ФНС (общий модуль с алгоритмом). На примере выводим статус в список справочника контрагентов Промо

Практика программирования v8 1cv8.cf Абонемент ($m)

Если вам интересно проверить контрагенте в ФНС, вам поможет данная публикация. Весь алгоритм работы строится на основе данных, полученных с сервиса http://npchk.nalog.ru совершенно бесплатно.

1 стартмани

01.02.2018    36737    rpgshnik    49    

Краткое руководство по внесению изменений в конфигурацию

Практика программирования v8 1cv8.cf Абонемент ($m)

Кратко описаны основополагающие моменты при старте групповой разработки конфигурации несколькими программистами. Полезно для проектной документации как требование к разработчикам или сопровождающей компании.

1 стартмани

13.01.2020    20499    sapervodichka    41    

Универсальные функции: разложение произвольной строки адреса в структуру

Практика программирования Универсальные функции v8 1cv8.cf Абонемент ($m)

Процедуры и функции раскладывают произвольную строку адрес в структуру по ключевым словам.

1 стартмани

30.12.2019    5072    vik070777    10    

Генерация управляемой формы на основе обычной (proof of concept)

Работа с интерфейсом v8 v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

06.11.2019    7876    user700211_a.straltsou    21    

БСП: Дополнительная обработка (Регламенты), примеры от простого к сложному Промо

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Абонемент ($m)

Очень много попадается странных решений, которые можно решить через БСП:Дополнительные отчеты и обработки. Я бы вообще БСП из-за этой подсистемы переименовал в «Большое Спасибо Программистам». Поработаем с подсистемой в части написания регламентных заданий.

1 стартмани

10.05.2018    49857    dsdred    44    

"Живые" картинки со Snap.SVG

Практика программирования WEB Работа с интерфейсом v8 Абонемент ($m)

В статье рассмотрен пример использования http-сервисов для визуализации данных

1 стартмани

24.10.2019    14576    blackhole321    7    

RLS - дубли условий в запросах к СУБД

Практика программирования Роли и права v8 v8::Права 1cv8.cf Абонемент ($m)

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

1 стартмани

07.10.2019    9376    geron4    4    

Полное копирование одной формы в другую

Практика программирования Универсальные обработки Работа с интерфейсом v8 1cv8.cf Абонемент ($m)

Однажды я столкнулся с необходимостью открыть форму ЛЮБОГО документа с определенными изменениями, не зависящими от структуры объекта (например, заблокировать все кнопки). В интернете решения я не нашел. Обычно на форумах на запросы подобного рода отвечают чем-то вроде "покажи первоначальную задачу, а не спрашивай как реализовать то, что ты придумал". Тем не менее, мне стало интересно, как это можно сделать.

1 стартмани

03.10.2019    6948    nekit_rdx    24    

Некоторая работа с данными через COM Промо

Практика программирования v8 Абонемент ($m)

В статье приведены примеры работы с Платформой 8.X через COM (точнее, через объект COMConnector). Примеры кода были использованы при реализации прикладных задач в процессе трудовой деятельности.

2 стартмани

05.12.2012    59078    wowik    32    

Многопоточная обработка данных на примере перепроведения документов

Обработка документов Практика программирования v8 ERP2 УТ11 КА2 Абонемент ($m)

Дальнейшее развитие темы фоновой обработки данных - проведение документов в потоках. Настройка параметров и запуск основного процесса (менеджера потоков). Разбивка документов для проведения на не связанные друг с другом наборы и запуск дополнительных фоновых заданий для отдельных потоков. Отслеживание выполнения каждого потока в родительском сеансе.

1 стартмани

17.09.2019    11116    ids79    46    

Отображение истории выполнения по всем задачам комплексного процесса в документообороте

Документооборот и делопроизводство Практика программирования v8 ДО УУ Абонемент ($m)

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

1 стартмани

15.09.2019    8008    pavelpribytkin96    8    

Описание формата внутреннего представления данных 1С в контексте обмена данными

Практика программирования Внешние источники данных v8 v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

06.09.2019    20932    Dementor    31    

Работа со схемой запроса Промо

Инструментарий разработчика Практика программирования v8 v8::Запросы Абонемент ($m)

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

1 стартмани

24.04.2018    48479    kalyaka    39    

Еще один способ программной модификации управляемых форм

Работа с интерфейсом v8 v8::УФ 1cv8.cf Абонемент ($m)

Пример программной модификации управляемой формы для случая когда вызов метода СобытияФорм.ПриСозданииНаСервере разработчиком конфигурации не предусмотрен.

1 стартмани

03.09.2019    4919    infosoft-v    15    

Удобный просмотр результата запроса с большим количеством временных таблиц

Практика программирования v8 Абонемент ($m)

Если Вам часто приходится просматривать в отладчике сложные пакетные запросы с большим количеством временных таблиц, то эта статья для Вас.

1 стартмани

27.08.2019    12134    ids79    22    

Запуск фонового задания во внешней обработке. Отключение предупреждений защиты от опасных действий в фоновом задании

Практика программирования v8 1cv8.cf Абонемент ($m)

Как запустить фоновое задание из модуля внешней обработки используя БСП. Как отключить безопасный режим и сообщения защиты от опасных действий независимо от профиля безопасности пользователя в фоновом задании во внешней обработке.

2 стартмани

24.08.2019    14563    BenGunn    22    

Многопоточность. Универсальный «Менеджер потоков» (фреймворк) с отслеживанием зависимости объектов Промо

Практика программирования Математика и алгоритмы Универсальные функции Производительность и оптимизация (HighLoad) v8 1cv8.cf Россия Абонемент ($m)

Восстановление партий, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

26.05.2017    50668    DarkAn    86    

Изменяющееся контекстное меню в 1С 8.3

Практика программирования Работа с интерфейсом Разработка v8 v8::УФ Абонемент ($m)

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

1 стартмани

06.08.2019    19862    signum2009    16    

Процедура ПриКомпоновкеРезультата

Практика программирования v8 1cv8.cf Абонемент ($m)

Коллекция кода

1 стартмани

26.07.2019    51073    vasilev2015    64    

10 способов получить модуль числа (а может, и больше)

Практика программирования Разработка v8 1cv8.cf Абонемент ($m)

Пишем функцию вычисления модуля числа. Сколько способов существует? Давайте посчитаем!

1 стартмани

11.07.2019    12085    sam441    30    

Новый запрос и новая таблица значений как функции Промо

Практика программирования v8 Абонемент ($m)

Предлагается две простые функции, использование которых уменьшает объем кода в конфигурациях на платформе «1С:Предприятие 8». Эти функции можно добавлять к своему общему модулю, что сделает процесс программирования более эффективным.

1 стартмани

27.11.2012    45931    ildarovich    48    

Ловец дедлоков СУБД

Производительность и оптимизация (HighLoad) Практика программирования Разработка v8 Россия Абонемент ($m)

Анализ простейшего дедлока СУБД в рабочей базе с использованием ЦУП (центра управления производительностью) и profiler MS SQL (Microsoft SQL Server). Эта статья будет полезна людям, изучающим вопросы оптимизации работы 1С, или тем, у кого возникают дедлоки в рабочей базе. UPD 09.07.2019 добавлено воспроизведение блокировки в случае установки управляемой блокировки перед чтением набора записей регистра сведений. UPD 10.07.2019 добавлена тестовая база с примером.

1 стартмани

08.07.2019    12074    azazana    80    

Мониторинг производительности и искусственный интеллект

Производительность и оптимизация (HighLoad) Практика программирования Разработка v8 Абонемент ($m)

Расскажем и покажем практически, как использовать искусственный интеллект на страже мониторинга производительности. У вас появится возможность создать собственного помощника Ларису, которая возьмет на себя вопросы по контролю и диагностике состояния обслуживаемой системы.

1 стартмани

01.07.2019    10010    ivanov660    28    

"Убер на складе": динамический расчет маршрутов с учетом реальных расстояний

Учет ТМЦ Практика программирования Учет ТМЦ v8 УУ Абонемент ($m)

Представляю методику и инструмент для динамического расчета маршрутов отбора на высоконагруженных складах для максимального повышения эффективности склада, ускорения проходимости и, как следствие, экономии денег. Это методика и обработка для интеграции в WMS решения. Тестировалось на 1С 8.3.14.1565.

3 стартмани

24.06.2019    18365    informa1555    17    

Уровни, глубина, прародители, циклы и аналоги запросом Промо

Практика программирования v8 1cv8.cf Абонемент ($m)

В продолжение публикации «Транзитивное замыкание запросом» [http://infostart.ru/public/158512/] добавлены другие варианты использования того же приема. Приведены запросы для быстрого определения уровней всех элементов справочника, максимальной глубины справочника, прародителей произвольных элементов справочника, запрос для быстрого определения циклов (на примере справочника спецификаций «1С:Управление производственным предприятием») и определения множеств аналогов номенклатуры (также на примере конфигурации «1С:Управление производственным предприятием»).

1 стартмани

13.11.2012    117047    ildarovich    98    

1С:Ассемблер. Немного летнего веселья!

Практика программирования Разработка v8 1cv8.cf Абонемент ($m)

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

1 стартмани

21.06.2019    31970    Evil Beaver    143    

Совместное использование 1С:Сервер взаимодействия и Документооборот 8 КОРП, редакция 2.1.13 - Уведомления для рабочего стола

Пользователю системы Работа с интерфейсом Интеграция Документооборот и делопроизводство Документооборот и делопроизводство v8 ДО УУ Абонемент ($m)

С версии ДО 2.1.13 в программу встроена подсистема Обсуждения. Данная подсистема позволяет производить уведомление пользователей без необходимости открытия программы.

1 стартмани

18.06.2019    14515    ilya.rudziak    10    

Простые примеры сложных отчетов на СКД

Практика программирования v8 v8::СКД 1cv8.cf Абонемент ($m)

Подписи в отчете. Особенности соединения наборов: как соединить несоединяемое. Остатки на дату и обороты по месяцам в одном отчете. Курс валюты на каждую дату без группировок и соединений в запросе. Отчет с произвольными колонками и с произвольной последовательностью. "Неадекватный отчет".

1 стартмани

12.06.2019    33882    Hatson    32    

Неоплаченные долги при распределении оплаты по правилу ФИФО одним запросом и намного быстрее, чем Вы думали Промо

Практика программирования Дебиторская и кредиторская задолженность Дебиторская и кредиторская задолженность v8 v8::СКД КА1 УТ10 УПП1 УУ Абонемент ($m)

Предлагается метод для быстрого нахождения неоплаченных долгов при распределении оплаты по правилу ФИФО, основанный на дихотомии. Описывается реализация метода в виде достаточно простого запроса, решающего за линейное время указанную задачу, считавшуюся ранее существенно более трудоемкой. Приводятся примеры использования запроса в отчетах на СКД для конфигураций УТ, КА, УПП.

1 стартмани

28.02.2014    69939    ildarovich    131    

Создание внешней печатной формы в формате документа Word

Практика программирования Разработка v8 1cv8.cf Абонемент ($m)

В статье написано, как создать внешнюю печатную форму (для конфигураций с БСП) в формате Word.

1 стартмани

17.05.2019    19976    ВикторП    22    

Поле адреса в своем справочнике на примере 1С:Бухгалтерия 3

Практика программирования Разработка v8 v8::БУ БП3.0 Россия Абонемент ($m)

В публикации описано, как добавить поле адреса в свой справочник, чтобы вводить адрес через адресный классификатор.

1 стартмани

17.05.2019    7310    vasilievil    4    

Пример настройки шаблонов и реализации печати отчетов в документ MS Word используя функциональную часть "Библиотеки Стандартных Подсистем 1С" (БСП)

Практика программирования Разработка v8 Россия Абонемент ($m)

В конфигурации выбраны и использованы только необходимые объекты библиотеки стандартных подсистем для реализации вывода отчёта, с табличными частями, в документ MS Word. Показан пример создания необходимых областей в шаблоне для вывода параметров в отчёт.

1 стартмани

23.04.2019    7840    olegpkc    11    

Транзитивное замыкание запросом Промо

Практика программирования v8 1cv8.cf Абонемент ($m)

В частности, показывается, как одним пакетным запросом найти ВСЕХ предков (потомков) в иерархическом справочнике. Аналогично можно определять входимость деталей в узлы и готовые изделия по их спецификациям, определять подмножества аналогичных запчастей по цепочке аналогов, решать другие подобные задачи. Приложен файл с примером отчета для замыкания иерархии произвольного справочника, позволяющий протестировать быстродействие запроса в разных условиях.

1 стартмани

29.10.2012    89987    ildarovich    120    

Ops средствами 1С:Предприятие

Практика программирования Разработка v8 1cv8.cf Абонемент ($m)

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

1 стартмани

23.04.2019    18157    blackhole321    28    

1C + Python + Django Rest Framework + Vue.js. Опыт несложной full-stack разработки

Практика программирования Внешние источники данных Обмен через XML WEB Разработка v8 1cv8.cf Абонемент ($m)

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

1 стартмани

22.04.2019    38118    riposte    66    

Вывод вариантов СКД в таблицы на управляемой форме

Практика программирования Работа с интерфейсом v8 v8::УФ v8::СКД 1cv8.cf Абонемент ($m)

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

05.04.2019    12382    artkor    1    

[EnterpriseData] Антисвертка характеристик номенклатуры при выгрузке в Бухгалтерию

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 v8::ПВХ КД УНФ БП3.0 Россия БУ Абонемент ($m)

Рассмотрена выгрузка каждой пары значений Номенклатура - Характерстика из УНФ 1.6 в отдельную номенклатуру в Бухгалтерию 3.0 путём доработки правил обмена в формате EnterpriseData.

1 стартмани

27.03.2019    5454    nforce    6