Имя: Пароль:
1C
1С v8
СКД: Отбор в запросе по данным ТЗ
0 Gill
 
14.12.16
09:24
Всем привет!
Есть отчет на СКД. На форме перед формированием отчета есть
ТЗ с необходимым отбором для дальнейшей подстановки в качестве параметра запроса.Вопрос:как это осуществить?
1 varvest
 
14.12.16
09:41
Например так

<code>
ГДЕ РеализацияТоваровУслуг.Ссылка В(&ТЗ)
</code>
2 Defender aka LINN
 
14.12.16
09:42
(1) Хорошая шутка, смешная.
(0) Нафига именно ТЗ?
3 Gill
 
14.12.16
09:48
(2) Данные для отбора  (список контрагентов) формирую в виде массива.Ничего другого как выгрузить все это в итоге в ТЗ на ум не приходит.Может подскажите другой вариант
4 Defender aka LINN
 
14.12.16
09:50
(3) ВидОтбораКомпоновкиДанных.ВСписке
5 Gill
 
14.12.16
10:01
(4) этот вариант не подходит (говорит начальник).Т.к. необходимо вводить явно очень большое кол-во контрагентов.Какие еще возможны способы решения этой задачи?
6 Gill
 
14.12.16
10:05
+(4) Вот так формируем отбор

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    // Вставить содержимое обработчика.
    МассивГоловнойКонтрагент = Новый Массив;
    МассивГоловнойКонтрагент.Добавить(Справочники.Контрагенты.НайтиПоКоду("____")); //1
    МассивГоловнойКонтрагент.Добавить(Справочники.Контрагенты.НайтиПоКоду("____")); //2
    МассивГоловнойКонтрагент.Добавить(Справочники.Контрагенты.НайтиПоКоду("____")); //3
    МассивГоловнойКонтрагент.Добавить(Справочники.Контрагенты.НайтиПоКоду("____")); //4    
    
    Для каждого стрГоловнойКонтрагент из МассивГоловнойКонтрагент цикл
        МассивДочерних = Справочники.Контрагенты.ПолучитьДочерниеОрганизации(стрГоловнойКонтрагент);
        Для каждого стрПотомок из МассивДочерних цикл
            стр = Организации.Добавить();
            стр.КонтрагентГоловной = стрГоловнойКонтрагент;
            стр.КонтрагентДочерний = стрПотомок;
        КонецЦикла;
    КонецЦикла;
    
    СписокОрганизаций=Организации.Выгрузить(,"КонтрагентДочерний");
    
    ПараметрСписокОрганизаций = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("СписокОрганизаций"));
    ПараметрСписокОрганизаций.Значение = СписокОрганизаций;
    ПараметрСписокОрганизаций.Использование = Истина;
КонецПроцедуры
7 Defender aka LINN
 
14.12.16
10:09
(5) Ну, раз "говорит начальник", то он пусть и предлагает варианты.
"необходимо вводить явно очень большое кол-во контрагентов" и чО?
8 varvest
 
14.12.16
10:09
Чем не устраивает мой пример?
9 Defender aka LINN
 
14.12.16
10:10
(6) У вас там отбора нет
10 Defender aka LINN
 
14.12.16
10:10
(8) сделай, узнаешь.
11 Gill
 
14.12.16
10:11
(9) Отбором должен быть список дочерних контрагентов (их ооочень много)...
12 Defender aka LINN
 
14.12.16
10:14
(11) И?
13 Мимохожий Однако
 
14.12.16
10:17
Прикольный способ задания массива МассивГоловнойКонтрагент
Как только добавите еще одного контрагента в базу, опять позовёте программиста? Если за плюшки работает,то неплохо.
14 varvest
 
14.12.16
10:22
Все-таки что не так с моим примером, объясните нубу)

    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Контрагенты.Ссылка
        |ИЗ
        |    Справочник.Контрагенты КАК Контрагенты
        |ГДЕ
        |    Контрагенты.НаименованиеПолное ПОДОБНО ""%А%""";
    
    РезультатЗапросаКонтрагент = Запрос.Выполнить().Выгрузить();
    
    
    Запрос2 = Новый Запрос;
    Запрос2.Текст =
        "ВЫБРАТЬ
        |    РеализацияТоваровУслуг.Ссылка,
        |    РеализацияТоваровУслуг.Контрагент
        |ИЗ
        |    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        |ГДЕ
        |    РеализацияТоваровУслуг.Контрагент В(&Контрагент)";
    
    Запрос2.УстановитьПараметр("Контрагент", РезультатЗапросаКонтрагент);

все работает
15 Defender aka LINN
 
14.12.16
10:25
(14) Это не СКД
16 Gill
 
14.12.16
10:26
Почему так не работает?

    СписокОрганизаций=Организации.Выгрузить(,"КонтрагентДочерний");
    
    ПараметрСписокОрганизаций = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("СписокОрганизаций"));
    //ПараметрСписокОрганизаций.Значение = СписокОрганизаций;
    //ПараметрСписокОрганизаций.Использование = Истина;
    
    Для каждого ЭлементОтбора Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
            Если ЭлементОтбора.ЛевоеЗначение =Новый ПолеКомпоновкиДанных("Организатор") Тогда
                ЭлементОтбора.ВидСравнения=ВидСравненияКомпоновкиДанных.ВСписке;
                ЭлементОтбора.ПравоеЗначение=СписокОрганизаций;
                ЭлементОтбора.Использование=Истина;
            КонецЕсли;
        КонецЦикла;
17 Defender aka LINN
 
14.12.16
10:27
(16) Попробуй СписокЗначений а не Массив
18 Defender aka LINN
 
14.12.16
10:27
(16) + Ну и отбор не помешает добавить
19 Галахад
 
гуру
14.12.16
10:33
//СписокОрганизаций=Организации.Выгрузить(,"КонтрагентДочерний");
СписокОрганизаций=ВыгрузитьКолонку("КонтрагентДочерний");
20 Gill
 
14.12.16
11:25
(17) со СпискомЗначений не отрабатывает...Почему вот так не работает?
В результат вываливается без фильтра.Ведь в запросе указано отбор по Организатору В (&СписокОрганизаций)

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

   ПараметрСписокОрганизаций.Использование = Истина;
21 Мимохожий Однако
 
14.12.16
11:26
Проверь отладчиком, что лежит в СписокОрганизаций
22 Gill
 
14.12.16
11:31
(21) массив
23 Gill
 
14.12.16
11:32
в функции ПолучитьДочерниеОрганизации используется массив
24 Мимохожий Однако
 
14.12.16
11:32
(22) Ты сделай СписокЗначений вместо Массив для начала
25 Мимохожий Однако
 
14.12.16
11:33
(23) ну и?
26 Gill
 
14.12.16
11:42
(23),(24) Со списком значений Неверные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов.
Контрагенты.ГоловнаяКомпания <<?>>= &ГоловнаяКомпания, а если использовать (В) вместо (=) не отрабатывает
27 Gill
 
14.12.16
11:43
вот функция

Функция ПолучитьДочерниеОрганизации(Контрагент) экспорт
    Результат = Новый Массив;
    Результат.Добавить(Контрагент);
    Запрос = Новый запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    Контрагенты.Ссылка
                   |ИЗ
                   |    Справочник.Контрагенты КАК Контрагенты
                   |ГДЕ
                   |    Контрагенты.ГоловнаяКомпания = &ГоловнаяКомпания";
    Запрос.УстановитьПараметр("ГоловнаяКомпания", Контрагент);
    МассивДочек = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
    Для каждого контр из МассивДочек цикл
        Если Результат.Найти(контр) = неопределено тогда
            Результат.Добавить(контр);
        КонецЕсли;
        МассивДочекДочки = ПолучитьДочерниеОрганизации(контр);
        Для каждого ДочкаДочки из МассивДочекДочки цикл
            Если Результат.Найти(ДочкаДочки) = неопределено тогда
                Результат.Добавить(ДочкаДочки);
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
    Возврат Результат;
КонецФункции
28 Мимохожий Однако
 
14.12.16
11:48
(27) я не про эту функцию говорил, а про СписокОрганизаций в (20). Сделай из полученного массива списокЗначений и проверь.
29 Gill
 
14.12.16
12:16
(28)работает... Всем спасибо!
Программист всегда исправляет последнюю ошибку.