Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как осуществить поиск телефона по нескольким цифрам в 1С 7.70.003 торговля склад для Украины?
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
ZUBR
Здравствуйте. Можно ли осуществить поиск телефона, или серийного номера, или иного строкового реквизита по его части? То есть, например, ищешь телефолн и вводишь 4 последние цифры, и поиск выдает все номера телефонов, в которых эта комбинация цифр встречается? Потому что сейчас он ищет только по полному номеру.
Если ввести часть номера, ничего не находит.
Спасибо!
andrew76
Добрый вечер !

Используйте в цикле перебора элементов функцию Прав().

Прав(<?>,)
Синтаксис:
Прав(<Строка>,<Число>)
Назначение:
Возвращает cтроку, содержащую последние (самые правые) символы текстовой строки.
Параметры:
<Строка> - строка, содержащая извлекаемые символы;
<Число> - количество символов, которое должна вернуть функция.

Пока Контрагенты.ПолучитьЭлемент()=1 Цикл

Если Прав(СокрЛП(Контрагенты),4)=НужнаяЧастьНомера тогда  
       Сообщить(Контрагенты.Наименование);
КонецЕсли;

КонецЦикла;
mut
Ну или функцией Найти() если нужно по любой части строки

Если Найти(Клиент.Телефон, Цифры) > 0 Тогда
...
ZUBR
mut @ 18.12.19, 17:47 необходимо зарегистрироваться для просмотра ссылки ,
Не получается по любой части строки по любому количеству цифр. Ищет только по полному номеру.
Расх.ВыбратьДокументы(НачДата,КонДата);
            Пока Расх.ПолучитьДокумент()=1 Цикл
                Если (Найти(Расх.Телефон,Телефон)=1)и(Расх.СтатусЗаказа <> Перечисление.Статусы.Акс)  Тогда  
                    ТЗ.НоваяСтрока();
                    ТЗ.Модель = Расх.Модель;
      ............................................................................................................................


Реквизит Расх. Телефон имеет тип строка 48 символов в расходной накладной.
Реквизит Телефон имеет такой же тип. Это реквизит поле ввода в диалоге созданного отчета Поиск.
Мне нужно, чтобы осуществлялся поиск любой комбинации любого количества цифр и при нахождении выдавалась, как положено, единица.
Например, вводится в поле ввода 067. И находятся все документы с номерами телефона, где встречается 067 в любом месте номера. Можно ли такое сделать? Спасибо!
andrew76
ZUBR @ Сегодня, 14:09 необходимо зарегистрироваться для просмотра ссылки ,

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

Телефон=СокрЛП(Телефон);  //убирает лишние пробелы справа и слева
Расх.ВыбратьДокументы(НачДата,КонДата);
            Пока Расх.ПолучитьДокумент()=1 Цикл
                Если (Найти(Расх.Телефон,Телефон)=1)и(Расх.СтатусЗаказа <> Перечисление.Статусы.Акс)  Тогда  
                    ТЗ.НоваяСтрока();
                    ТЗ.Модель = Расх.Модель;
mut
ZUBR @ Сегодня, 11:09 необходимо зарегистрироваться для просмотра ссылки ,
Невнимательно смотрели пример
Не «равно единице», а «больше нуля»
mut
Цитата(ZUBR @ 21.12.19, 11:09) необходимо зарегистрироваться для просмотра ссылки
Реквизит Расх. Телефон имеет тип строка 48 символов в расходной накладной.
Реквизит Телефон имеет такой же тип. Это реквизит поле ввода в диалоге созданного отчета Поиск.


У строковых реквизитов перед поиском нужно обрезать пробелы.

Если (Найти(Расх.Телефон,СокрЛП(Телефон))>0) и (Расх.СтатусЗаказа <> Перечисление.Статусы.Акс) Тогда
andrew76
Цитата(mut @ 22.12.19, 15:47) необходимо зарегистрироваться для просмотра ссылки
Если (Найти(Расх.Телефон,СокрЛП(Телефон))>0)


Лучше избавиться от пробелов до начала работы цикла и выполнения условия.
А то получится выражение каждый раз при прогоне цикла будет вычисляться снова-
если в базе 1000 контрагентов,то 1000 раз будут убираться пробелы из переменной Телефон.
mut
andrew76 @ Сегодня, 12:30 необходимо зарегистрироваться для просмотра ссылки ,
Ну тогда уж ни в коем случае не таким способом:

Телефон = СокрЛП(Телефон);


Если Телефон - реквизит формы, никакого удаления не произойдет. Нужна новая переменная.
andrew76
mut @ Сегодня, 18:52 необходимо зарегистрироваться для просмотра ссылки ,

Ладненько,уговорили: 32000000.gif

Телефон_=СокрЛП(Телефон);  //убирает лишние пробелы справа и слева
Расх.ВыбратьДокументы(НачДата,КонДата);
            Пока Расх.ПолучитьДокумент()=1 Цикл
                Если (Найти(Расх.Телефон,Телефон_)=1)и(Расх.СтатусЗаказа <> Перечисление.Статусы.Акс)  Тогда  
                    ТЗ.НоваяСтрока();
                    ТЗ.Модель = Расх.Модель;

ZUBR
mut @ 21.12.19, 19:41 необходимо зарегистрироваться для просмотра ссылки ,
А почему больше нуля? Как я понимаю, при нахождении функция поиск дает единицу, а при ненахождении - нуль.
Я из тех, кто хочет понимать все, что делает)). Спасибо!))

Господа, спасибо большое за много ответов. Всех вас уважаю. Если сделаю, отпишусь. icon_beer17.gif
andrew76
ZUBR @ Сегодня, 17:48 необходимо зарегистрироваться для просмотра ссылки ,

Найти(<?>,)
Синтаксис:
Найти(<Строка1>,<Строка2>)
Назначение:
Возвращает позицию первого вхождения в строку поиска заданной подстроки.
Параметры:
<Строка1> - строка в которой ищем (место поиска);
<Строка2> - строка которую ищем (шаблон поиска).
Замечание:
Если не находит - возвращает число 0.
Первая позиция имеет индекс 1.

Телефон_=СокрЛП(Телефон);  //убирает лишние пробелы справа и слева
Расх.ВыбратьДокументы(НачДата,КонДата);
            Пока Расх.ПолучитьДокумент()=1 Цикл
                Если (Найти(Расх.Телефон,Телефон_)>0)и(Расх.СтатусЗаказа <> Перечисление.Статусы.Акс)  Тогда  
                    ТЗ.НоваяСтрока();
                    ТЗ.Модель = Расх.Модель;
ZUBR
Спасибо, все получилось. Интересно, что без СокрЛП не работает. Хоть пробелов и нет.
andrew76
ZUBR @ Сегодня, 13:29 необходимо зарегистрироваться для просмотра ссылки ,

Надо в отладчике посмотреть,может и есть.Или пробелы начинают участвовать в поиске номера телефона.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.