Имя: Пароль:
1C
1C 7.7
v7: Поиск по всему справочнику и по указанной группе
0 Масянька
 
06.12.12
16:32
День добрый!
Я уже поломала все, что ломается :(

Спр = СоздатьОбъект("Справочник.Номенклатура");

Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
   Если УчетГруппы = 1 Тогда
Если Спр.ПринадлежитГруппе(ГруппаСправочникаДляКорректировки) = 1 Тогда
   СтрокаПоиска = Найти(Нрег(Строка(Спр.ПолучитьАтрибут(РабочийРеквизит))), Нрег(Строка(СокрЛ(ЧтоИщем))));
Иначе
   СтрокаПоиска = 0;
КонецЕсли;
   Иначе
СтрокаПоиска = Найти(Нрег(Строка(Спр.ПолучитьАтрибут(РабочийРеквизит))), Нрег(Строка(СокрП(ЧтоИщем))));
   КонецЕсли;
   Если СтрокаПоиска > 0 Тогда
ЗаполнитьСтрокуТаблицы(Спр.Код, Спр.Наименование, Спр.ПолнНаименование);
   КонецЕсли;
КонецЦикла;


Если искать по справочнику - ищет, если указать группу - нет.
Ну почему?
1 Ёпрст
 
06.12.12
16:33
ГруппаСправочникаДляКорректировки - не элемент
2 Ёпрст
 
06.12.12
16:33
т.е это не ссылка на группу справочника
3 Ёпрст
 
06.12.12
16:34
не так ли ? :)
4 Масянька
 
06.12.12
16:34
Ёлки-моталки! Забыла - ТиС 932
5 Масянька
 
06.12.12
16:35
Спр = СоздатьОбъект("Справочник.Номенклатура");

Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
   Если УчетГруппы = 1 Тогда
Если Спр.ПринадлежитГруппе(ГруппаСправочникаДляКорректировки) = 1 Тогда

выполняется, то бишь: заходит, выводит наименование "Трали-вали", но искомая строка "вали" - не находится, почему-то...
6 Масянька
 
06.12.12
16:36
+(5) И "ГруппаСправочникаДляКорректировки " - тип значения - "Справочник".
7 Ёпрст
 
06.12.12
16:37
СокрЛ замени на сокрлп
8 Ёпрст
 
06.12.12
16:37
приводить атрибут явно к строке тоже лишнее
9 Масянька
 
06.12.12
16:38
(7) Не пойдет - нужно левые пробелы оставлять.
(8) Это я уже перестраховываюсь.
10 Масянька
 
06.12.12
16:40
(8) Нет, ты объясни, почему две одинаковые строчки

  СтрокаПоиска = Найти(Нрег(Строка(Спр.ПолучитьАтрибут(РабочийРеквизит))), Нрег(Строка(СокрЛ(ЧтоИщем))));


по-разному работают?
В Clipper'е были такие косяки - при поиске в БД, как только накладываешь фильтр - результат не перестаёт удивлять.
11 Mikeware
 
06.12.12
16:41
(9) открой для себя прямые запросы.
быстро и со вкусом...
12 Масянька
 
06.12.12
16:42
(11) Ну, начинается.... После 3 суток с 1срр....
13 Mikeware
 
06.12.12
16:42
(10) ни в одном из клипперов (кроме сырого Visual Objects) никакого удивления  не испытывал. все работало строго в соответсвии с документацией
14 Масянька
 
06.12.12
16:42
(11) Кидай пример. Пожалуйста (чуть не забыла :)))) )
15 Mikeware
 
06.12.12
16:42
(12) ну, начнем с того, что 1с++ у тебя уже есть...
16 Масянька
 
06.12.12
16:43
(13) Да ладно.
17 Стрелок
 
06.12.12
16:44
Процедура ОбработкаПоиска()
   //СписокКлиентов.УдалитьВсе();
   Если ПустоеЗначение(стрПоиска)=1 Тогда
       ИспользоватьСписокЭлементов();
       ИерархическийСписок(1,1);
       ИспользоватьРодителя(ПолучитьПустоеЗначение("Справочник.Контрагенты"));
       Возврат;
   КонецЕсли;    
   Если ИсторияФильтра.НайтиЗначение(СтрПоиска)=0 Тогда
       ИсторияФильтра.ВставитьЗначение(1,СтрПоиска);
   КонецЕсли;
   РазбиваемаяСтрока=СтрЗаменить(Нрег(СокрЛП(стрПоиска))," ",РазделительСтрок);
   РазбиваемаяСтрока=СтрЗаменить(РазбиваемаяСтрока,"'","''");
   Текст="SELECT
       |code AS Код,
       |id AS [Контрагент $Справочник.Контрагенты]
       |FROM $Справочник.Контрагенты WHERE isfolder=2";
   Для Индекс=1 По СтрКоличествоСтрок(РазбиваемаяСтрока) Цикл
       Слово=СтрПолучитьСтроку(РазбиваемаяСтрока,Индекс);
       Если ПустоеЗначение(Слово)=0 Тогда
           Текст=Текст+"
               |AND LOWER(descr) LIKE '"+Слово+"'";
       КонецЕсли;
   КонецЦикла;
   
   Попытка
       ТЗРезультата=Запрос.ВыполнитьИнструкцию(Текст);
   Исключение
       Сообщить(ОписаниеОшибки());
   КонецПопытки;
   
   СписокКлиентов=СоздатьОбъект("СписокЗначений");
   ТЗРезультата.Выгрузить(СписокКлиентов,,,"Контрагент");
   ИерархическийСписок(0,0);
   ИспользоватьСписокЭлементов(СписокКлиентов);
   
КонецПроцедуры      




Запрос=СоздатьОбъект("ODBCRecordSet");
       БазаДанных=СоздатьОбъект("ODBCDataBase");
       Если БазаДанных.ЕстьСоединение()=0 Тогда
           // Это база дбф
           Если МонопольныйРежим()=1 Тогда
               Предупреждение("Поиск не работает в монопольном режиме"+РазделительСтрок+
               "Функция быстрого поиска по справочнику отключена");
               Форма.СтрПоиска.Доступность(0);
           КонецЕсли;
           Если БазаДанных.Соединение("DRIVER=Microsoft Visual FoxPro Driver;
           |Deleted=Yes;
           |Null=Yes;
           |Collate=RUSSIAN;
           |BackgroundFetch=No;
           |Exclusive=No;
           |SourceType=DBF;
           |SourceDB=" + КаталогИБ()) = 0 Тогда
               Сообщить(БазаДанных.ПолучитьОписаниеОшибки());  
               Предупреждение("Функция быстрого поиска по справочнику отключена");
               Форма.СтрПоиска.Доступность(0);
               Форма.СписокКлиентов.Доступность(0);
           КонецЕсли;
           Запрос.УстБД(БазаДанных);
       КонецЕсли;
18 Масянька
 
06.12.12
16:45
+(16) На 3 курсе лабу писала на Fox'е. Когда сдавала, консилиум собрался. Глядя на код, все изрекали: "Это не может работать!". Компилировались и чесали репу.
19 Стрелок
 
06.12.12
16:45
это самое простое - фильтр справочника по подстроке в наименовании элемента. дальше всё аналогично
20 Масянька
 
06.12.12
16:46
(17) Ну, все....
В ближайшие пару дней - меня не ищете....
21 Масянька
 
06.12.12
16:46
(17) Забыла = спасибо.
22 Mikeware
 
06.12.12
16:46
(16) работал с версиями от winter'85 до 5.3 лет 10.
зы. база сиквельная?
23 Масянька
 
06.12.12
16:48
(22) Нет, виа (тьфу, ВИА "Умелые ручки) - dbf.
24 Mikeware
 
06.12.12
16:56
(23) Тогда Ёпа пытай.
в принципе, как основа и (17) сойдет
25 Масянька
 
06.12.12
16:56
Ёпрст4! Вот ты объясни, пожалуйста, что за х....ня!!!!!
С сокрЛП - работает.
26 Стрелок
 
06.12.12
16:57
(25) в пробелах дело в них родных ;) у тебя реквизит то типизирован и длина указана. ВОт и всё
27 pofigos
 
06.12.12
16:59
(25) с учетом группы ты отсекаешь пробелы слева!!! иначе - справа. вот и вся разница.
28 Ёпрст
 
06.12.12
17:01
(25)
:)

Ну как бэ в строке

"вася" он "                вася" ну никак не найдет
29 Ёпрст
 
06.12.12
17:02
строка поиска у тебя поди реквизит формы определенной длины - он всегда такой длины и будет (просто пробелами забьёт до нужной длины) вот и их отрезать и нужно
30 Ёпрст
 
06.12.12
17:03
ну или пробелы справа.. не важно
31 Масянька
 
06.12.12
17:06
Вот пипец (ой извините).
А если мне надобно найти " ," (лишний пробел перед запятой) - индейская изба......

Спасибо огромное!
32 Масянька
 
06.12.12
17:12
Нет подождите, а почему без группы работает? Там-то тоже нет СокрЛП.
33 Ёпрст
 
06.12.12
17:13
(32) там сокрп
34 Стрелок
 
06.12.12
17:13
(32) там справа обрезаются. откуда мы знаем как в реквизите стоит твои "трили-вали"?
35 Ёпрст
 
06.12.12
17:14
то бишь ты в первом случае пытаешься найти в
"вася"

вот это
"вася                 "

а во втором случае, пробелы справа отрезаешь
36 Масянька
 
06.12.12
17:16
То есть (у меня реквизит поиска - строка, 50): как строка будет заполняться пробелами?
37 Ёпрст
 
06.12.12
17:17
(36) ну дык выведи

сообщить(""""+ЧтоИщем+"""");
сама увидишь
%)
38 Масянька
 
06.12.12
17:17
ОГРОМНОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!!!!!!!
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший