1С 8.3 Поиск значения в Дереве Значений
Данные > Примеры кода 1С > 1С 8.3 Дерево значений
Перейти в раздел примеры кода 1С 8.3:

Функция выполняет рекурсивный поиск указанного значения в дереве значений, включая все подчиненные строки. Поиск может выполняться как по конкретной колонке, так и по всем колонкам дерева.
Параметры:
- СтрокиДерева (КоллекцияСтрокДереваЗначений) - коллекция строк дерева значений, в которой нужно выполнить поиск
- Значение (Произвольный) - значение, которое необходимо найти
- ОбластьПоиска (Строка или КоллекцияКолонокДереваЗначений) - определяет область поиска:
- если передана строка - поиск выполняется только в указанной колонке
- если передана коллекция колонок - поиск выполняется во всех указанных колонках
Возвращаемое значение:
- Если значение найдено - возвращается найденная строка дерева значений
- Если значение не найдено - возвращается строка "!Значение не найдено!"
Найти значение в ДЗ в 1С 8.3:
// Ищет значение в дереве значений (рекурсивно, включая подчиненные строки)
//
// Параметры:
// СтрокиДерева - КоллекцияСтрокДереваЗначений - строки для поиска
// Значение - Произвольный - искомое значение
// ОбластьПоиска - Строка - имя колонки для поиска
// - КоллекцияКолонокДереваЗначений - колонки для поиска
// СравниватьТипы - Булево - если Истина, сравнивает типы строго (по умолчанию Ложь)
//
// Возвращаемое значение:
// СтрокаДереваЗначений - если значение найдено
// Неопределено - если значение не найдено
//
Функция НайтиЗначениеВДеревеЗначений(СтрокиДерева, Значение, ОбластьПоиска, СравниватьТипы = Ложь) Экспорт
ИщемПоВсемКолонкам = ТипЗнч(ОбластьПоиска) = Тип("КоллекцияКолонокДереваЗначений");
Для Каждого Строка Из СтрокиДерева Цикл
// Поиск в текущей строке
Если ИщемПоВсемКолонкам Тогда
// Поиск по всем указанным колонкам
Для Каждого Колонка Из ОбластьПоиска Цикл
Если СравнитьЗначения(Строка[Колонка.Имя], Значение, СравниватьТипы) Тогда
Возврат Строка;
КонецЕсли;
КонецЦикла;
Иначе
// Поиск по конкретной колонке
Если СравнитьЗначения(Строка[ОбластьПоиска], Значение, СравниватьТипы) Тогда
Возврат Строка;
КонецЕсли;
КонецЕсли;
// Рекурсивный поиск в подчиненных строках
Если Строка.КоличествоПодчиненных() > 0 Тогда
НайденнаяСтрока = НайтиЗначениеВДеревеЗначений(
Строка.ПолучитьПодчиненные(),
Значение,
ОбластьПоиска,
СравниватьТипы);
Если НайденнаяСтрока <> Неопределено Тогда
Возврат НайденнаяСтрока;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
// Вспомогательная функция для сравнения значений
// с учетом или без учета типов данных
Функция СравнитьЗначения(Значение1, Значение2, СравниватьТипы)
Если СравниватьТипы Тогда
Возврат Значение1 = Значение2;
Иначе
Возврат Значение1 = Значение2 Или Строка(Значение1) = Строка(Значение2);
КонецЕсли;
КонецФункции
//
// Параметры:
// СтрокиДерева - КоллекцияСтрокДереваЗначений - строки для поиска
// Значение - Произвольный - искомое значение
// ОбластьПоиска - Строка - имя колонки для поиска
// - КоллекцияКолонокДереваЗначений - колонки для поиска
// СравниватьТипы - Булево - если Истина, сравнивает типы строго (по умолчанию Ложь)
//
// Возвращаемое значение:
// СтрокаДереваЗначений - если значение найдено
// Неопределено - если значение не найдено
//
Функция НайтиЗначениеВДеревеЗначений(СтрокиДерева, Значение, ОбластьПоиска, СравниватьТипы = Ложь) Экспорт
ИщемПоВсемКолонкам = ТипЗнч(ОбластьПоиска) = Тип("КоллекцияКолонокДереваЗначений");
Для Каждого Строка Из СтрокиДерева Цикл
// Поиск в текущей строке
Если ИщемПоВсемКолонкам Тогда
// Поиск по всем указанным колонкам
Для Каждого Колонка Из ОбластьПоиска Цикл
Если СравнитьЗначения(Строка[Колонка.Имя], Значение, СравниватьТипы) Тогда
Возврат Строка;
КонецЕсли;
КонецЦикла;
Иначе
// Поиск по конкретной колонке
Если СравнитьЗначения(Строка[ОбластьПоиска], Значение, СравниватьТипы) Тогда
Возврат Строка;
КонецЕсли;
КонецЕсли;
// Рекурсивный поиск в подчиненных строках
Если Строка.КоличествоПодчиненных() > 0 Тогда
НайденнаяСтрока = НайтиЗначениеВДеревеЗначений(
Строка.ПолучитьПодчиненные(),
Значение,
ОбластьПоиска,
СравниватьТипы);
Если НайденнаяСтрока <> Неопределено Тогда
Возврат НайденнаяСтрока;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
// Вспомогательная функция для сравнения значений
// с учетом или без учета типов данных
Функция СравнитьЗначения(Значение1, Значение2, СравниватьТипы)
Если СравниватьТипы Тогда
Возврат Значение1 = Значение2;
Иначе
Возврат Значение1 = Значение2 Или Строка(Значение1) = Строка(Значение2);
КонецЕсли;
КонецФункции
Использование:
// Поиск с обычным сравнением (без учета типов)
НайденнаяСтрока = НайтиЗначениеВДеревеЗначений(
Дерево.Строки,
"123", // Ищем строку "123"
"Код", // В колонке "Код"
Ложь); // Без учета типа данных
// Поиск со строгим сравнением (с учетом типов)
НайденнаяСтрока = НайтиЗначениеВДеревеЗначений(
Дерево.Строки,
123, // Ищем число 123
"Код", // В колонке "Код"
Истина); // С учетом типа данных
// Поиск по нескольким колонкам
НайденнаяСтрока = НайтиЗначениеВДеревеЗначений(
Дерево.Строки,
"Т001",
Дерево.Колонки, // Ищем во всех колонках
Ложь);
НайденнаяСтрока = НайтиЗначениеВДеревеЗначений(
Дерево.Строки,
"123", // Ищем строку "123"
"Код", // В колонке "Код"
Ложь); // Без учета типа данных
// Поиск со строгим сравнением (с учетом типов)
НайденнаяСтрока = НайтиЗначениеВДеревеЗначений(
Дерево.Строки,
123, // Ищем число 123
"Код", // В колонке "Код"
Истина); // С учетом типа данных
// Поиск по нескольким колонкам
НайденнаяСтрока = НайтиЗначениеВДеревеЗначений(
Дерево.Строки,
"Т001",
Дерево.Колонки, // Ищем во всех колонках
Ложь);
0
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник