Быстрый поиск телефонов

02.09.12

Разработка - Работа с интерфейсом

Как двадцати операторам, не подвешивая друг друга, быстро находить телефонный номер по первым продиктованным цифрам, когда база номеров - от 50 тыс...

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Пример с 50 тыс. номерами
.zip 2,04Mb
33
33 Скачать (1 SM) Купить за 1 850 руб.

Потратил час на спор с клиентом, что 1С работает медленнее, чем его база на Oracle, поэтому, обеспечить одновременную, безглючную работу нескольких операторов, чтобы они, вводя номер телефона, по первым цифрам получали в выпадающем списке подходящие номера, нельзя... Все бы ничего, но

1. номеров может быть много... десятки тысяч... сеть пиццерий в Санкт-Петербурге, как ни как

2. мое неумение решить эту проблему грозило срывом хорошего договора

В конечном итоге, убедили клиента, что, хотя это и сложно, но проблему решим. Договор заключили. А вечером действительно решили вопрос :)

Всего-то нужно было - посмотреть на вопрос не глазами клиента а нашими, т.е., программистов. Чем грузится база? Запросами к ней и блокировками таблиц. Значит, нужно большую часть работы повесить не на сервер, а на клиентское приложение! 

И так, простой метод:

1. по первой цифре отбираем в запросе нужные нам номера

2. все последующие цифры - это запрос не к базе, а к списку уже отобранных нами номеров

Осталось немного "косметики". Проблема: пока вводятся цифры в поле ввода, никакая обработка ожидания не срабатывает. Как быть? Тот франч, что был до нас и потерял этот заказ, не предложил решения.  

Но нечего баловать операторов полями ввода и выпадающими списками, дадим им нечто лучшее, отдельную форму ввода. Мотивация - теперь появилась возможность работать с сенсорными экранами...

- У Вас нет сенсорных экранов? Но ведь будут однажды!

- Да, конечно когда-нибудь будут...

Как я люблю это наше "надо прозапас"! И приятно, что наша небольшая супер команда оказалась хитрее крупного франча с филиалами во многих городах... :)

В общем, просто делюсь хорошим настроением и небольшой фичей, которую, если у кого похожая задача возникнет, не придется делать самому. В прилагаемой базе сгенерировано 50 тыс. номеров. Проверьте скорость работы. Можно и в сети.

"Ну а как быть, если номеров несколько миллионов?" - спросит кто-то

Не страшно! (Наверное)

Вариантов вижу 2, по крайней мере.

1. Использовать дополнительные поля в справочнике телефонов для отбора с включенной сортировкой. В частности: "Первый символ", "Два первых символа", "Три первых символа". Наверное, стоит все-таки обращаться к базе, пока длина введенной части не более 3-х символов, а вот потом уже работать со сформированным списком. Но по поводу этого готов услышать "за" и "против"

2. Использовать локальную базу номеров, выгруженную в виде того же dbf, и обращаться к ней на клиентской машине. При этом, dbf-ок можно иметь несколько. Опять же, по первому (двум) символу в номере.

См. также

Работа с интерфейсом Системный администратор Программист Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    55626    17    23    

43

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Платные (руб)

Универсальный редактор картинок 1С предназначен для обработки изображений в режиме «Предприятие», с возможностью рисовать на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    63944    45    60    

83

Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

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

2400 руб.

29.06.2020    19937    28    6    

44

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    17086    YA_418728146    8    

170

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    4441    75    progmaster    11    

4

Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    7981    kalyaka    6    

33

WEB-интеграция Работа с интерфейсом Пользователь Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для конфигурации 1С:Розница 2.3.

3600 руб.

29.04.2022    14417    2    10    

13

Работа с интерфейсом Платформа 1С v8.3 Платные (руб)

Подсистема условного оформления элементов форм (далее подсистема) предназначена для настройки оформления элементов форм (видимость, доступность, цвет фона, цвет текста и прочее) в пользовательском режиме 1С. Также подсистему возможно использовать для ограничения доступа к реквизитам формы для определенных пользователей (или групп пользователей).

6000 руб.

18.01.2022    10303    1    2    

6
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Magister 134 03.09.12 00:22 Сейчас в теме
Плюс за оригинальное решение проблемы поля ввода :)

Собственно по алгоритму поиска - мне кажется, не стоит искать сразу после первой цифры. Вероятность, что при этом будет найден именно нужный телефон ничтожна, а нагрузку на базу это создаст немаленькую.
Разве что это требование заказчика.
Но и тогда лучше сделать типа ВЫБРАТЬ ПЕРВЫЕ 100.
2. Angeros 03.09.12 05:04 Сейчас в теме
Думаю что поле ввода можно было реализовать с клавиатуры... отдельно ввод, отдельно форма с вариантами... Ну и да я согласен с (1)номеров менее 4ех чисел ну хотя-бы 3ех... можно сделать.
3. khaoos 239 03.09.12 05:17 Сейчас в теме
А что не так с полем ввода? При наборе символов в поле ввода при малейшей задержке возникает событие "Автоподбор текста". Еще бы посоветовал навесить индекс на поле "номер телефона" в БД. Правда, в вашем решении он бесполезен, так как по одной цифре БД его точно не будет использовать.
5. O-Planet 6453 03.09.12 05:45 Сейчас в теме
(3) Ну, при использовании этого метода, конечно, будет все сложнее, но не намного. По крайней мере, нужно сравнивать ту строку, что сейчас в поле ввода с той, что в последний раз была отработана. Т.е., пара лишних переменных...
4. mr zafod 23 03.09.12 05:43 Сейчас в теме
Тоже не вижу проблемы - есть автоподбор текста, есть менеджер временных таблиц для запросов, есть индексирование. Подобную задачу помню решал еще на 8.1 лет 5 назад и база номеров тоже была огромной (около 100 000) - все решилось за 3-4 часа без взрыва мозга. А там помимо выборки стояла еще и реальная проблема - формат номеров, коих было великое множество.
Вы извините, но когда я вижу подобные "проблемы" - я начинаю понимать, почему у заказчиков такое предвзятое отношение к 1С, франчам и большинству специалистов 1С.
6. O-Planet 6453 03.09.12 06:03 Сейчас в теме
(4) А что там 3-4 часа было делать?

Проблемы, на самом деле, есть.

Вот вопросы, которые я задаю себе, думая об этой задаче, и которые, я уверен, задаст заказчик впоследствии:

1. Номера бывают городские и мобильные, как сократить ввод мобильного номера? Цифра "8", по сути, загонит все мобильные в мой список.
2. И опять же, номер оператор... 8987 - это МТС у нас в городе. Несколько сот тысяч абонентов подключено на номер, начинающийся с этих цифр. Тут я соглашаюсь с (1): нужно подумать, как это оптимизировать.
3. А что если номеров будет не 50, а 500 тыс? И заказчик уже на это намекал. Реально ведь, чтобы 500 тыс. питерцев заказали пиццу!

Т.е., решение задачи требует оптимизации. И тут без выноса мозга, похоже, не обойтись.

На самом деле, заказчик сформулировал задачу достаточно однозначно: общая база 1С (не управляемые формы), эмуляция локальной сети через интернет подключение, несколько десятков операторов. Телефонных номеров - много (весь С-П). Нужно чтобы все операторы могли работать одновременно, без каких-либо тормозов.
7. khaoos 239 03.09.12 06:44 Сейчас в теме
(6) можно посоветовать префиксные цифры для сотовых хранить в отдельном столбце. Там где делаю заказы обычно, "8"-ку для сотовых номеров не нужно указывать: логичная оптимизация :). При показе пользователю "склеивать" префикс и его номер. При поиске же префикс может послужить дополнительным фильтром для найденных номеров: но поиск по нему бы не запускался. Но если в базе уже много номеров, может быть рутинным решение выглядеть по внедрению этой оптимизации :)
8. mr zafod 23 03.09.12 06:59 Сейчас в теме
(6)О какой оптимизации идет речь? Пара лишних переменных в случае такой "тяжелой" задачи - думаю не проблема. Оптимизация здесь может быть только в том, чтобы:
1) все номера хранить и вводить без восьмерки
2) добавить измерения с индексацией по первым 3 и 3-6 символам номера
Для выборки использовать автоподбор по первым 3, далее 6 символам (благо количество введенных символов можно узнать без проблем) использую запрос с ВТ и индексами (и менеджером, чтобы по 100 раз в базу не лазить).
Все!!! Какая еще здесь может быть оптимизация? Есть желание - навешайте триггеров в postgre (oracle), потрясите планы запросов (хотя тут запрос линейный). Мы всегда ограничены платформой - не стоит об этом забывать!
AlX0id; khaoos; +2 Ответить
9. cdb 26 03.09.12 17:31 Сейчас в теме
Проблема: пока вводятся цифры в поле ввода, никакая обработка ожидания не срабатывает.
Для того что бы система дала обработать изменение после ввода любово символа (1-го, 2-го и т.д.) можно использовать элемент ActiveX к примеру MS Forms 2.0 TexBox. При каждом вводе символа будет отрабатывать событие ПриИзменении().
10. kuzev 48 04.09.12 15:40 Сейчас в теме
При наборе цифр сколько номеров телефонов должно быть в отобранном списке? Разумное значение какое?
Мне кажется нет смысла "отображать" более нескольких десятков номеров. В этом случае можно завести отдельную таблицу (регистр) со значениями первых уникальных n-цифр (где n>3...5) номеров при условии, что таких номеров больше некого порога (например, 100). Сначала поиск осуществлять по ней, а как только значений не будет найдено можно лезть в общую таблицу, где записей с первыми n-цифр будет меньше порога.
11. kilokilo 18 05.09.12 12:00 Сейчас в теме
Телефоны - в текстовый файл. Регулярные выражения. Отработает за < 1 сек.
Но оперативной памяти на локальной машине должно быть достаточно - весь текст в памяти.
У меня 1С сыпалась при 2 000 000 строк на 2Гб оперативки на 32бит WinXP

Если на БД - то вынести телефоны на SQL базу, работающую в ОЗУ.. MySQL, например. И организовать доступ к данным через web-сервис к этой базе из 1С. И, опять же, в запросе использовать регулярные выражения, что позволит искать данные в любой части номера..

Если делать на 1С - можно попробовать иерархический справочник (иерархия элементов), 3 уровня.
1й уровень - код страны, 2й - код города/оператора, 3й - телефон..
Выборка на одно уровне иерархии происходит быстрее.

В крайнем случае - создать у регистра, где хранят номера, индексированное поле, куда писать нормализованные номера - только циферки, без лишних пробелов, черточек, тире.. И запрос с инструкцией ПОДОБНО:
ВЫбРАТЬ Номер Из Регистр ГДЕ Номер ПОДОБНО %ном% ИЛИ Номер ПОДОБНО %ном ИЛИ Номер ПОДОБНО ном%"
Diversus; +1 Ответить
12. Evil Beaver 8266 01.11.12 16:36 Сейчас в теме
И что, если просто проиндексировать поле Телефон и включить управляемые блокировки, то работает медленно? Там второй Пентиум на сервере?
13. zveruga56 153 07.11.12 11:12 Сейчас в теме
Неплохо бы предусмотреть поиск по подстроке.
Набрал, к примеру, 888, а в списке:

+79128882931
+79878470888

Для этого надо создать несколько индексных таблиц для отбора номеров по подстроке из 3,4,5 символов.
При добавлении номера в базу - прописывать его и в индексные таблицы, со всеми возможными подстроками поиска.

P.S. Пора уже с call-центром соединять.. ;-)
Оставьте свое сообщение