Два шаблона для ДКА

27.02.26

Разработка - Математика и алгоритмы

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

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

Перем Состояние;
Перем СостояниеИз; 
Перем Отладка;

Процедура ВнешнееСобытие(Источник, Событие, Данные)
	Если Событие = "ПолученШтрихкод" Тогда
		ОбработатьСобытиеШК(Данные);
	КонецЕсли;
КонецПроцедуры

Процедура ПерейтиВСостояние(СостояниеПерейти,Таймер = 0)
	
	Если Таймер > 0 Тогда
		ПодключитьОбработчикОжидания("ВызватьОбработатьСобытиеШК",Таймер,Истина);
	Иначе
		ОбработатьСобытиеШК();
	КонецЕсли;
	
КонецПроцедуры

Процедура ВызватьОбработатьСобытиеШК()
	ОбработатьСобытиеШК();
КонецПроцедуры

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

			
	КонецЕсли;

	СостояниеИз = Состояние;
	
	Если  СостояниеЖдать <> Неопределено Тогда
		Состояние = СостояниеЖдать;
	ИначеЕсли  СостояниеПерейти  <> Неопределено Тогда
		Состояние = СостояниеПерейти;
		ПерейтиВСостояние(СостояниеПерейти,Таймер); 
	КонецЕсли;
	
	
КонецПроцедуры
  

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

Намеренно  не  стал  ставить условие   Пока  Истина ...  т.к., имхо, лучше взять любое заранее  большое число.  Второй шаблон также может включать произвольное количество вложенных ДКА  такого же типа.  


Процедура ДКА(ВнешнееСостояние="", ПеременныеНаВходе=Неопределено) 

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

 

Вступайте в нашу телеграмм-группу Инфостарт

шаблоны кода

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Математика и алгоритмы Программист 1С 8.3 Абонемент ($m)

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

1 стартмани

07.11.2025    5453    14    InFlach    17    

27

Математика и алгоритмы Запросы Программист 1С:Предприятие 8 Бесплатно (free)

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

08.07.2024    5666    ivanov660    9    

24

Математика и алгоритмы Программист 1С:Предприятие 8 1C:Бухгалтерия Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    13673    stopa85    12    

43

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    21660    user1959478    57    

41

Математика и алгоритмы Разное 1С:Предприятие 8 1C:Бухгалтерия Россия Абонемент ($m)

Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.

2 стартмани

29.09.2023    12887    maksa2005    8    

27

Математика и алгоритмы Инструментарий разработчика Программист 1С:Предприятие 8 Россия Абонемент ($m)

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

1 стартмани

09.06.2023    22555    11    SpaceOfMyHead    20    

65

Математика и алгоритмы Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    14614    RustIG    9    

30

Механизмы платформы 1С Математика и алгоритмы Программист 1С:Предприятие 8 Россия Бесплатно (free)

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

23.11.2022    13645    gzharkoj    15    

27
Для отправки сообщения требуется регистрация/авторизация