Имеем конфигурацию Розница 1.0 с довольно существенной базой клиентов (порядка 200к), при обмене из другой ИС следует проверять наличие клиента в базе по номеру телефона. Телефоны в базу Розницы вбиты как бог на душу положил, где-то с дефисом, где-то со скобками, где-то с "+" перед номером. Единого стандарта ввода номера нет. Соответственно при выгрузке из другой ИС один номер телефона может проверяться несколько минут (выгружаю запросом все существующие номера, в цикле через стрЗаменить() убираю все лишние символы кроме цифр и беру правые 10 значащих цифр, в данной ТЗ произвожу поиск).
Следовательно вопрос, можно ли как-то прямо в запросе оптимизировать строки с телефонами (убрать "(",")","+","-"), может кто-то сталкивался с подобной задачей?
(1) Lo1jke, в похожей задаче (очистка артикулов от мусора) мы использовали подход, описанный в Агрегатное суммирование строк в запросе – сложно, но не невозможно. Для этого номер телефона разбивается на отдельные символы, цифры отфильтровываются и группируются в "чистые строки".
У вас задача еще проще - нужно отделить только цифры, тогда их можно не конкатенировать, а объединять в числа, в качестве веса используя число цифр справа. Что-то типа Выразить строку как число и строку как дату в запросе.
В общем, не очень сложно, если захотеть чисто запросом сделать.
Вобщем делал отдельное поле, перезаполнял его только цифрами один раз обработкой, если длина поля меньше 10 цифр(пользователи могли вбить городской номер), добавлял код города, в запросе индексировал.
ВЫБОР КОГДА ПОДСТРОКА(Поле, 1, 1) ПОДОБНО ““%[0-9]%“” ТОГДА
ПОДСТРОКА(Поле, 1, 1)
ИНАЧЕ """"
КОНЕЦ
+
ВЫБОР КОГДА ПОДСТРОКА(Поле, 2, 1) ПОДОБНО ““%[0-9]%“” ТОГДА
ПОДСТРОКА(Поле, 2, 1)
ИНАЧЕ """"
КОНЕЦ
+
...
+
ВЫБОР КОГДА ПОДСТРОКА(Поле, 100, 1) ПОДОБНО ““%[0-9]%“” ТОГДА
ПОДСТРОКА(Поле, 100, 1)
ИНАЧЕ """"
КОНЕЦ
Показать
ЗЫ: В СКД есть возможность вызова функции из общих модулей
К сожалению база на аутсорсе и что-то изменять не представляется возможным. Грубо говоря справочник "ридонли". (5) Попробую что-то подобное реализовать, только однозначно неизвестно сколько символов в строке телефонного номера.
А если решить проблему путем приведения номеров в самой базе к единому стандарту? Да, займет время, но можно сделать это поэтапно, запуская обработку на выходные, например.
И обязательно добавить проверку на последующий "правильный" ввод номера для сотрудников.
указку сразу надо было брать и инструкцию по вводу и шаблон
а так. да. постепенно обработкой привести в порядок.
хотя и алгоритмы и запросы, конечно же, можно придумать
Коллеги, вопрос немного в сторону, решил оптимизировать загрузку цен единожды, но для этого мне необходимо передавать какие-то данные по контрагентам всей выгрузки в ПослеЗагрузкиДанных. Как логичнее это сделать? Один раз я видел реализацию через запись в константу (тип: ХранилищеЗначений) ТаблицыЗначений и соответствующий перебор данных уже после выгрузки. Подумываю реализовать регистр сведений.
Если ридонли только справочник, но в целом в конфигурацию вносить изменения можно, то:
1) сделать регистр сведений, измерения: контрагент; ресурс: телефон (приведенный номер, одни цифры), индексировать=да.
2) сделать подписку "При записи" справочника контрагентов. Записывать регистр сведений.
3) сделать первоначальное заполнение регистра обработкой.
Искать телефон по этому регистру.