Вход | Регистрация

Форумы на Кубань.Ру


1С:Предприятие ::

Метки: 

Поиск по сложным критериям в справочниках большого объема

Ø
Я
   Ruslik
13.07.00 - 23:59
Помогите решить проблему начинающим.
Необходимо максимально ускорить поиск информации в справочниках большого объема > 100 000 записей. Попробовали выгружать справочник в таблицу значений (на 20 000 записей)и в ней производить поиск.Очень долго работает запрос к справочнику. Наверняка мы ошибаемся в принципе. Подскажите, как можно выходить из таких ситуаций.
 
 
   Известный
1 - 14.07.00 - 00:00
Поподробнее, а то наговорить можно много.
Запросом ты ничего не ускоришь. Попробуй установить призна "сортировка" для тех полей по которым собираешься искать. Если поиск в форме справочника, то убери из формы дерево.
   Ruslik
2 - 14.07.00 - 00:03
Попробую поподробнее. Необходимо произвести отбор из справочника по подстроке с возможностью открытия полученной выборки для подбора. По полю установлена сортировка. Можно ли результаты отбора отобразить вместо всего справочника? Я весь справочник выгружаю в таблицу значений(запросом), в ней произвожу поиск, результат поиска отображаю в элементе диалога "Таблица значений". Со скоростью поиска еще можно смириться, но выгрузка справочника в таблицу значений производиться очень долго. Подскажите бестолковым как правильно сделать.
   Миха
3 - 14.07.00 - 08:05
А ты:
1 результат вываливай не в таблицу значений, а в список значений,
2 формируй список не после, а во время отбора.
3 открывай форму списка справочника с "ИспользоватьСписокЭлементов(_ТвойСписок_)".
Удачи!
   Ruslik
4 - 14.07.00 - 09:06
Миха, скажи, как формировать список во время отбора. Я отбор формирую запросом. Все это - обработка, вызываемая для подбора
Процедура ПриОткрытии()
   ТекстЗапроса = 	"//{{ЗАПРОС(ПоискШифра)
		|Элемент = Справочник.Товары.ТекущийЭлемент;
		|Код = Справочник.Товары.Код;
		|Наименование = Справочник.Товары.Наименование;
		|Шифр = Справочник.Товары.Шифр;
		|Группировка Элемент Без Упорядочивания Без Групп;
		|Без итогов;
		|//}}ЗАПРОС;
	Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
		Возврат;
	КонецЕсли;
	Элементы=СоздатьОбъект("ТаблицаЗначений");
	Запрос.Выгрузить(Элементы,1);
	НайденныеШифры.НоваяКолонка("Элемент","Справочник");
	НайденныеШифры.НоваяКолонка("Код","Число",,,,5);
	НайденныеШифры.НоваяКолонка("Шифр","Строка",,,,30);
	НайденныеШифры.НоваяКолонка("Наименование","Строка",,,,30);
	 НайденныеШифры.ВидимостьКолонки("Элемент",0);
КонецПроцедуры//*******************************************
Процедура Сформировать()
	НайденныеШифры.УдалитьСтроки();
	Длина = СтрДлина(ЧастьШифра);
	Элементы.ВыбратьСтроки();
	Пока Элементы.ПолучитьСтроку() = 1 Цикл
		Если Найти(ВРег(Элементы.Шифр),ВРег(ЧастьШифра))>0 Тогда//	или	Если ВРег(Сред(Элементы.Шифр,1,Длина))=ВРег(ЧастьШифра) Тогда
			НайденныеШифры.НоваяСтрока();
			НайденныеШифры.Элемент=Элементы.Элемент;
			НайденныеШифры.Код=Элементы.Код;
			НайденныеШифры.Наименование=Элементы.Наименование;
			НайденныеШифры.Шифр=Элементы.Шифр;
		КонецЕсли;
	КонецЦикла;
	Состояние("Обработано "+Инд);
КонецПроцедуры//--------------------------------------------------------------------------
Процедура ВыборСтроки()
	Если НайденныеШифры.ТекущаяСтрока()>0 Тогда
		Форма.ВыполнитьВыбор(НайденныеШифры.Элемент);
	КонецЕсли;
КонецПроцедуры
   Неизвестный
5 - 14.07.00 - 13:59
Мы такое делали. За счет дополнительного изврата с постоянным списком элементов справочника в памяти компьютера. База долго загружается (200000 записей - порядка 10 мин). Поиск оптимизирован до 3-5 секунд.
   Ruslik
6 - 14.07.00 - 22:34
Неизвестный, скажите, пожайлуста, справочник выгружался в память компьютера один раз при запуске или чаще? Если один раз, то как получали "свежую" информацию при изменении справочника?
   Известный
7 - 14.07.00 - 22:58
Попробуй так.........................
//_________________________________________________________
Процедура ФильтрПоНужнымШифрам(ЧастьШифра)
	СписокНайденых=СоздатьОбъект("СписокЗначений");
	Спр=СоздатьОбъект("Справочник.Товары");
	Спр.ПорядокРеквизита("Шифр");
	Спр.ВыбратьЭлементы();
	Пока Спр.ПолучитьЭлемент()>0 Цикл
		Если Найти(ВРег(Спр.Шифр),ВРег(ЧастьШифра))>0 Тогда
		    СписокНайденых.ДобавитьЗначение(Спр.ТекущийЭлемент());
		КонецЕсли;
	КонецЦикла;
	Спр.ИспользоватьСписокЭлементов(СписокНайденых);
	Спр.Выбрать("Выберите нужный Вам товар");
КонецПроцедуры //
   Известный
8 - 14.07.00 - 23:00
А нахрена я использовал ПорядокРеквизита ? Не знаю. Лишнее это
   Ruslik
9 - 15.07.00 - 00:09
Известный! В чем может быть проблема? При использовании твоего решения - выдается сообщение об ошибке
Спр.ИспользоватьСписокЭлементов(СписокНайденых);
{Справочник.Товары.ФормаСписка.ФормаСписка.Модуль(160)}: Поле агрегатного объекта не обнаружено (ИспользоватьСписокЭлементов).
Попробовала отобразить список найденных как визуальный объек - заполняется, но сообщение об ошибке то же.
Процедура ФильтрПоНужнымШифрам(ЧастьШифра)
	СписокНайденых=СоздатьОбъект("СписокЗначений");
	Спр=СоздатьОбъект("Справочник.Товары");
	Спр.ПорядокРеквизита("Шифр");
	Спр.ВыбратьЭлементы();
	Пока Спр.ПолучитьЭлемент()>0 Цикл
		Если Найти(ВРег(Спр.Шифр),ВРег(ЧастьШифра))>0 Тогда
			СписокНайденых.ДобавитьЗначение(Спр.ТекущийЭлемент());
		КонецЕсли;
	КонецЦикла;
	Спр.ИспользоватьСписокЭлементов(СписокНайденых);
	Спр.Выбрать("Выберите нужный Вам товар");
КонецПроцедуры //
   Известный
10 - 15.07.00 - 01:07
Так точно работает.//_______________________________________________
Процедура Сформировать()
	СписокНайденых=СоздатьОбъект("СписокЗначений");
	Спр=СоздатьОбъект("Справочник.Номенклатура");
	Спр.ВыбратьЭлементы();
	Пока Спр.ПолучитьЭлемент()>0 Цикл
		Если Найти(ВРег(Спр.Наименование),ВРег(СокрЛП(ЧастьШифра)))>0 Тогда
			СписокНайденых.ДобавитьЗначение(Спр.ТекущийЭлемент());
		КонецЕсли;
	КонецЦикла;
	Конт="";
	ОткрытьФорму("Справочник.Номенклатура",Конт);
	Конт.ИерархическийСписок(0);
	Конт.ИспользоватьСписокЭлементов(СписокНайденых);
КонецПроцедуры ////___________________________________
Предыдущий вариант я не проверял.
Этот проверил. Рекомендую в открывшейся форме поиграться с переключением иерархичности списка. Такие картинки!!!!!! То все пропадет, то видно только те группы, которые попали под условие отбора. Иконки ранее мной невиданные. Жуть одним словом.
 
  Рекламное место пустует
   Ruslik
11 - 16.07.00 - 21:54
Огромное спасибо всем.
Известный! Попробовали - работает. С иерархией еще не работали. Спасибо.
   Неизвестный
12 - 16.07.00 - 22:25
Я пользовал ОткрытьФорму, а тебе по всей видимости нужно ОткрытьПодбор
   Dmitry
13 - 17.07.00 - 08:09
Может быть поздно, но я как то на Бугре видел полнотекстовый поиск через ADO, я им пользуюсь, очень даже удобно, а самое главное быстрее, т.к. ищет от прямо по базе.
   Rom
14 - 17.07.00 - 13:43
Мы решили эту проблему по другому...
(К стати о проблеме ... Справочник контрагентов большой. Но не в этом дело, дело в том, что наименования в них частенько полностью совпадают.(Например "Колхоз Родина", и адрес у них тоже практически одинаковый) Воооот..... С этим справочником работает большое количество сотрудников, которые в праве добавить и изменить этих контров. В результате могут быть внесены и несколько одинаковых элементов справочника, но с разными наименованиями. (Не там сократили слово ну и т.п.))
(Т.е. проблема сводится к точной идентификации контрагента)
(конечно может не рационально, но отбор по критерию практически мгновенный)
Идея:
Есть дополнительный справочник без наименования и длиной кода 1 (без контроля уникальности).
В нем два реквизита строка длина 5, и ссылка на элемент для поиска (с сортировкой и отбором).
Далее в строке хранится начальная часть слова до 5-ти символов и ссылка на сам элемент справочника контрагентов
(Т.е. если наименование элемента контрагентов: "Министерство по культуре и спорту", то в дополнительном справочнике появятся элементы:
м
ми
мин
мини
минис
п
по
к
ку
кул
куль
культ
и
с
сп
спо
спор
спорт
со ссылкой на конкретного контрагента. Далее все просто:
Делаем отбор по реквизиту (конкретная строка) и получаем выборку с сылками на элементы в которых эта строка встречается.
Дополнительно пришлось сделать обработку элемента контрагента при смене его наименования. Что бы справочник ссылок находился в актуальном состоянии.
Ну вот кажется все...
Да, вопросец Дмитрию (13) где имненно ты видел поиск...
Если не трудно ссылку кинь...
   А.Любимов
15 - 17.07.00 - 14:49
Более продвинутый способ - использовать SQL-запрос напрямую к базе. Рарус выпускает компоненту, которая это позволяет. Затем из SQL-выборки получаются внутренние коды полученных элементов справочника,далее преобразуемые в коды 1С:Предприятия или прямо в объекты типа "Справочник".
   Ruslik
16 - 21.07.00 - 00:09
Дмитрию (13)Скинь, пожайлуста, ссылку по поиску.



Список тем форума

Форум Территория 1С

Рекламное место пустует   Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует