Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Отбор списка справочника по табличной части элемента.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.3
valleha
Платформа: 8.3
Приложение: управляемое
Конфигурация: самописная

Добрый день!
Помогите, пожалуйста, решить проблему.
Возникла проблема, при реализации отбора списка справочника по ТЧ элементов, используя несколько табличных полей на обычной форме списка.


Более-менее вышел на результат, используя следующий код:
Процедура ОтборСправочникСписок()

        //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
        // Данный фрагмент построен конструктором.
        // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
        
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    СистемыОкраски.Ссылка КАК Ссылка
        |ИЗ
        |    Справочник.СистемыОкраски КАК СистемыОкраски
        |ГДЕ
        |    СистемыОкраски.СферыПрименения.Сфера В(&Сфера)
        |    И СистемыОкраски.ХарактеристикаТовара.Характеристика В(&Характеристика)";
        
        Запрос.УстановитьПараметр("Сфера", СферыПримененияОтбор);                    //ТП на форме
        Запрос.УстановитьПараметр("Характеристика", ТоварХарактеристикаОтбор);     //ТП на форме
        
        РезультатЗапроса = Запрос.Выполнить();
        
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        
        СписокДляОтбора=Новый СписокЗначений;
        //Сообщить(ВыборкаДетальныеЗаписи.Количество());
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            СписокДляОтбора.Добавить(ВыборкаДетальныеЗаписи.Ссылка);
        КонецЦикла;
        
        //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА        
    
    
    СправочникСписок.Отбор.Ссылка.ВидСравнения = ВидСравнения.ВСписке;
    СправочникСписок.Отбор.Ссылка.Значение = СписокДляОтбора;
    СправочникСписок.Отбор.Ссылка.Использование = Истина;

КонецПроцедуры




Но данный алгоритм:
-не удаляет из отбора элементы, в которых нет элемента списка из ТП ("Поры открытые" на скриншоте).
-при СферыПримененияОтбор.Количество()=0 и ТоварХарактеристикаОтбор.Количество()=0, удаляет из отбора все элементы и не отображает их в СправочникСписк.

Возможно есть способ попроще, натолкните на мысль, пожалуйста.

pablo
Здесь проблема в первую очередь в противоречивой постановке задачи, потому как у элемента справочника А в ТЧ могут содержаться как строки, удовлетворяющие отбору, так и не удовлетворяющие. Но при этом Вы не описываете, какой результат желаете получить.
В вашем запросе вы отбираете элементы справочника, удовлетворяющие любой комбинации из значений отборов. Вероятно, Вы хотите получить те элементы, которые соответствуют всем возможным комбинациям из списков отбора?
valleha
Дело в том, что мне трудно сформулировать саму задачу....
Хотя, действительно: "у элемента справочника А в ТЧ НЕ могут содержаться как строки, удовлетворяющие отбору, так и не удовлетворяющие".

Результат, который мне нужно (пример):
у элемента справочника
значения в ТЧ1:
-ЗНЧ1
-ЗНЧ2
значения в ТЧ2:
-знч1

и при выборе значений табличных полей на форме:
ТП1(ЗНЧ1, ЗНЧ2) и ТП2(знч1) = элемент справочника показан.
ТП1(ЗНЧ1, ЗНЧ2, ЗНЧ3) и ТП2(знч1) = элемент справочника скрыт.
ТП1(ЗНЧ1, ЗНЧ2) и ТП2() = элемент справочника показан.
ТП1(ЗНЧ2) и ТП2(знч1) = элемент справочника показан.

Пока данный функционал работает через задний проход:

//...........................
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        
        СписокДляОтбора=Новый СписокЗначений;
        //Сообщить(ВыборкаДетальныеЗаписи.Количество());
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            СписокДляОтбора.Добавить(ВыборкаДетальныеЗаписи.Ссылка);
        КонецЦикла;
        
//////////////////////////////////////////////////////////////////////////////////////////
        Для Каждого СтрокаСферы Из СферыПримененияОтбор Цикл
            Счетчик = СписокДляОтбора.Количество() - 1;
            Пока Счетчик >= 0 Цикл
                ОбъектСпр=СписокДляОтбора[Счетчик].Значение.ПолучитьОбъект();
                Если ОбъектСпр.СферыПрименения.Найти(СтрокаСферы.Значение, "Сфера")=Неопределено Тогда
                    СписокДляОтбора.Удалить(Счетчик);
                КонецЕсли;
                Счетчик = Счетчик - 1;
            КонецЦикла;
        КонецЦикла;
        
        Для Каждого СтрокаХарактеристики Из ТоварХарактеристикаОтбор Цикл
            Счетчик = СписокДляОтбора.Количество() - 1;
            Пока Счетчик >= 0 Цикл
                ОбъектСпр=СписокДляОтбора[Счетчик].Значение.ПолучитьОбъект();
                Если ОбъектСпр.ХарактеристикаТовара.Найти(СтрокаХарактеристики.Значение, "Характеристика")=Неопределено Тогда
                    СписокДляОтбора.Удалить(Счетчик);
                КонецЕсли;
                Счетчик = Счетчик - 1;
            КонецЦикла;    
        КонецЦикла;        
        
////////////////////////////////////////////////////////////////////////////////////////////////
    
    
    
    
    СправочникСписок.Отбор.Ссылка.ВидСравнения = ВидСравнения.ВСписке;
    СправочникСписок.Отбор.Ссылка.Значение = СписокДляОтбора;
    СправочникСписок.Отбор.Ссылка.Использование = Истина;


вопрос открыт
Zaval
valleha, оставьте в покое СправочникСписок. Он не подходит для решения Вашей задачи.
Уже и сами понимаете, что "через задний проход"...
valleha
Zaval @ Сегодня, 21:28 необходимо зарегистрироваться для просмотра ссылки,
Ув. Завал, спасибо за ответ. Но в моём вопросе также звучала просьба о помощи подсказать альтернативное решение данной задачи, если кто знает.
Zaval
Цитата(valleha @ 13.04.16, 20:58) необходимо зарегистрироваться для просмотра ссылки
Возможно есть способ попроще, натолкните на мысль, пожалуйста.

Вот что Вы просили, ув. valleha, а не альтернативное решение.
Беда в том, что Вы уже выбрали "проще некуда".
Пишите обработку с запросом, результат выводите в простое табличное поле, из него и выбирайте. Так понятно?
valleha
да уж...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.