1С: Ускорение поиска в массиве структур
Задача: есть два массива структур. Один 500 записей, второй — порядка 900 тыс. Нужно для каждой из 500 записей, найти соответствующую запись из второй структуры.
ИсходныеДанные=Новый Структура("субабоненты,реестр_замен",Новый Массив(),Новый Массив(),Новый Массив(),Новый Массив());
- Массив «субабоненты», заполнен структурами вида «то,лс,ипу,окпу,нс,улица,дом,квартира»
- Массив «реестр_замен», заполнен структурами вида «лс,нп,улица,дом,квартира,ипу,дата_установки»
Решение 1: ищем и сопоставляем в «лоб»
найдено=0;
для каждого суб из ИсходныеДанные.субабоненты цикл
поз=поз+1;
для каждого стр из ИсходныеДанные.реестр_замен цикл
если суб.лс=стр.лс тогда
найдено=найдено+1;
конецесли;
конеццикла;
конеццикла;
сообщить("-сопоставлено лс: "+найдено);
Замеряем время выполнения…и устаём ждать.. Поиск и сопоставление длится по крайне мере несколько часов..
Решение 2:
А зачем нам в массиве субабонентов держать те данные, которых нет? Правильно, не зачем. Поэтому из массива «реестр_замен», сначала вычленим список л/с, и положим его в отдельный массив. И далее при заполнении из файла массива субабонентов, нужно штатно (функция Найти) проверять нужна такая строчка или нет в результирующем массиве? Функция «Найти» скажем работает ОЧЕНЬ быстро.
если ИсходныеДанные.список_лс.Найти(инф.лс)<>неопределено или ИсходныеДанные.список_ипу.Найти(инф.ипу)<>неопределено тогда
ИсходныеДанные.субабоненты.Добавить(инф);
конецесли;
В итоге, в массиве «субабоненты» у нас ровно то количество записей, которое в «реестр_замен «, а вовсе не 900тыс.
И дальше пробуем снова сопоставить:
найдено=0;
для каждого суб из ИсходныеДанные.субабоненты цикл
поз=поз+1;
для каждого стр из ИсходныеДанные.реестр_замен цикл
если суб.лс=стр.лс тогда
найдено=найдено+1;
конецесли;
конеццикла;
конеццикла;
сообщить("-сопоставлено лс: "+найдено);
Скрипт выполнился уже в приемлемые примерно 400 секунд

