Первый шаблон с внешним воздействием может быть актуален, например, если нужно организовать работу со сканером штрихода интерактивно.
Перем Состояние;
Перем СостояниеИз;
Перем Отладка;
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Событие = "ПолученШтрихкод" Тогда
ОбработатьСобытиеШК(Данные);
КонецЕсли;
КонецПроцедуры
Процедура ПерейтиВСостояние(СостояниеПерейти,Таймер = 0)
Если Таймер > 0 Тогда
ПодключитьОбработчикОжидания("ВызватьОбработатьСобытиеШК",Таймер,Истина);
Иначе
ОбработатьСобытиеШК();
КонецЕсли;
КонецПроцедуры
Процедура ВызватьОбработатьСобытиеШК()
ОбработатьСобытиеШК();
КонецПроцедуры
Процедура ОбработатьСобытиеШК(ШК = Неопределено)
Если Состояние = Неопределено Тогда
Состояние = "НачальныйЭкран";
КонецЕсли;
Если Отладка Тогда
Сообщить(" " + СостояниеИз + " -> " + Состояние);
КонецЕсли;
СостояниеЖдать = Неопределено; // состояние ожидающее события ШК
СостояниеПерейти = Неопределено; // состояние в которое нужно перейти не дожидаясь события ШК
Таймер = 0;
Если Состояние = "НачальныйЭкран" Тогда
// Инициализация начального Состояния
//вход
ПоказатьМакет("НачальныйЭкран");
// условие перехода
СостояниеЖдать = "ПроверкаРейса";
ИначеЕсли Состояние = "ПроверкаРейса" Тогда
//вход
СсылкаРейс = ПолучитьРейсПоШтрихкоду(ШК);
// условие перехода
Если СсылкаРейс = Неопределено Тогда
СостояниеПерейти = "Завершение";
Иначе
.....
ИначеЕсли Состояние = "ПодготовкаПечатьАктов" Тогда
//вход
ПодготовитьДанныеДляРаспечаткиАктов();
// условие перехода
Если ДанныеДляСозданияАктов.Строки.Количество()> 0 Тогда
СостояниеЖдать = "АвторизацияПользователя";
Иначе
СостояниеПерейти ="Завершение";
КонецЕсли;
ИначеЕсли Состояние = "АвторизацияПользователя" Тогда
//вход
// условие перехода
ОтветственныйЗаПечатьРейса = ПолучитьПользователяПоШК(ШК);
Если ЗначениеЗаполнено(ОтветственныйЗаПечатьРейса) Тогда
СостояниеПерейти = "СозданиеАктов";
Иначе
СостояниеПерейти = "Завершение";
КонецЕсли;
.....
ИначеЕсли Состояние = "Завершение" Тогда
// вход
Если СостояниеИз = "ПроверкаРейса" Тогда
ТекстОшибки = "Не найден документ ""Рейс"" по штрихкоду";
ПоказатьМакет("Ошибка",ТекстОшибки);
ИначеЕсли СостояниеИз = "ПроверкаРТУПоРейсу" Тогда
ТекстОшибки = "По документу " + Строка(СсылкаРейс) + " не все РТУ созданы!!";
ПоказатьМакет("Ошибка",ТекстОшибки);
.....
// условие перехода
СостояниеПерейти ="НачальныйЭкран";
Таймер = 10;
КонецЕсли;
СостояниеИз = Состояние;
Если СостояниеЖдать <> Неопределено Тогда
Состояние = СостояниеЖдать;
ИначеЕсли СостояниеПерейти <> Неопределено Тогда
Состояние = СостояниеПерейти;
ПерейтиВСостояние(СостояниеПерейти,Таймер);
КонецЕсли;
КонецПроцедуры
Второй шаблон без внешнего воздействия. Тут обращаю внимание на ключевые слова, которыми, по моему мнению, нужно называть состояния, чтобы сам алгоритм был осмыслим и читабелен.
Намеренно не стал ставить условие Пока Истина ... т.к., имхо, лучше взять любое заранее большое число. Второй шаблон также может включать произвольное количество вложенных ДКА такого же типа.
Процедура ДКА(ВнешнееСостояние="", ПеременныеНаВходе=Неопределено)
// Инициализация дополнительных переменных и начального состояния
Старт = ТекущаяДата();
Итератор = 0;
Лог = "";
Пока Итератор < 500 Цикл
ДобавитьВЛог(Лог, ""+ Итератор+". = >" + Состояние );
Если Состояние = Неопределено Тогда
Состояние = "Старт";
ИначеЕсли Состояние = "Старт" Тогда
Состояние = "Проверяю";
ИначеЕсли Состояние = "Проверяю" Тогда
// действия на входе
// условие перехода
Если Условие1 Тогда
Состояние = "Делаю";
Иначе
Состояние = "Жду";
КонецЕсли;
// действия на выходе
ДобавитьВЛог(Лог," состояние переменных на выходе ");
ИначеЕсли Состояние = "Делаю" Тогда
// действия на входе
// условие перехода
Если Условие1 Тогда
Состояние = "ПроверяюЗавершение";
ИначеЕсли Условие2 Тогда
Состояние = "Проверяю";
Иначе
Состояние = "Жду";
КонецЕсли;
// действия на выходе
ДобавитьВЛог(Лог," состояние переменных на выходе ");
ИначеЕсли Состояние = "Жду" Тогда
// действия на входе
// условие перехода
Если Условие1 Тогда
Состояние = "Проверяю";
Иначе
Состояние = "Завершение";
КонецЕсли;
// действия на выходе
ДобавитьВЛог(Лог," состояние переменных на выходе ");
ИначеЕсли Состояние = "ПроверяюЗавершение" Тогда
// действия на входе
// условие перехода
Если Условие1 Тогда
Состояние = "Проверяю";
Иначе
Состояние = "Завершение";
КонецЕсли;
// действия на выходе
ДобавитьВЛог(Лог," состояние переменных на выходе ");
ИначеЕсли Состояние = "Завершение" Тогда
// действия на входе
ДобавитьВЛог(Лог, "ОбработкаЗавершена , общее время: " + ТекущаяДата - Старт);
Прервать;
КонецЕсли;
Итератор = Итератор + 1;
КонецЦикла;
ДобавитьВЛог(Лог, " Всего итераций : " + Итератор );
// действия после завершения
ВывестиВТабличныйДокумент(...);
ПоказатьЛог(Лог);
КонецПроцедуры
Вступайте в нашу телеграмм-группу Инфостарт