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

Функция ДанныеФормыКоллекцияЭлементовДереваНайтиСтроки(...)

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

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

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

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