При выполнении поиска строки в таблице значений (с помощью метода таблицы значений Найти()) платформой выполняется перебор строк этой таблицы. Из-за чего, при большом количестве строк, поиск может занимать значительное время. Для алгоритмов, критичных ко времени выполнения, для которых характерно частое выполнение поиска по значению одной колонки в таблице с большим количеством строк, рекомендуется применять описанный здесь метод.
Общее описание метода.
В отличие от таблицы значений поиск значения примитивного типа в объекте Соответствие выполняется значительно быстрее в силу различий их реализации в платформе. Поэтому хранение исходной таблицы значений предлагается выполнять в объекте типа Соответствие. При этом ключом элемента соответствия будет являться условный "идентификатор" значения строки таблицы из колонки, по которой должен осуществляться поиск. Для значений примитивного типа таким "идентификатором" будет само это значение. Для ссылочных значений, за исключением перечислений, "идентификатором" может быть его уникальный идентификатор, получаемый с помощью функции Строка(УникальныйИдентификатор())
Значением элемента соответствия будет является сама строка таблицы значений. После этого возможно быстрое получение произвольной строки исходной таблицы значений по произвольному значению из колонки поиска.
!!! Важно учитывать, что порядок элементов в соответствии является неопределенным, поэтому данный метод не следует применять в алгоритмах, для которых важен порядок строк исходной таблицы значений. Поиск ссылочного значения в соответствии выполняется не быстрее чем в таблице значений, поэтому применение данного метода без приведения таких значений к условному «идентификатору» не даст выигрыша в быстродействии.
Также следует учитывать, что для описанного заполнения соответствия необходимо будет выполнить обход всех строк таблицы значений. Что может занимать значительное время.
//Пример использования приведен для случая, когда искомые значения имеют ссылочный тип. //Предположим, выполняется обработка неких "Объектов обработки", дополнительные параметры которых сохраняются в отдельной таблице значений и получаются по мере надобности. ////////////////////////////////////////////// Перем мСоответствиеПараметровОбъектов; // переменная модуля необходима, если получение параметров выполняется из различных процедур. // Процедура заполнения соответствия Процедура ПолучитьЗначениеПараметровОбъектов() мСоответствиеПараметровОбъектов.Очистить(); Запрос = Новый Запрос; Запрос.Текст = "Выбрать ОбъектыОбработки.Ссылка КАК ОбъектОбработки, |.... |ИЗ Справочник.Объекты КАК ОбъектыОбработки |......."; ТаблицаЗапроса = Запрос.Выполнить().Выгрузить(); КолвоСтрокВТаблице = ТаблицаЗапроса.Количество(); Для индекс = 1 по КолвоСтрокВТаблице СтрокаИходнойТаблицы = ТаблицаЗапроса[КолвоСтрокВТаблице - индекс]; мСоответствиеПараметровОбъектов[Строка(СтрокаИходнойТаблицы.ОбъектОбработки.УникальныйИдентификатор())] = СтрокаИходнойТаблицы; КонецЦикла; КонецПроцедуры Функция ПолучитьЗначениеПараметра(ОбъектОбработки, ИмяСвойства) СтрокаТаблицыПараметров = мСоответствиеПараметровОбъектов[Строка(ОбъектОбработки.УникальныйИдентификатор())]; Если СтрокаТаблицыПараметров <> Неопределено Тогда Возврат СтрокаТаблицыПараметров[ИмяСвойства]; Иначе Возврат Неопределено; КонецЕсли; КонецФункции // Устанавливаем тип для переменной мСоответствиеПараметровОбъектов мСоответствиеПараметровОбъектов = Новый Соответствие; ///////////////////////////////////////////// //После заполнения данного соответствия в любой процедуре модуля возможно получение данных по "Объекту обработки" с помощью: ЗначениеПараметра = ПолучитьЗначениеПараметра(СсылкаНаОбъект, ИмяПараметра) |
Дата: 2018-11-18, просмотров: 267.