Имя: Пароль:
1C
1С v8
Внешний отчет на СКД
0 егаис
 
12.04.17
13:22
Приветствую, подскажите по такому вопросу, никогда не приходилось сталкиваться.
Есть отчет на СКД. Но мне нужно обработать получаемые данные и вывести в макет. Напрмер, надо пропарсить "Способ отражения расходов в ЗУП" и вывести рассчитанный результат. Дополнительно нужно получить данные по COM соединению с другой базой и "засунуть" в этот же отчет.
В качестве форма отчета использую общие формы отчета, настройки и вариантов.
Получается надо перехватить результат компоновки, дополнительно его обработать и выдать результат в макет.
Как это реализовать?
1 Гипервизор
 
12.04.17
13:34
Данные из другой базы в ТЗ;
ТЗ в компоновку через ВнешниеНаборыДанных: ПроцессорКомпоновкиДанных.Инициализировать(<Макет>, <ВнешниеНаборыДанных>, <ДанныеРасшифровки>, <ВозможностьИспользованияВнешнихФункций>);
ТЗ описать в схеме как набор данных объект.
2 егаис
 
12.04.17
13:50
а если создать НаборДанных "Объект" и подсунуть общую ТЗ ( с учетом COM) в ПриКомпоновкеРезультата()?
3 DrShad
 
12.04.17
13:54
так об этом и речь
4 егаис
 
12.04.17
15:33
подскажите, а как программно очистить настройки СКД?
Короче, устанавливаю отбор через изменить вариант по полю, который не участвует с отборе.
Парсю свой запрос с учетом этого отбора.
Но потом этот отбор участвует     
МакетКомпоновки = КомпоновщикМакета.Выполнить(ЭтотОбъект.СхемаКомпоновкиДанных, ЭтотОбъект.КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);

Он не нужен, как его очистить?
5 егаис
 
12.04.17
15:34
код такой

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

    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ОтражениеЗарплатыВБухучетеНачисленнаяЗарплатаИВзносы.ФизическоеЛицо,
        |    ОтражениеЗарплатыВБухучетеНачисленнаяЗарплатаИВзносы.СпособОтраженияЗарплатыВБухучете,
        |    СУММА(ОтражениеЗарплатыВБухучетеНачисленнаяЗарплатаИВзносы.Сумма) КАК Сумма
        |ИЗ
        |    Документ.ОтражениеЗарплатыВБухучете.НачисленнаяЗарплатаИВзносы КАК ОтражениеЗарплатыВБухучетеНачисленнаяЗарплатаИВзносы
        |ГДЕ
        |    ОтражениеЗарплатыВБухучетеНачисленнаяЗарплатаИВзносы.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
        |
        |СГРУППИРОВАТЬ ПО
        |    ОтражениеЗарплатыВБухучетеНачисленнаяЗарплатаИВзносы.СпособОтраженияЗарплатыВБухучете,
        |    ОтражениеЗарплатыВБухучетеНачисленнаяЗарплатаИВзносы.ФизическоеЛицо";
    
    Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ДатаНачала));
    Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ДатаОкончания));
    
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("ОбъектВыполнения", Новый ОписаниеТипов("Строка"));
    ТЗ.Колонки.Добавить("СтатьяЗатрат", Новый ОписаниеТипов("Строка"));
    ТЗ.Колонки.Добавить("ФизическоеЛицо", Новый ОписаниеТипов("СправочникСсылка.ФизическиеЛица"));
    
    КвалификаторыЧисла =
      Новый КвалификаторыЧисла(15, 2, ДопустимыйЗнак.Неотрицательный);
    ОписаниеЧисла = Новый ОписаниеТипов("Число", КвалификаторыЧисла);
    ТЗ.Колонки.Добавить("Сумма", ОписаниеЧисла);
    ТЗ.Колонки.Добавить("СуммаПремии", ОписаниеЧисла);
    
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    ОтборОбъектов = "";
    СписокЭлементов = КомпоновщикНастроек.Настройки.Отбор.Элементы;
    Для Каждого Элемент из СписокЭлементов Цикл
        Если Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ОбъектВыполнения") Тогда
            ОтборОбъектов = Элемент.ПравоеЗначение;
            Прервать;
        КонецЕсли;
    КонецЦикла;
    МассивОбъектов = СтрРазделить(СтрЗаменить(ОтборОбъектов," ",""), ";", Ложь);
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        //распарсим способ отражения расходов
        СпособОтраженияЗарплатыВБухучете = СокрЛП(ВыборкаДетальныеЗаписи.СпособОтраженияЗарплатыВБухучете);
        Счет = Лев(СпособОтраженияЗарплатыВБухучете, 2);
        Если Счет = "26" Тогда
            ОбъектВыполненияКод = "АУП";
            СтатьяЗатрат = "Зарплата";
        ИначеЕсли Счет = "25" Тогда
            ОбъектВыполненияКод = "ИТР";
            СтатьяЗатрат = "Зарплата";
        ИначеЕсли Счет = "20" Тогда
            ОбъектВыполненияКод = Сред(СпособОтраженияЗарплатыВБухучете, 7, 4);
            СтатьяЗатрат = ПолучитьСтатьюЗатратПоКоду(Прав(СпособОтраженияЗарплатыВБухучете, 3));
        Иначе                                        
            ОбъектВыполненияТаблица = "";
            СтатьяЗатрат = "";
        КонецЕсли;
        
        Если МассивОбъектов.Количество() > 0 Тогда
            НайденныйЭлеменМассива = МассивОбъектов.Найти(ОбъектВыполненияКод);
            Если НайденныйЭлеменМассива = Неопределено Тогда
                Продолжить;
            КонецЕсли;    
        КонецЕсли;
        
        ОбъектВыполнения = Справочники.ОбъектыВыполнения.НайтиПоКоду(ОбъектВыполненияКод);
        
        НоваяСтрокаТЗ = ТЗ.Добавить();
        НоваяСтрокаТЗ.ОбъектВыполнения = ОбъектВыполнения;
        НоваяСтрокаТЗ.СтатьяЗатрат = СтатьяЗатрат;
        НоваяСтрокаТЗ.ФизическоеЛицо = ВыборкаДетальныеЗаписи.ФизическоеЛицо;
        НоваяСтрокаТЗ.Сумма = ВыборкаДетальныеЗаписи.Сумма;
    КонецЦикла;
    
    //Связь между таблицей значений и именами в СКД
    ВнешниеНаборыДанных = Новый Структура;
    ВнешниеНаборыДанных.Вставить("ЗарплатаПоОбъектам", ТЗ);
    
    //Макет компоновки
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(ЭтотОбъект.СхемаКомпоновкиДанных, ЭтотОбъект.КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
    
    //Компоновка данных
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);
    
    //Вывод результата
    ДокументРезультат.Очистить();
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);    
    
КонецПроцедуры
6 егаис
 
12.04.17
15:40
все ,разобрался
            КомпоновщикНастроек.Настройки.Отбор.Элементы.Удалить(Элемент);
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший