Имя: Пароль:
1C
 
Отбор в динамическом списке
0 НоваяВолна
 
13.10.20
07:12
Доброго всем времени!
  База БП3, УФ. Создал внешнею обработку, которая вызывается из документа Требование-Накладная и заполняет табличную часть номенклатурой по определенному алгоритму, при этом проставляя выбранную скидку.
  Этот функционал заказчика устроил, но теперь хочет дополнения в виде отборов по номенклатуре. Т.е. если отбор не выбран, то обработка работает как есть. В случае отбора, заполнение ТЧ происходит только выбранной номенклатурой. Решение задачи вижу в том, чтобы выбранный пользователем отбор получить в ТЗ и передать ее в запрос, который заполняет ТЧ документа.
  Надо же, нарвался на простую проблему и ..... и затык. Для отбора на форме обработки создал динамический список с главной таблицей спр.Номенклатура, в списке установил отбор с условиями сравнения (Равно, не равно, в группе.... и т.д.), отбор по умолчанию отключен. Вывел все это на форму. Но при выборе отбора самого отбора не происходит. Вижу это по основной таблице, которую тоже вывел на форму для отладки.
   Гуглил и долго, нашел даже пошаговые инструкции, согласно которым я все делаю правильно.... Однако ошибка в чем то есть. Подскажите плиз
1 НоваяВолна
 
13.10.20
07:55
где можно посмотреть реализацию?
2 НоваяВолна
 
13.10.20
08:48
up
3 Волшебник
 
13.10.20
08:50
Требование-накладная со скидкой, отбор отбора... Весело у вас там
4 НоваяВолна
 
13.10.20
09:32
(3) Не отбор отбора, а замена стандартного отбора обработки на выбор пользователя
5 Андроны едут
 
13.10.20
09:45
Вам нужно получить исполняемую схему компоновки данных с вашими отборами, к которой подцепить набор данных вашего запроса. После чего установить связи этих наборах по номенклатуре и другим ключам, а дальше по стандартной схеме - компоновщик настроек, процессор компоновки, процессор вывода...
6 НоваяВолна
 
13.10.20
10:41
(5) да я не могу в пользовательском режиме получить отбор
7 Андроны едут
 
13.10.20
10:51
(6) в каком пользовательском режиме? У вас же обработка. В ней и получайте.
8 НоваяВолна
 
13.10.20
11:41
(7) Хорошо, получил отбор, вывел его в ТЗ

&НаСервере
Функция Получить_ТЗ_Из_ДинамическогоСписка()

    Схема = Элементы.НоменклатураОтбор.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
    Настройки = Элементы.НоменклатураОтбор.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
    
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    
    ТЗ = Новый ТаблицаЗначений;
    ПроцессорВывода.УстановитьОбъект(ТЗ);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    Возврат ТЗ;

КонецФункции

Но структура ТЗ состоит из индексов и колонок. Мне нужны ссылки на отобранную номенклатуру, как получить?
9 Андроны едут
 
13.10.20
12:06
(8)  как-то так:
//Получаем исполняемую схему отобранной номенклатуры
        СхемаКомпоновкиДанных = СериализаторXDTO.ПрочитатьXDTO(СериализаторXDTO.ЗаписатьXDTO(Элементы.НоменклатураОтбор.ПолучитьИсполняемуюСхемуКомпоновкиДанных()));

// добавляем набор вашего исходного запроса
    НаборДанныхЗапрос = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
    НаборДанныхЗапрос.Имя = "МойИсходныйЗапрос";
    НаборДанныхЗапрос.ИсточникДанных = "ИсточникДанных";
    
// устанавливаем связи
    СвязиНаборов = СхемаКомпоновкиДанных.СвязиНаборовДанных;

        Связь = СвязиНаборов.Добавить();

    Связь.НаборДанныхИсточник = "НаборДанныхНоменклатураОтбор";
    Связь.НаборДанныхПриемник = "НаборДанныхЗапрос";
    Связь.ВыражениеИсточник = "Номенклатура";
    Связь.ВыражениеПриемник = "Номенклатура";

Дальше проверьте в отладчике свойства СКД - наборы, поля, тексты запросов, отборы, связи. Заполните как вам нужно и на исполнение.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан