Имя: Пароль:
1C
1С v8
УТ11 Свой поиск в форме списка партнеров
0 ildary
 
22.11.17
16:26
Уважаемые специалисты, скажите пожалуйста, как правильно сделать: потребовалось в форме списка партнеров организовать свой поиск по ИНН, для этого в форме добавлены 2 процедуры:

Функция СписокПартнеровПоИНН( ИНН )
    
    лТекст = "
        |ВЫБРАТЬ
        |    Контрагенты.Партнер КАК Партнер
        |ПОМЕСТИТЬ ВТ
        |ИЗ
        |    Справочник.Контрагенты КАК Контрагенты
        |ГДЕ
        |    Контрагенты.ИНН ПОДОБНО &ИНН
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    Партнеры.Ссылка КАК Ссылка
        |ИЗ
        |    Справочник.Партнеры КАК Партнеры
        |ГДЕ
        |    Партнеры.Ссылка В ИЕРАРХИИ
        |            (ВЫБРАТЬ
        |                ВТ.Партнер
        |            ИЗ
        |                ВТ)
        |";

    лЗапрос = Новый Запрос(лТекст);
    лЗапрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    лЗапрос.УстановитьПараметр("ИНН", "%" + ИНН + "%" );

    ТЗ = лЗапрос.Выполнить().Выгрузить();
    
    СписокПартнеров = Новый СписокЗначений;
    СписокПартнеров.ЗагрузитьЗначения( ТЗ.ВыгрузитьКолонку( "Ссылка") );
    
    Возврат СписокПартнеров;
    
КонецФункции

&НаКлиенте
Процедура ИННПоискаПриИзменении(Элемент)
    
    Если Не ЗначениеЗаполнено( ЭтаФорма.ИННПоиска ) Тогда
        
        ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( ЭтаФорма.Список, "Ссылка", 0, ВидСравненияКомпоновкиДанных.Равно,, Ложь );    
        Возврат;
        
    КонецЕсли;
    
    СписокПартнеров = СписокПартнеровПоИНН( СокрЛП( ЭтаФорма.ИННПоиска ) );
    
    ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( ЭтаФорма.Список, "Ссылка", СписокПартнеров, ВидСравненияКомпоновкиДанных.ВСписке,, Истина );    
    
КонецПроцедуры

проблема в том, что все работает правильно, если партнёр не является подчиненным другому партнёру, а подчиненный партнер - просто не выводится (дин список вообще пустой). Пробовал разные варианты ВидСравненияКомпоновкиДанных - не помогло.
1 vicof
 
22.11.17
16:38
"что все работает правильно"
Что значит?

Зачем везде писать ЭтаФорма?
2 vicof
 
22.11.17
16:39
ВСпискеПоИерархии?
3 ildary
 
22.11.17
16:41
(1) "Все работает правильно" - я ввожу ИНН и в динамическом списке вижу партнера, на которого ссылается контрагент с таким ИНН. Но только если партнер никому не подчинен (не заполнен реквизит Родитель).

(2) ВСпискеПоИерархии пробовал - не находит партнера, который подчинен другому.
4 vicof
 
22.11.17
16:44
(2) Когда значение родителя заполнено - отбор по родителю, иначе по ссылке
5 ildary
 
22.11.17
16:50
(4) а если поиск идет не по ИНН, а по куску ИНН - хочется вывести всех партнеров, кто попадает под данное условие.
6 vicof
 
22.11.17
16:58
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( ЭтаФорма.Список, "Родитель", СписокПартнеров, ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии,, Истина );
7 VinTrack
 
22.11.17
16:59
К чему изобретать велосипед?
В форме списка партнеров есть поле полнотекстового поиска...
Там хоть ИНН вводить, хоть наименование контрагента (если ведется раздельный учет), хоть партнера - все находится.
В том числе и "по куску"
Если конечно в общих настройках включить использование полнотекстового поиска.
8 ildary
 
22.11.17
17:02
(7) Полнотекстовый поиск отключен. Он не нравится пользователям.
9 VinTrack
 
22.11.17
17:05
Ребята знают толк в извращениях...
Чем поиск полнотекстовый не угодил?
Отлично работает...
10 yzimin
 
22.11.17
17:18
(0) смотри как реализован поиск по ИНН в модуле менеджера справочника контрагентов
ОбработкаПолученияДанныхВыбора

        |    Справочник.Контрагенты КАК Контрагенты
        |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ИерархияПартнеров КАК ИерархияПартнеров
        |        ПО Контрагенты.Партнер = ИерархияПартнеров.Родитель
11 ildary
 
23.11.17
09:55
(10) спасибо за совет. В итоге я понял, что затея вообще не решаема в лоб - я попробовал сделать отбор через Все действия-Настроить список - и вижу, что для партнера второго уровня отбор не работает в режимах "Иерарх список" и "Дерево" ("Список" - работает). В итоге переделал заполнения списка для отбора вот так:

вместо

    СписокПартнеров = Новый СписокЗначений;
    СписокПартнеров.ЗагрузитьЗначения( ТЗ.ВыгрузитьКолонку( "Ссылка") );

сделал

    СписокПартнеров = Новый СписокЗначений;
    Для Каждого Стр Из ТЗ Цикл
        
        ТекПартнер = Стр.Партнер;
        СписокПартнеров.Добавить( ТекПартнер );
        Если ЗначениеЗаполнено( ТекПартнер.Родитель ) Тогда // без родителя не найдет подчиненного партнера
            
            Пока ЗначениеЗаполнено( ТекПартнер.Родитель ) Цикл
                ТекПартнер = ТекПартнер.Родитель;
            КонецЦикла;
            
            СписокПартнеров.Добавить( ТекПартнер );
            
        КонецЕсли;
        
    КонецЦикла;

и теперь отбор работает не идеально, но хоть что-то - выводит корневого родителя.