Поиск следующего элемента в порядке обхода элементов управляемой формы

Функция ФормаСледующийЭлементОбхода(...)

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

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

Функции нужно поместить в общий модуль с расположением:


// Назаренко_СВ 2018-09-10
//
// Находит следующий после указанного элемент в порядке обхода формы (управляемой).
//
//Параметры:
// Элементы – ВсеЭлементыФормы – Коллекция элементов формы, среди которых нужно найти следующий.
// ТекущийЭлемент - Элемент формы - Элемент формы, следующий в порядке обхода за которым необходимо найти.
//
//Возвращаемое значение:
// Элемент формы, – Найденный следующий после указанного элемента в порядке обхода элемент.
// Неопределено     Если следующий элемент в обходе не найден, то возвращает значение Неопределено.
//
Функция ФормаСледующийЭлементОбхода(Элементы, ТекущийЭлемент) Экспорт
	Результат = Неопределено;
	Для Каждого Элемент Из Элементы Цикл
		Если ЭлементУчаствуетВОбходе(Элемент) Тогда
			Если Результат <> Неопределено Тогда
				Результат = Элемент;
				Прервать;
			ИначеЕсли Элемент = ТекущийЭлемент Тогда
				Результат = Элемент;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	Если Результат = Неопределено Тогда
		// Значит текущий элемент был последним доступным и нужно спозиционироваться на первый доступный элемент.
		Для Каждого Элемент Из Элементы Цикл
			Если ЭлементУчаствуетВОбходе(Элемент) Тогда
				Результат = Элемент;
				Прервать;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	Возврат Результат;
КонецФункции

#Область ВспомогательныеМетоды

// Назаренко_СВ 2018-09-10
//
// Определяет, участвует ли указанный элемент формы в обходе.
//
//Параметры:
// Элемент – Элемент формы – Проверяемый элемент формы.
//
//Возвращаемое значение:
// Булево – Признак того, что указанный элемент формы участвует в обходе.
//
Функция ЭлементУчаствуетВОбходе(Элемент)
	ТипЭлемента = ТипЗнч(Элемент);
	Результат =	(
					ТипЭлемента = Тип("ПолеФормы")
					ИЛИ ТипЭлемента = Тип("ТаблицаФормы")
					ИЛИ
					(
						ТипЭлемента = Тип("ДекорацияФормы")
						И ТипЗнч(Элемент.Родитель) <> Тип("ПолеФормы")
						И ТипЗнч(Элемент.Родитель) <> Тип("ГруппаФормы")
					)
					ИЛИ ТипЭлемента = Тип("КнопкаФормы")
				)
				И Элемент.Доступность
				И
				(
					(
						Элемент.ПропускатьПриВводе <> Неопределено
						И НЕ Элемент.ПропускатьПриВводе
					)
					ИЛИ
					(	Элемент.ПропускатьПриВводе = Неопределено
						И
						(
							Элемент.ОтображениеПредупрежденияПриРедактировании = ОтображениеПредупрежденияПриРедактировании.Отображать
							ИЛИ
							(
								Элемент.ОтображениеПредупрежденияПриРедактировании = ОтображениеПредупрежденияПриРедактировании.Авто
								И Элемент.Имя <> "Код"
								И Элемент.Имя <> "Номер"
							)
						)
					)
				)
				;
	Возврат Результат;
КонецФункции

#КонецОбласти
		

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