Black Friday: Cashback 35% при покупке 1С лицензий на счет INFOSTART.RU

Быстрый поиск средствами библиотеки ToySQL

Публикация № 20372

Администрирование - Производительность и оптимизация (HighLoad)

9
В заметке приведен текст процедуры, с помощью которой можно реализовать быстрый поиск в SQL базе с помощью библиотеки ToySQL.

В ходе работы над конфигурацией заказчика столкнулись с проблемой медленного поиска в больших справочниках. Число элементов в справочниках в данный момент зашкаливает за 300 тысяч. Поиск стандартными средствами по первым буквам занимает до 10 секунд. Поиск подстроки вообще очень долго. В общем-то типовая задача для тех, кто занимается разработкой на 7-ке в SQL. И в общем-то эта задача уже решалась не раз - с помощью 1С++ или с помощью других средств. В каком-то смысле это изобретение велосипеда. В основном заметка полезна пользователям библиотеки ToySQL (хотя и на 1С++ это легко переносится). Особенность работы процедуры - поиск по подстроке в реквизитах наименование, код, а также в реквизитах с сортировкой. Есть возможность поиска по агрегатным реквизитам (поиск через точку). Результаты поиска отображаются в форме списка с помощью установки фильтра по найденным элментам, тем самым можно произвести выбор из этого списка без дополнительных выкрутасов. Встроить в модуль формы списка достаточно просто - добавляем на форму кнопку поиска с вызовом:

глБыстрыйПоиск(Контекст,Синонимы,,ДопРеквизиты)

Текст основной и вспомогательных процедур:

Функция ПолучитьСиноним(Синоним,Синонимы)

    Если Синонимы = 0 Тогда

        Возврат Синоним;

    Иначе

        Стр = Синонимы.Получить(Синоним);

        Если ПустаяСтрока(Стр) = 1 Тогда

            Возврат Синоним;

        Иначе

            Возврат Стр;

        КонецЕсли;

    КонецЕсли;

КонецФункции


Функция ИсключитьИзСписка(Рекв,Список)

    Если Список = 0 Тогда

        Возврат 0;

    Иначе

        Если Список.НайтиЗначение(Рекв) > 0 Тогда

            Возврат 1;

        КонецЕсли;

    КонецЕсли;

    Возврат 0;

КонецФункции


Процедура глБыстрыйПоиск(Конт,Синонимы=0,Исключить=0,ДопРеквизиты=0) Экспорт

    РеквизитыПоиска = СоздатьОбъект("СписокЗначений");

    Вид = Конт.Вид();

    Мета = Метаданные.Справочник(Вид);

    Если Мета.ДлинаНаименования > 0 Тогда

        Если ИсключитьИзСписка("Наименование",Исключить) = 0 Тогда

            РеквизитыПоиска.ДобавитьЗначение("Наименование",ПолучитьСиноним("Наименование",Синонимы));

        КонецЕсли;

    КонецЕсли;

    Если (Мета.ДлинаКода > 0) И (Мета.ТипКода = "Текстовый") Тогда

        Если ИсключитьИзСписка("Код",Исключить) = 0 Тогда

            РеквизитыПоиска.ДобавитьЗначение("Код",ПолучитьСиноним("Код",Синонимы));

        КонецЕсли;

    КонецЕсли;

    

    Для н=1 По Мета.Реквизит() Цикл

        Рекв = Мета.Реквизит(н);

        Если Рекв.Сортировка = 1 Тогда

            Если Рекв.Тип = "Строка" Тогда

                Если ИсключитьИзСписка(Рекв.Идентификатор,Исключить) = 0 Тогда

                    РеквизитыПоиска.ДобавитьЗначение(Рекв.Идентификатор,?(ПустоеЗначение(Рекв.Синоним)=1,Рекв.Идентификатор,Рекв.Синоним));

                КонецЕсли;

            КонецЕсли;

        КонецЕсли;

    КонецЦикла;

    

    Если ПустоеЗначение(ДопРеквизиты) = 0 Тогда

        Стр = "";

        Для н=1 По ДопРеквизиты.РазмерСписка() Цикл

            Зн = ДопРеквизиты.ПолучитьЗначение(н,Стр);

            РеквизитыПоиска.ДобавитьЗначение(Зн,Стр);

        КонецЦикла;

    КонецЕсли;

    

    Зн = "";

    Если РеквизитыПоиска.ВыбратьЗначение(Зн,,,,1) = 1 Тогда

        Стр = "";

        Если ВвестиСтроку(Стр,"Введите строку поиска",50) = 1 Тогда

            п = Найти(Зн,".");

            Если п > 0 Тогда

                Рекв = Лев(Зн,п-1);

                МетаРекв = Мета.Реквизит(Рекв);

                Поиск = Рекв+"."+Сред(Зн,п+1);

                

                ТекстЗапроса = "SEL ECT [Спр.Ссылка]

                |FR OM [Справочник."+Вид+"] Спр WITH (NOLOCK)

                |JOIN ["+МетаРекв.Тип+"."+МетаРекв.Вид+"] "+Рекв+" WITH (NOLOCK) ON [Спр."+Рекв+"] = ["+Рекв+".Ссылка]

                |WHERE UPPER(["+Поиск+"]) LIKE '%"+Врег(Стр)+"%'

                |ORDER BY [Спр.Наименование]";

                

            Иначе

                ТекстЗапроса = "SEL ECT [Ссылка] FR OM [Справочник."+Вид+"] WITH (NOLOCK) WHERE UPPER(["+Зн+"]) LIKE '%"+Врег(Стр)+"%'

                |ORDER BY [Наименование]";

            КонецЕсли;

            

            Запрос = СоздатьОбъект("ToyQuery");

            Запрос.Вернуть1С = 1;

            Если Запрос.МетаЗапрос(ТекстЗапроса) = 1 Тогда

                ТЗ = СоздатьОбъект("СписокЗначений");

                Запрос.Выгрузить(ТЗ);

                Если ТЗ.РазмерСписка() > 0 Тогда

                    Конт.ИспользоватьСписокЭлементов(ТЗ);

                Иначе

                    Сообщить("Ничего не найдено");

                    Конт.ИспользоватьСписокЭлементов();

                КонецЕсли;

            Иначе

                Сообщить(Запрос.Ошибка);

            КонецЕсли;

        КонецЕсли;

    КонецЕсли;

КонецПроцедуры


9

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. Noy 1063 11.06.09 13:37 Сейчас в теме
я так понимаю что сама компонента ToySQL платная?
2. toypaul 66 11.06.09 13:46 Сейчас в теме
(1) да. но тоже самое можно и на 1С++ сделать.
Забыл кстати, что поиск по ПОДСТРОКЕ работает 3-4 сек теперь
3. toypaul 66 11.06.09 13:49 Сейчас в теме
(1) сразу говорю когда делал этого http://infostart.ru/projects/4220/ не видел :)
4. Noy 1063 11.06.09 14:01 Сейчас в теме
(3) так там просто строковой поиск, без возможности поиска по агрегатным реквизитам.

(2) Я так понимаю компоненты отличаются только синтаксисом? (в части функционала по прямым запросам)
5. toypaul 66 11.06.09 14:05 Сейчас в теме
(4) не только синтаксисом. возможностями тоже отличаются. ToySQL больше ориентирована на выполнение запросов в SQL базе (больше возможностей). 1С++ позволяет и ДБФ выполнять запросы, плюс всякий доп функционал. Но движок выполнения запросов почти одинаковый. В 1С++ он взят из ToySQL. Хотя из 1С++ потом в ToySQL кое что бралось.
6. Noy 1063 11.06.09 14:14 Сейчас в теме
(5) спасибо за разъяснение.
Твою процедуру попробовать не могу - нет библиотеки, но вот эта строчка чуть-чуть смущает:
|ORDER BY [Спр.Наименование]";
и
|ORDER BY [Наименование]";
а если в справочнике нет Наименования (в смысле длина 0), компонента сама это отслеживает или будет ошибка?
7. toypaul 66 11.06.09 14:30 Сейчас в теме
(6) хм...ошибка будет. надо исправить. но у меня в справочниках везде есть.
10. serpent 50 10.07.09 08:50 Сейчас в теме
(7) подскажите чем заполнить реквизиты "Синонимы,,ДопРеквизиты" ???
11. toypaul 66 10.07.09 11:40 Сейчас в теме
(10) Синонимы это список значение такого плана
Синонимы.Установить("Наименование","№ счета");

ДопРеквизиты это список значений, дополнительных реквизитов, по которым нужно сделать поиск, но на которых нет галки сортировка.
8. ReLock 35 25.06.09 16:50 Сейчас в теме
Оставьте свое сообщение

См. также

Cashback 35% при покупке 1С лицензий на счет INFOSTART.RU с 27.11 по 04.12 Промо

Оформляете заказ на 1С лицензии или конфигурации. Получаете 35% от стоимости на счет в профиле INFOSTART.RU. Выбираете сервисы и продукты на сумму кэшбэка.

С 2020 года сервис «Продление поддержки конфигурации 1С:УПП» подорожает вдвое Промо

Успейте продлить поддержку УПП до повышения цен! Фирма «1С» предупредила об изменении цен на сервис «Продление поддержки конфигурации "1С:Управление производственным предприятием"». С 1 января 2020 года сервис подорожает в два раза.

Не гибкие блокировки в "1С:Предприятие 7.7", но чуть-чуть "Управляемые". 11

Статья Системный администратор Программист Нет файла v77::ОУ v77::БУ v77::Расчет 1cv7.md Россия Windows Бесплатно (free) Производительность и оптимизация (HighLoad)

Обратились ко мне с вопросом по теме форума: http://forum.mista.ru/topic.php?id=558772 Автор темы: "DennizzM". Название: "v7: 1c v7.7 ошибки транзакции - как отловить виновника?" Текст с сокращениями: "Вопрос наверняка не новый... Итак - есть база 1c v7.7 (самописная конфа). Периодически у пользователей возникает ошибка при проведении транзакции. База работает под терминалом. Нагрузка на дисковую подсистему небольшая, CPU на нуле, RAM до черта свободного. Вопрос вот в чем - как отловить инициатора первой транзакции которая всех держит? Итак - как мне выкрутиться? ;) ...я не имею права и не могу лезть внутрь конфы и модифицировать ее.".

13.07.2011    23051    hogik    16       

Перенос данных КА 1.1 => ERP 2 (ЕРП) (обработка переноса документов, остатков и справочной информации из "1С:Комплексная автоматизация, ред. 1.1" в "1С:ERP Управление предприятием, ред 2"). Обновлен до КА 1.1.115.х и ERP 2.4.10.х Промо

Обработка позволяет переносить из КА 1.1 в ERP 2 документы за выбранный период и остатки. Типовая обработка от фирмы 1С документы не переносит. Также исправлены ошибки типовой обработки. При выходе новых релизов обновление высылается бесплатно в течение года. Разработка будет полезна фирмам-франчайзи, которые периодически выполняют такой перенос данных для заказчиков. Вы можете один раз приобрести обработку переноса, и потом бесплатно получать обновления в случае выхода новых релизов конфигураций 1С.

29700 руб.

ПОМОЩНИК ПЕЧАТИ В ЗИК 7.7 8

Статья Системный администратор Программист Нет файла v77::Расчет 1С7:ЗиК Windows Бесплатно (free) Универсальные печатные формы Производительность и оптимизация (HighLoad)

Как оптимально использовать штатные средства системы программ 1С в версии 7.7. Использование помощника печати для настойки общих для всех пользователей отчетов.

24.07.2009    16106    daulberg    4       

Подборка решений для взаимодействия со ФГИС «Меркурий» Промо

С 1 июля 2019 года все компании, участвующие в обороте товаров животного происхождения, должны перейти на электронную ветеринарную сертификацию (ЭВС) через ФГИС «Меркурий». Инфостарт предлагает подборку программ, связанных с этим изменением.

Ускоряем регистрацию объектов в МОД (для SQL) 6

Статья Программист Нет файла v7.7 1cv7.md Россия Windows Бесплатно (free) Производительность и оптимизация (HighLoad)

Менеджер обмена данными - популярный и очень своеобразный продукт В статье рассматривается решение одной из его проблем - получения нового уникального IDD

30.01.2008    11112    Вадимко    16       

Восстановление последовательности + замер производительности + логи ошибок 30

Инструменты и обработки Системный администратор Внешняя обработка (ert,epf) v77::ОУ 1С7:ТиС Windows Бесплатно (free) Сервисные утилиты Обработка документов Производительность и оптимизация (HighLoad)

Восстановление последовательности автоматически, перепроведение документов, а главное - замер времени проведения каждого документа. Плюс дальнейший анализ - по видам документов, по месяцам, по среднему времени, по максимальному.

23.03.2006    11483    449    WWWolfy    13