1С: Ускорение поиска в массиве структур

Задача: есть два массива структур. Один 500 записей, второй — порядка 900 тыс. Нужно для каждой из 500 записей, найти соответствующую запись из второй структуры.

ИсходныеДанные=Новый Структура("субабоненты,реестр_замен",Новый Массив(),Новый Массив(),Новый Массив(),Новый Массив());
  • Массив «субабоненты», заполнен структурами вида «то,лс,ипу,окпу,нс,улица,дом,квартира»
  • Массив «реестр_замен», заполнен структурами вида «лс,нп,улица,дом,квартира,ипу,дата_установки»

Решение 1: ищем и сопоставляем в «лоб»

	найдено=0;
	для каждого суб из ИсходныеДанные.субабоненты цикл
		    поз=поз+1;
			для каждого стр из ИсходныеДанные.реестр_замен цикл			
				если суб.лс=стр.лс тогда
					найдено=найдено+1;		
				конецесли;	
			конеццикла;
	конеццикла;	
	сообщить("-сопоставлено лс: "+найдено);	

Замеряем время выполнения…и устаём ждать.. Поиск и сопоставление длится по крайне мере несколько часов..

Решение 2:

А зачем нам в массиве субабонентов держать те данные, которых нет? Правильно, не зачем. Поэтому из массива «реестр_замен», сначала вычленим список л/с, и положим его в отдельный массив. И далее при заполнении из файла массива субабонентов, нужно штатно (функция Найти) проверять нужна такая строчка или нет в результирующем массиве? Функция «Найти» скажем работает ОЧЕНЬ быстро.

					если ИсходныеДанные.список_лс.Найти(инф.лс)<>неопределено или ИсходныеДанные.список_ипу.Найти(инф.ипу)<>неопределено тогда
						ИсходныеДанные.субабоненты.Добавить(инф);			                                                
					конецесли;

В итоге, в массиве «субабоненты» у нас ровно то количество записей, которое в «реестр_замен «, а вовсе не 900тыс.

И дальше пробуем снова сопоставить:

найдено=0;
	для каждого суб из ИсходныеДанные.субабоненты цикл
		    поз=поз+1;
			для каждого стр из ИсходныеДанные.реестр_замен цикл			
				если суб.лс=стр.лс тогда
					найдено=найдено+1;		
				конецесли;	
			конеццикла;
	конеццикла;	
	сообщить("-сопоставлено лс: "+найдено);	

Скрипт выполнился уже в приемлемые примерно 400 секунд

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.