Имя: Пароль:
1C
1С v8
помогите создать отбор
,
0 potapovsanek1989
 
14.11.13
10:46
Подскажите пожалуйста как программно создать множественный и единичный отбор в отчете.
Отчет сделал без скд и построителя. Макетом и выводил области.
Создал в отчете реквизит тип выбрал отбор. Потом создал табличное поле в данных выбрал реквизит отбор .
В запросе получал сотрудников,подразделение, контрагент .
Обычные формы платформа 8.2
1 Ewgen_R
 
14.11.13
10:50
Зачем изобретать велосипед с квадратными колесами?
2 Wobland
 
14.11.13
10:54
сесть на берегу реки поздней весной и предаться медитации. через 3 дня в мозгу должны образоваться три буквы: С, К и Д
3 potapovsanek1989
 
14.11.13
10:56
отчет слишком сложный ,в скд не получилось,да и в построитель переделывать долго
4 Wobland
 
14.11.13
10:57
Ученик спросил учителя: "Вот программист, что никогда не проектирует, не сопровождает и не отлаживает свои программы. Однако все, кто его знают, считают его одним из лучших программистов в мире. Почему так?".
Учитель ответил: "Этот программист овладел Дао. Он ушел от нужды проектирования; он не сердится, если система падает, он принимает вселенную такой какая она есть. Он ушел от нужды сопровождения; ему безразлично, увидит ли кто-нибудь его код. Он ушел от нужды отладки; каждая из его программ совершенна изнутри, изящна и ясна, и ее цель самоочевидна. Поистине он постиг тайну Дао."
5 MSII
 
14.11.13
10:59
(3) У тебя же в результате все равно получается таблица значений. Вот ее и пихай в СКД, вопрос с отборами решится.
6 samozvanec
 
14.11.13
11:00
(4) "Дао" читать "СКД"?)
7 potapovsanek1989
 
14.11.13
11:01
у меня получаетья отчет строиться по периодам ,для одного периода один запрос,когда больше периодов то другой
8 Kalac
 
14.11.13
11:02
юзай СКД. А то сейчас налепишь чуши
9 potapovsanek1989
 
14.11.13
11:07
Без скд кто нибудь знает как?
10 Wobland
 
14.11.13
11:07
(6) если ты можешь назвать дао, ты не познал дао
11 Kalac
 
14.11.13
11:07
Отчет не сложный. Используешь динамический список периоды и по нему строишь отчет запросом и настройками скд
12 Wobland
 
14.11.13
11:08
(9) отринь мирское

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    СтандартнаяОбработка=Ложь;

    НачалоПериода='00010101';
    КонецПериода=ТекущаяДата();
    Настройки=КомпоновщикНастроек.ПолучитьНастройки(); // Получаем настройки отчета
    ПараметрНачалоПериода=Настройки.ПараметрыДанных.Элементы.Найти("НачалоПериода");
    Если ПараметрНачалоПериода<>Неопределено И ПараметрНачалоПериода.Использование Тогда
        НачалоПериода=ПараметрНачалоПериода.Значение.Дата;
    КонецЕсли;
    ПараметрКонецПериода=Настройки.ПараметрыДанных.Элементы.Найти("КонецПериода");
    Если ПараметрКонецПериода<>Неопределено И ПараметрКонецПериода.Использование Тогда
        КонецПериода=КонецДня(ПараметрКонецПериода.Значение.Дата);
    КонецЕсли;
    
    Результат=ПолучитьРезультат(НачалоПериода, КонецПериода);  //сложная и мудрёная ТЗ
    //Результат=ПолучитьРезультат('20130401', '20130401235959');

    ДанныеРасшифровки=Новый ДанныеРасшифровкиКомпоновкиДанных; // Создаём данные расшифровки
    КомпоновщикМакета=Новый КомпоновщикМакетаКомпоновкиДанных; // Создаём компоновщик макета
    // Инициализируем макет компоновки, используя схему компоновки данных
    // и созданные ранее настройки и данные расшифровки
    СхемаКомпоновкиДанных=ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    МакетКомпоновки=КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);

    // Скомпонуем результат
    ПроцессорКомпоновки=Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, Новый Структура("Результат", Результат), ДанныеРасшифровки);

    ДокументРезультат.Очистить();

    // Выводим результат в табличный документ
    ПроцессорВывода=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
13 Kalac
 
14.11.13
11:11
Вобщем делай на СКД иначе колхоз
14 George Wheels
 
14.11.13
11:11
(9) Если без СКД, то все отборы делаешь в запросе или в ТЗ.
15 Kalac
 
14.11.13
11:15
Он не знает хочет чтобы мы за него всё написали?
16 Kalac
 
14.11.13
11:18
Вообще есть один код где то похожий. Могу скинуть
17 potapovsanek1989
 
14.11.13
11:18
еслиб знал не спрашивал,тебя не заставляют
18 Kalac
 
14.11.13
11:18
Надо?
19 Kalac
 
14.11.13
11:19
как знаешь. ну тогда читай Хрусталеву
20 potapovsanek1989
 
14.11.13
11:22
Кидай пример
21 Wobland
 
14.11.13
11:24
(20) а можно я?
22 Kalac
 
14.11.13
11:24
Процедура ОбновитьФормуТиповогоОтчетаПоКомпоновщику(ОтчетОбъект, ФормаОтчета) Экспорт
        
        Если ЭтоСтараяВерсияОтчета(ОтчетОбъект) Тогда
            // Параметры периода
            ЗначениеПараметраНачалоПериода = ОтчетОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("НачалоПериода"));
            ЗначениеПараметраКонецПериода = ОтчетОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("КонецПериода"));
            ЗначениеПараметраПериод = ОтчетОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Период"));
            
            Если ЗначениеПараметраНачалоПериода <> Неопределено
                И ЗначениеПараметраКонецПериода <> Неопределено Тогда
                ФормаОтчета.НачалоПериода = ЗначениеПараметраНачалоПериода.Значение;
                ФормаОтчета.КонецПериода = ЗначениеПараметраКонецПериода.Значение;
                ФормаОтчета.ЭлементыФормы.ПанельПериод.ТекущаяСтраница = ФормаОтчета.ЭлементыФормы.ПанельПериод.Страницы.Интервал;
            ИначеЕсли ЗначениеПараметраПериод <> Неопределено Тогда
                ФормаОтчета.Период = ЗначениеПараметраПериод.Значение;
                ФормаОтчета.ЭлементыФормы.ПанельПериод.ТекущаяСтраница = ФормаОтчета.ЭлементыФормы.ПанельПериод.Страницы.Период;
            Иначе
                ФормаОтчета.ЭлементыФормы.ПанельПериод.ТекущаяСтраница = ФормаОтчета.ЭлементыФормы.ПанельПериод.Страницы.Пустой;
            КонецЕсли;
            
            // Вывод заголовка отменяется
            Значение = ОтчетОбъект.КомпоновщикНастроек.Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("TitleOutput")).Значение;
            Пометка = (Значение = ТипВыводаТекстаКомпоновкиДанных.Выводить);
            Если ФормаОтчета.ЭлементыФормы.ДействияФормы.Кнопки.Найти("Заголовок") <> Неопределено тогда
                ФормаОтчета.ЭлементыФормы.ДействияФормы.Кнопки.Заголовок.Пометка = Пометка;
            КонецЕсли;
        Иначе
            
            ЗначенияНастроек = ПолучитьЗначенияНастроекПанелиПользователяОбъекта(ОтчетОбъект);
            ВыводитьЗаголовокОтчета = Истина;
            Если ЗначенияНастроек = Неопределено
                ИЛИ Не ЗначенияНастроек.Свойство("ВыводитьЗаголовокОтчета", ВыводитьЗаголовокОтчета) Тогда
                ВыводитьЗаголовок = Истина;    
            Иначе
                ВыводитьЗаголовок = ВыводитьЗаголовокОтчета;
            КонецЕсли;
            Если ФормаОтчета.ЭлементыФормы.КоманднаяПанельДействияСОтчетом.Кнопки.Найти("Заголовок") <> Неопределено тогда
                ФормаОтчета.ЭлементыФормы.КоманднаяПанельДействияСОтчетом.Кнопки.Заголовок.Пометка = ВыводитьЗаголовок;
            КонецЕсли;
            
            ДополнительныеНастройкиОтчета = Новый Массив;
            ПараметрыИсполненияОтчета = ОтчетОбъект.ПолучитьПараметрыИсполненияОтчета();
            Если ПараметрыИсполненияОтчета.Свойство("ДополнительныеНастройкиОтчета") И ПараметрыИсполненияОтчета.ДополнительныеНастройкиОтчета тогда
                ДополнительныеНастройкиОтчета = ОтчетОбъект.ПолучитьДополнительныеНастройкиОтчета();
            КонецЕсли;
            
            Для каждого ДопНастройка из ДополнительныеНастройкиОтчета Цикл
                ЗначениеФлажка = ДопНастройка.ЗначениеПоУмолчанию;
                Если ЗначенияНастроек = Неопределено
                    ИЛИ Не ЗначенияНастроек.Свойство(ДопНастройка.Имя, ЗначениеФлажка) Тогда
                    Флажок = ложь;    
                Иначе
                    Флажок = ЗначениеФлажка;
                КонецЕсли;
                Если ФормаОтчета.ЭлементыФормы.Найти(ДопНастройка.Имя) <> Неопределено тогда
                    ФормаОтчета.ЭлементыФормы[ДопНастройка.Имя].Значение = Флажок;
                КонецЕсли;
            КонецЦикла;
            
            Если ЗначенияНастроек = Неопределено тогда
                СкопироватьЭлементы(ФормаОтчета.КомпоновщикНастроекПользователя.Настройки.Выбор, ФормаОтчета.КомпоновщикНастроек.Настройки.Выбор);
            Иначе
                ВыбранныеПоляПользователя = ФормаОтчета.КомпоновщикНастроекПользователя.Настройки.Выбор;
                ВыбранныеПоля = ОтчетОбъект.КомпоновщикНастроек.Настройки.Выбор;
                ОбновитьПоляВНастройкеПользователя(ВыбранныеПоляПользователя, ВыбранныеПоля);
            КонецЕсли;
            ВосстановитьПараметрыТабличногоДокумента(ФормаОтчета.ЭлементыФормы.Результат, ОтчетОбъект.СохраненнаяНастройка);    
            
        КонецЕсли;
    КонецПроцедуры
    
    // Процедура РезультатОбработкаРасшифровки
    // Действие, выполняемое при вызове расшифровки пользователем
    Процедура СтандартнаяОбработкаРасшифровкиТиповогоОтчета(ОтчетОбъект, ФормаОтчета, Расшифровка, СтандартнаяОбработка) Экспорт
        
        Перем ВыполненноеДействие;
        
        // Запретим стандартную обработку расшифровки
        СтандартнаяОбработка = Ложь;
        
        // Создадим и инициализируем обработчик расшифровки
        ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ФормаОтчета.ДанныеРасшифровки,
        Новый ИсточникДоступныхНастроекКомпоновкиДанных(ПолучитьСхемуКомпоновкиОбъекта(ОтчетОбъект)));
        
        // Осуществим выбор действия расшифровки пользователем
        Настройки = ОбработкаРасшифровки.Выполнить(Расшифровка, ВыполненноеДействие);
        
        Если Настройки <> Неопределено Тогда
            // Пользователь выбрал действие, для которого нужно менять настройки
            
            Если ВыполненноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.Упорядочить Тогда
                // Если требется упорядочить - упорядочим в текущем отчете
                ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
                ФормаОтчета.ОбновитьОтчет();
                
            Иначе
                
                НовыйОтчет = Отчеты[ОтчетОбъект.Метаданные().Имя].Создать();
                ЗаполнитьЗначенияСвойств(НовыйОтчет, ОтчетОбъект, , "СохраненнаяНастройка");
                НовыйОтчет.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
                
                ФормаНовогоОтчета = НовыйОтчет.ПолучитьФорму();
                НазначитьФормеУникальныйКлючИдентификации(ФормаНовогоОтчета);
                ФормаНовогоОтчета.ЭтоОтработкаРасшифровки = Истина;
                Если Не ЭтоСтараяВерсияОтчета(ОтчетОбъект) Тогда
                    ФормаНовогоОтчета.РежимРедактированияНастройки = Истина;
                    ФормаНовогоОтчета.ПредставлениеНастройки = "Расшифровка " + Символы.ПС + ОтчетОбъект.СохраненнаяНастройка;
                КонецЕсли;
                ФормаНовогоОтчета.Открыть();
                ФормаНовогоОтчета.ОбновитьОтчет();
                
            КонецЕсли;
            
        КонецЕсли;
        
    КонецПроцедуры


на типовом отчете СКД основаны процедуры осталось тебе только вставить код, привязать в модуле менеджера и сделать инициализацию
23 potapovsanek1989
 
14.11.13
11:30
(21) разрешаю
24 potapovsanek1989
 
14.11.13
11:31
Калач спасибо)
25 Wobland
 
14.11.13
11:32
и я как обычно..
26 Повелитель
 
14.11.13
11:48
(0)
Есть у меня в списке номенклатура кнопка "Показать товары с остатками"
Процедура ниже.
Работает практически мгновенно, больше 10000 значение в отбор не загонял, незнаю как поведет себя.

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

    
    ЭлементыФормы.ДействияФормы.Кнопки.ПоказатьТоварыНаОстатках.Пометка = Истина;
    ЭлементыФормы.ДействияФормы.Кнопки.ПоказатьТоварыНаОстатках.Текст = "Товары с остатками = " + СокрЛП(ВыбСклад);
КонецПроцедуры
27 Повелитель
 
14.11.13
11:51
(26) Документы можно по этому же принципу отбирать.
Вначале запрос, с нужным отбором.
Потом стандартно для всех
ЭлементОтбора                =    Список.Отбор.Найти("Ссылка");
ЭлементОтбора.ВидСравнения    =    ВидСравнения.ВСписке;
ЭлементОтбора.Значение        =    мСписок;
ЭлементОтбора.Использование    =    Истина;