Имя: Пароль:
1C
1С v8
В отчёте не работает один фильтр. Отчет через набор данных для СКД
0 Mechanik21
 
30.04.21
15:08
Мне нужно было дополнить типовой отчёт своими колонками, которые не получишь запросом. Поэтому я использовал две СКД. В одну я накладываю таблицу для вывода с помощью набора данных, Потом эту таблицу но с настройками второй СКД я вывожу на экран.
Вот код:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();    
    МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(),,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
    
    ВремНастройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    НоваяСхемаКомпоновкиДанных = СхемаКомпоновкиДанных;
    //НовыйКомпоновщикНастроек = КомпоновщикНастроек;
    
    // Инициализация процессора компоновки
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных,,,);
    
    ТаблицаПромежуточныхДанных = Новый ТаблицаЗначений;
    
    // Получение результата
    ПроцессорВыводаРезультатаКомпоновкиДанных = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    ПроцессорВыводаРезультатаКомпоновкиДанных.УстановитьОбъект(ТаблицаПромежуточныхДанных);
    ПроцессорВыводаРезультатаКомпоновкиДанных.Вывести(ПроцессорКомпоновкиДанных);
    
    
    //В таблице "ТаблицаПромежуточныхДанных" результат выполнения запроса
    //Тут ее можно модифицировать, свернуть и все прочее на что хватит фантазии
    //И вывести уже модифицированную ТЗ
    //Только в схеме отчета "СхемаВывода" не забыть добавить недостающие поля
        
    
    ВремТаблицаПромежуточныхДанных = Новый ТаблицаЗначений;
    ВремТаблицаПромежуточныхДанных = ТаблицаПромежуточныхДанных.Скопировать();
    ВремТаблицаПромежуточныхДанных.Свернуть("Номенклатура");
    МассивНоменклатуры = ВремТаблицаПромежуточныхДанных.ВыгрузитьКолонку("Номенклатура");
    
    ЗапросНачОст = Новый Запрос("ВЫБРАТЬ
                                |    ТоварыПереданныеНаКомиссиюОстатки.КоличествоОстаток КАК КоличествоОстаток,
                                |    ТоварыПереданныеНаКомиссиюОстатки.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры,
                                |    ТоварыПереданныеНаКомиссиюОстатки.Организация КАК Организация
                                |ИЗ
                                |    РегистрНакопления.ТоварыПереданныеНаКомиссию.Остатки(&Дата, ) КАК ТоварыПереданныеНаКомиссиюОстатки
                                |ГДЕ
                                |    ТоварыПереданныеНаКомиссиюОстатки.АналитикаУчетаНоменклатуры.Номенклатура В(&Номенклатура)");
    ЗапросНачОст.УстановитьПараметр("Номенклатура", МассивНоменклатуры);
    ЗапросНачОст.УстановитьПараметр("Дата", КомпоновщикНастроек.ПолучитьНастройки().ПараметрыДанных.Элементы[0].Значение.Дата);
    
    //начальный остаток
    ВыборкаНачОст = ЗапросНачОст.Выполнить().Выгрузить();
    
    
    //конечный остаток
    ЗапросКонОст = Новый Запрос("ВЫБРАТЬ
                                |    ТоварыПереданныеНаКомиссиюОстатки.КоличествоОстаток КАК КоличествоОстаток,
                                |    ТоварыПереданныеНаКомиссиюОстатки.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры,
                                |    ТоварыПереданныеНаКомиссиюОстатки.Организация КАК Организация
                                |ИЗ
                                |    РегистрНакопления.ТоварыПереданныеНаКомиссию.Остатки(&Дата, ) КАК ТоварыПереданныеНаКомиссиюОстатки
                                |ГДЕ
                                |    ТоварыПереданныеНаКомиссиюОстатки.АналитикаУчетаНоменклатуры.Номенклатура В(&Номенклатура)");
    ЗапросКонОст.УстановитьПараметр("Номенклатура", МассивНоменклатуры);
    ЗапросКонОст.УстановитьПараметр("Дата", КомпоновщикНастроек.ПолучитьНастройки().ПараметрыДанных.Элементы[1].Значение.Дата);
    
    //конечный остаток
    ВыборкаКонОст = ЗапросКонОст.Выполнить().Выгрузить();
    
    Запрос = Новый Запрос();
    
    ТаблицаПромежуточныхДанных.Свернуть("Артикул, Номенклатура, Характеристика, Комиссионер, Организация, ЕдиницаДляОтчетов, Цена", "КоличествоПродано, КоличествоСписано,
                                            | КоличествоПриход, СуммаВознаграждения, СуммаВыручки");
    ТаблицаПромежуточныхДанных.Колонки.Добавить("КоличествоНачальныйОстаток");
    ТаблицаПромежуточныхДанных.Колонки.Добавить("КоличествоКонечныйОстаток");
    
    Для каждого НачальныйОстаток Из ВыборкаНачОст Цикл
        
        СтруктураПоиска = Новый Структура;
        СтруктураПоиска.Вставить("Номенклатура", НачальныйОстаток.АналитикаУчетаНоменклатуры.Номенклатура);
        СтруктураПоиска.Вставить("Организация", НачальныйОстаток.Организация);
        МассивНайденныхСтрок = ТаблицаПромежуточныхДанных.НайтиСтроки(СтруктураПоиска);
        //Если МассивНайденныхСтрок.Количество() > 0 Тогда
            //МассивНайденныхСтрок
        //КонецЕсли;
        Для каждого НайденнаяСтрока Из МассивНайденныхСтрок Цикл
            
            НайденнаяСтрока.КоличествоНачальныйОстаток = НачальныйОстаток.КоличествоОстаток;
            
        КонецЦикла;
        
    КонецЦикла;
    
    Для каждого КонечныйОстаток Из ВыборкаКонОст Цикл
        
        СтруктураПоиска = Новый Структура;
        СтруктураПоиска.Вставить("Номенклатура", КонечныйОстаток.АналитикаУчетаНоменклатуры.Номенклатура);
        СтруктураПоиска.Вставить("Организация", КонечныйОстаток.Организация);
        МассивНайденныхСтрок = ТаблицаПромежуточныхДанных.НайтиСтроки(СтруктураПоиска);
        Для каждого НайденнаяСтрока Из МассивНайденныхСтрок Цикл
            
            НайденнаяСтрока.КоличествоКонечныйОстаток = КонечныйОстаток.КоличествоОстаток;
            
        КонецЦикла;
        
    КонецЦикла;
    
    ТаблицаПромежуточныхДанных.Колонки.Добавить("СуммаПоЗакупочнойЦене");
    ТаблицаПромежуточныхДанных.Колонки.Добавить("ВаловаяПрибыль");
    ТаблицаПромежуточныхДанных.Колонки.Добавить("Рентабельность");
    ТаблицаПромежуточныхДанных.Колонки.Добавить("СуммаНаНачалоПериода");
    ТаблицаПромежуточныхДанных.Колонки.Добавить("СуммаНаКонецПериода");
    
    Для каждого СтрокаТЗ Из ТаблицаПромежуточныхДанных Цикл
        
        Если СтрокаТЗ.Цена <> Неопределено Тогда
            СтрокаТЗ.СуммаПоЗакупочнойЦене = СтрокаТЗ.Цена * СтрокаТЗ.КоличествоПродано;
        Иначе
            СтрокаТЗ.СуммаПоЗакупочнойЦене = 0;
        КонецЕсли;
        
        Если СтрокаТЗ.КоличествоНачальныйОстаток <> Неопределено И СтрокаТЗ.Цена <> Неопределено Тогда
            СтрокаТЗ.СуммаНаНачалоПериода = СтрокаТЗ.КоличествоНачальныйОстаток * СтрокаТЗ.Цена;
        Иначе
            СтрокаТЗ.СуммаНаНачалоПериода = 0;
        КонецЕсли;
        
        Если СтрокаТЗ.КоличествоКонечныйОстаток <> Неопределено И СтрокаТЗ.Цена <> Неопределено Тогда
            СтрокаТЗ.СуммаНаКонецПериода = СтрокаТЗ.КоличествоКонечныйОстаток * СтрокаТЗ.Цена;
        Иначе
            СтрокаТЗ.СуммаНаКонецПериода = 0;
        КонецЕсли;
        
        Если СтрокаТЗ.Цена <> Неопределено Тогда
            СтрокаТЗ.ВаловаяПрибыль = СтрокаТЗ.СуммаВыручки-(СтрокаТЗ.Цена*СтрокаТЗ.КоличествоПродано)-СтрокаТЗ.СуммаВознаграждения;
        Иначе
            СтрокаТЗ.ВаловаяПрибыль = 0;
        КонецЕсли;
        
        Если СтрокаТЗ.СуммаВыручки <> 0 Тогда
            СтрокаТЗ.Рентабельность = Формат(((СтрокаТЗ.СуммаВыручки - (СтрокаТЗ.Цена * СтрокаТЗ.КоличествоПродано) - СтрокаТЗ.СуммаВознаграждения) / СтрокаТЗ.СуммаВыручки) * 100, "ЧДЦ=2");
        Иначе
            СтрокаТЗ.Рентабельность = 0;
        КонецЕсли;
        
    КонецЦикла;
    
    ВнешниеНаборыДанных = Новый Структура("ТаблицаВывода", ТаблицаПромежуточныхДанных);
    
    СхемаКомпоновкиДанных = ПолучитьМакет("СхемаВывода");
    
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
        
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки, Истина);
        
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
        
    ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
    
    СхемаКомпоновкиДанных = НоваяСхемаКомпоновкиДанных;
    //КомпоновщикНастроек = НовыйКомпоновщикНастроек;
    
    //КомпоновщикНастроек.Восстановить();
    
    //КомпоновщикНастроек.Восстановить(
    КомпоновщикНастроек.ЗагрузитьНастройки(ВремНастройки);
    
КонецПроцедуры
1 Mechanik21
 
30.04.21
15:08
Почему может не работать фильтр?