Имя: Пароль:
1C
1C 7.7
v7: Поиск строки в колонке ТЗ.
,
0 rain65
 
27.07.15
10:17
Есть таблица значений, одна из колонок ее — телефоны .
На форме есть поле ввода.
Задача — поиск телефона по введенному в поле ввода и сортировка .
Делаю так:
НайтиТел — Идентификатор поля ввода.

Если СокрЛП(НайтиТел) =  ""  Тогда
         Табл.Сортировать("АОН");
      стр=0;
      Табл.НайтиЗначение(НайтиТел,стр,"АОН");
      Табл.ТекущаяСтрока(стр);
      КонецЕсли;

Колонка тупо сортируется по телефонам, и не ищет нужный номер.
Где ошибка?
1 DCKiller
 
27.07.15
10:20
Если Табл.НайтиЗначение(НайтиТел,стр,"АОН") = 1 Тогда
    Табл.ТекущаяСтрока(стр);
КонецЕсли;
2 Serginio1
 
27.07.15
10:22
Зачем сортировать?
Используй функцию
Функция глНайтиЗначениеВТз(Тз,Значение,ИмяКолонки) Экспорт
     стр=0;
                      Если Тз.НайтиЗначение(Значение,стр,ИмяКолонки)=1 Тогда
                          Тз.ПолучитьСтрокуПоНомеру(стр);
                          Возврат 1;
                      КонецЕсли;    
                      Возврат 0;    
КонецФункции // глНайтиЗначениеВТз

Если глНайтиЗначениеВТз(Тз,СокрП(стр),"АОН")=1 Тогда

Посмотри длину стр
3 Serginio1
 
27.07.15
10:23
Если глНайтиЗначениеВТз(Тз,СокрП(НайтиТел),"АОН")=1 Тогда
4 HawkEye
 
27.07.15
10:25
(0) в пробелах ))
5 Duke1C
 
27.07.15
10:48
(0) Если колонка "АОН" типизирована (т.е. указан тип "Строка" и длина её), то при поиске по энтой колонке нужно искомое значение привести к типу колонки (типа Формат(НайтиТел,"С20")), иначе кукиш.
6 rain65
 
27.07.15
12:53
(5) Совершенно верно, колонка типизирована. Тип "Строка" длина 15 символов. Да и длина телефонных номеров разная.Пробелов между цифрами нет.
Попробовал вот так:

Если СокрЛП(НайтиТел)=""    Тогда                                    
Формат(НайтиТел,"С15");
    
    Табл.Сортировать("АОН");
      стр=0;
      
      Табл.НайтиЗначение(СокрЛП (НайтиТел),стр,"АОН");
      Табл.ТекущаяСтрока(стр);
      КонецЕсли;

Не ищет
7 Serginio1
 
27.07.15
13:43
(6) Если колонка типизирована ищи без СокрП
8 HawkEye
 
27.07.15
13:51
(6)
наверное все таки:
НайтиТел = Формат(НайтиТел,"С15");


отладчик то что говорит? глазами посмотри что ты ищешь и что у тебя в ТЗ имеется...
9 rain65
 
27.07.15
14:20
Поправил

Если НайтиТел = ""  Тогда                                    

НайтиТел = Формат(НайтиТел,"С15");
    
    Табл.Сортировать("АОН");
      стр=0;
      
      Табл.НайтиЗначение(НайтиТел,стр,"АОН");
      Табл.ТекущаяСтрока(стр);
      КонецЕсли;

Ничего не происходит. Меня честно говоря смущает условие
Если НайтиТел = ""
Я его правильно делаю? Т.е. тел. должен искаться при введении номера в поле ввода.
10 Simod
 
27.07.15
14:27
(9) Держи - "<>"
11 HawkEye
 
27.07.15
14:34
(9) конечно не равно..

Если СокрЛП(НайтиТел) <> "" Тогда

здесь СокрЛП() - надо использовать
12 rain65
 
27.07.15
14:45
(11) Если СокрЛП(НайтиТел) <> ""  Тогда                                    

НайтиТел = Формат(НайтиТел,"С15");
    
    Табл.Сортировать("АОН");
      стр=0;
      
      Табл.НайтиЗначение(НайтиТел,стр,"АОН");
      Табл.ТекущаяСтрока(стр);
      КонецЕсли;

Ничего не происходит
13 Ёпрст
 
27.07.15
15:07
(12) Есть уверенность, что телефоны с пробелами справа, а не слева ?
:)
14 Ёпрст
 
27.07.15
15:09
Ну и писать для реквизита формы
НайтиТел = Формат(НайтиТел,"С15");  - бред сивой кобылы..
15 Ёпрст
 
27.07.15
15:10
реквизит формы и так типизирован и так имеет уже ту длину строки, что в свойствах его и присваивать ему другую "типизированную" строку отличной длины - что мертвому припарки
16 dk
 
27.07.15
15:10
может уже выложишь искомую строку
17 Duke1C
 
27.07.15
15:14
(9) Если НайтиТел это реквизит формы, то установи ему длину такую же как у колонки "АОН" и выкинь нафиг эту строку:
НайтиТел = Формат(НайтиТел,"С15");
18 rain65
 
27.07.15
15:15
(13) Так вроде СокрЛП отсекает пробелы и слева и справа?
19 Ёпрст
 
27.07.15
15:16
(18) для реквизита формы длина будет всегда = длине в свойствах реквизита формы, фирштейн ?
20 rain65
 
27.07.15
15:24
(19) Ну хорошо, в свойствах реквизита формы я тоже поставил длину 15. И СокрЛП убрал.

Если (НайтиТел) <> ""  Тогда                                    

    
    Табл.Сортировать("АОН");
      стр=0;
      
      Табл.НайтиЗначение(НайтиТел,стр,"АОН");
      Табл.ТекущаяСтрока(стр);
      КонецЕсли;

Теперь тоже тупо сортирует без поиска, даже если не вводить телефона, а тупо нажать сформировать.
21 Serginio1
 
27.07.15
15:30
(20) Специально сделал тест

Процедура Сформировать()

    Если глНайтиЗначениеВТз(тз,Номер,"Номер")=1 Тогда
        тз.ТекущаяСтрока(тз.НомерСтроки);
    КонецЕсли;
КонецПроцедуры

//======================================================================
Процедура Добавить(стр)
    Тз.НоваяСтрока();
    Тз.Номер=стр
КонецПроцедуры // Добавить
Тз.НоваяКолонка("Номер","Строка",15);
Добавить("Строка1");
Добавить("Строка2");
Добавить("Строка3");

Все работает
22 Serginio1
 
27.07.15
15:31
Но учти, что поиск идет с учетом регистра
23 Ёпрст
 
27.07.15
15:35
(20) показывай, как создаешь тз и что в неё пишешь
24 rain65
 
27.07.15
15:58
(23) Процедура ПриОткрытии ()
           Табл.НоваяКолонка("ДатаВремя","ДатаВремя",,,"Дата Время",17);
    Табл.НоваяКолонка("Длительность","Число",5);
    Табл.НоваяКолонка("НаправлениеЗвонка","Строка",5);         
    Табл.НоваяКолонка("ЧейЗвонок","Строка",12);
    Табл.НоваяКолонка("Сотрудник","Справочник.Сотрудники",,,"Сотрудник",35);
    Табл.НоваяКолонка("Отдел",,,,"Отдел",20);
    Табл.НоваяКолонка("Должность",,,,"Должность",23);
    Табл.НоваяКолонка("Филиал",,,,"Филиал",10);
    Табл.НоваяКолонка("ВнутрНомер","Строка",,,"Внутр Номер",10);
    Табл.НоваяКолонка("АОН","Строка",15,3,"АОН",15);
    Табл.НоваяКолонка("Клиенты","Справочник.Клиенты",,,"Клиент");
    Табл.НоваяКолонка("Файл",,,,"Файл",7);
    Табл.НоваяКолонка("Отрасль","Отрасль",,,"Отрасль",15);
    Табл.НоваяКолонка("РегИНН",,,,"РегИНН",20);
             абл.НоваяКолонка("Регион","Рег",,,"Регион",21);
КонецПроцедуры

Процедура Сформировать()     
        
    sql = СоздатьОбъект("ODBCDatabase");
    sql.Соединение("Driver={SQL Server};Server=08dbsql;Database=Dragnet_1c;UID=sa;PWD=********");
    rs = СоздатьОбъект("ODBCRecordSet");
    rs.УстБД(sql);
    rs.Отладка(0);                                                                                                
    ТекстЗапроса =  "select
    |Type  as[НаправлениеЗвонка] ,
    |Priznac_call as [ЧейЗвонок],
    |TimeRazgovor as [Длительность],    
    |Id_kl_1c  as [Клиенты $Справочник.Клиенты],
    |Id_agsb_1c  as [Агент $Справочник.Агент_сбыта],
       |Id_sotr_1c  as [Должность $Сотрудник.Должность_Х1],
       |Id_sotr_1c  as [Отдел $Сотрудник.Отдел_Х1],
    |Id_sotr_1c  as [Сотрудник $Справочник.Сотрудники],
    |Region as [Рег],
    |Otrasl as [Отрасль],
    |NumOut as [ВнешнНомер],
    |NumIn as [ВнутрНомер],
    |Files as [Файл],
    |convert(char ,StartTime, 20) as [ДатаВремя]
    |from Dragnet_1c..x_calls_1c                                                            
    |where StartTime between '20080303 09:30:00' and '20080303 19:30:00'";

ИТЗ = СоздатьОбъект("ИндексированнаяТаблица");
    
    ИТЗ = rs.ВыполнитьИнструкцию(ТекстЗапроса,ИТЗ,1);

    ИТЗ.ВыбратьСтроки();      
        

    Пока  ИТЗ.ПолучитьСтроку() = 1 Цикл  
        
        
        Табл.НоваяСтрока();
        Табл.Клиенты=ИТЗ.Клиенты;
        В=ИТЗ.Клиенты;
        Табл.РегИНН=В.ПочтАдр_Город;
        Если ПустоеЗНачение(В.ПочтАдр_Город) = 1 Тогда
        Табл.РегИНН=В.ПочтАдр_Регион;
Табл.Сотрудник=ИТЗ.Сотрудник;        
         С=ИТЗ.Сотрудник;
        Табл.Файл=ИТЗ.Файл;
        Табл.Регион=ИТЗ.Рег;
        Табл.Отрасль=ИТЗ.Отрасль;
    
            
        Табл.АОН= ИТЗ.ВнешнНомер;
          Табл.АОН=СокрЛП(Табл.АОН);
        
        Табл.ВнутрНомер=ИТЗ.ВнутрНомер;
        
        Табл.НаправлениеЗвонка=ИТЗ.НаправлениеЗвонка;    

--------------------------------------------------------------------------------------ну и т. д.
КонецЦикла;

ИТЗ.Загрузить(Табл);
        
    ИТЗ.ДобавитьИндекс("ДатаВремя","*ДатаВремя",0);
    ИТЗ.ДобавитьИндекс("Длительность","*Длительность",0);
    ИТЗ.ДобавитьИндекс("НаправлениеЗвонка","*НаправлениеЗвонка",0);         
    ИТЗ.ДобавитьИндекс("ЧейЗвонок","*ЧейЗвонок",0);
    ИТЗ.ДобавитьИндекс("Сотрудник","*Сотрудник",0);
    ИТЗ.ДобавитьИндекс("Отдел","*Отдел",0);
    ИТЗ.ДобавитьИндекс("Должность","*Должность",0);
    ИТЗ.ДобавитьИндекс("Филиал","*Филиал",0);
    ИТЗ.ДобавитьИндекс("ВнутрНомер","*ВнутрНомер",0);
    ИТЗ.ДобавитьИндекс("АОН","*АОН",0);
    ИТЗ.ДобавитьИндекс("Клиенты","*Клиенты",0);
    ИТЗ.ДобавитьИндекс("Файл","*Файл",0);
    ИТЗ.ДобавитьИндекс("Отрасль","*Отрасль",0);
//    ИТЗ.ДобавитьИндекс("Агент","*Агент",0);
    ИТЗ.ДобавитьИндекс("Регион","*Регион",0);

Процедура Сформировать1();
Если ВыбСотрудник.Выбран() = 1 Тогда      
    Табл.Сортировать("Сотрудник");
        стр = 0;
        Табл.НайтиЗначение(ВыбСотрудник, стр, "Сотрудник");
        Табл.ТекущаяСтрока(стр);
    КонецЕсли;  

Выбор и сортировка работает
Если (НайтиТел) <> ""  Тогда                                    

    Табл.Сортировать("АОН");
      стр=0;
      
      Табл.НайтиЗначение(НайтиТел,стр,"АОН");
      Табл.ТекущаяСтрока(стр);
      КонецЕсли;

Не работает.
25 Ёпрст
 
27.07.15
16:02
На вот, дарю:

//Табл.НоваяКолонка("АОН","Строка",15,3,"АОН",15);
Табл.НоваяКолонка("АОН");
......
   стр=0;
   Табл.НайтиЗначение(СокрЛП(НайтиТел),стр,"АОН");
   Табл.ТекущаяСтрока(стр);
26 Serginio1
 
27.07.15
16:20
Или ищи в индексированой таблице в позиционируйся в тз по найденому индексу в ИТЗ НайтиСтроку. Там кстати можешь индекс сделать без учета регистра
27 rain65
 
27.07.15
16:24
(25) Ну т.е грубо говоря убрали типизацию колонки АОН, а далее

Если НайтиТел <> ""  Тогда                              
    Табл.Сортировать("АОН");
          стр=0;
   Табл.НайтиЗначение(СокрЛП(НайтиТел),стр,"АОН");
   Табл.ТекущаяСтрока(стр);
   КонецЕсли;

Я пробовал уже это делать. Поиска нет, только сортировка.
Уже всю голову сломал.
28 rain65
 
27.07.15
16:26
(26) Спасибо. Буду думать.
29 rain65
 
27.07.15
16:42
Опять повторюсь, что при последнем варианте сортировка происходит даже только при нажатии кнопки сформировать, без введения телефона в поле ввода. Т.е. я делаю вывод, что позиционирование и условие
Если НайтиТел <> ""  Тогда

Не работает
30 Serginio1
 
27.07.15
16:58
(29) Так при строке 15 будет 15 пробелов
Если СокрЛП(НайтиТел) <> ""  Тогда
31 Serginio1
 
27.07.15
17:00
Для проверки
Табл.ПолучитьСтрокуПоНомеру(2);
      стр=0;
Если   Табл.НайтиЗначение(Табл.АОН,стр,"АОН")=1 Тогда

   Табл.ТекущаяСтрока(стр);
КонецЕсли;
32 Serginio1
 
27.07.15
17:01
Табл.ПолучитьСтрокуПоНомеру(2);
НайтиТел=Табл.АОН;
      стр=0;
Если   Табл.НайтиЗначение(НайтиТел,стр,"АОН")=1 Тогда

   Табл.ТекущаяСтрока(стр);
КонецЕсли;
33 palpetrovich
 
27.07.15
17:07
(27) нафейхуа тебе все время сортировать по одной и той-же колонке?
Процедура ЗаполнениеТаблицы()
    // заполняешь как там у тебя
    Табл.Сортировать("АОН");
КонецПроцедуры

Процедура ПоискТелефона()
    Если СокрЛП(НайтиТел) <> ""  Тогда                              
        стр=0;
        Если Табл.НайтиЗначение(НайтиТел,стр,"АОН")=1 Тогда
            Табл.ТекущаяСтрока(стр);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры
34 rain65
 
27.07.15
17:42
(33) Гы))
Прикольно, предварительную сортировку поставил - в глазах зарябило. Во первых таблица заполняется на 5-7 секунд дольше(порядка 5000 строк - общее время заполнение 30-40 секунд), во вторых пользователю нужно будет отворачиваться от экрана, т.к. в глазах рябит от этой сортировки - сортировка видна на форме. Ну и в третьих, не нужно это, т.к. телефонные номера должны вываливаться для пользователя в хронологическом порядке по времени звонка.
Ну и все равно не работает
35 palpetrovich
 
27.07.15
17:45
(34) "Гы"(цы)
по-ходу тут в консерватории что-то менять надо(еще цы)
36 Serginio1
 
27.07.15
17:47
(34) Ты в запросе сразу отсортируй и назови правильно клонки. Используй Загрузить Выгрузить.
А вообще у тебя есть ИТЗ в ней и ищи
37 rain65
 
27.07.15
17:58
(35) Петрович, не обижайся)) Я ж не со зла. Ты же знаешь мой "стаж"))
(36) А что значит правильно назвать колонки?
Придется осваивать ИТЗ. Только примеров в сети практически нет. Я работаю в этой области всего два месяца. До этого программированием не занимался вообще. Так что прошу не судить строго.
38 Serginio1
 
27.07.15
18:16
(37) Для начала проверь 31,32
Колонки в запросе
NumOut as [АОН],

Да уж тяжело тебе придется
39 HawkEye
 
27.07.15
19:35
(37) еще раз говорю, посмотри в отладчике
чему равны
НайтиТел
и
Табл.ПолучитьЗначение(1, АОН")
40 rain65
 
27.07.15
19:48
(39) Еще бы знать как))))
Я знаю как запускать отладчик, как ставить точки останова.
Как идти по этим точкам. Как сделать, чтобы в табло выскакивали значения?
41 HawkEye
 
27.07.15
20:19
(40) в отладчике:
отладка - табло

внизу откроется табло
в нем напиши:
НайтиТел =
Табл.ПолучитьЗначение(1, АОН") =

точку останова поставь на строку:
Если Табл.НайтиЗначение(НайтиТел,стр,"АОН")=1 Тогда
42 rain65
 
27.07.15
20:52
(41) Спасибо. Завтра попробую.
43 rain65
 
28.07.15
09:30
(41) В общем так.
Использую процедуру:
Процедура Сформировать2()
    
    Если НайтиТел <> ""  Тогда                              
        стр=0;
        Если Табл.НайтиЗначение(НайтиТел,стр,"АОН")=1 Тогда
            Табл.ТекущаяСтрока(стр);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Причем если поставить Если СокрЛП (НайтиТел)- ничего не происходит. Если убрать СокрЛП, то в табло появляется сообщение:
НайтиТел =
Табл.ПолучитьЗначение(1, АОН") = = Ошибка в выражении!

(Точка останова там, где ты указал)
44 rain65
 
28.07.15
10:16
(41) Максим, посмотри пож-ста почту.
45 palpetrovich
 
28.07.15
10:21
(44) лови примерчик, там и отбор и поиск
http://www.fayloobmennik.net/5346743
46 rain65
 
28.07.15
10:30
(45) Спасибо. Сейчас гляну.
А вообще интересно получается.
Сделал так:
Если НайтиТел <> ""  Тогда
       Сообщить ("Тел=""");
После того, как набрал номер в поле ввода, по идее должен этот телефон высветиться в табло. Так там нефига нет, только Тел="
Получается, что поле ввода не активно. что ли у меня?
47 palpetrovich
 
28.07.15
10:32
(46) хз что у тебя там неактивно, а если "НайтиТел" - это реквизит формы с фиксированной длиной, то "Если НайтиТел <> ""  Тогда" - смысла не имеет вообще, так как оно ВСЕГДА неравно ""
48 Ёпрст
 
28.07.15
10:33
(46) Перем НайтиТел;  поди в коде еще у тебя, да ?
49 rain65
 
28.07.15
10:36
(48) Угу...точно.Есть такая переменная(
50 rain65
 
28.07.15
10:47
Убрал переменную. Все заработало.И зачем я ее вводил? Не помню уже. Всем огромное спасибо. Ну а Ёпрст - просто колдун, однако)))
51 Mikeware
 
28.07.15
10:47
(50) Он просто умеет читать документацию...
52 varelchik
 
28.07.15
10:52
(50) Он не колдун.
Он просто классный программист и имеет свойства правильно программировать.
53 HawkEye
 
28.07.15
11:34
(43) Табл.ПолучитьЗначение(1, АОН") = = Ошибка в выражении!

одно равно удали..
54 Serginio1
 
28.07.15
11:35
(53) Там еще и кавычки нет
55 HawkEye
 
28.07.15
11:36
(54) угу
(43) и кавычку перед АОН
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn