Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Создание отчета на СКД програмно
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.3
Sirius83
Платформа 1С:Підприємство 8.3 (8.3.10.2252)
"Управление производственным предприятием для Украины", редакция 1.3 (1.3.53.1)
Доброго времени! Есть некий отчет по взвешиванию продукции при ручном формировании с заданными параметрами все хорошо формирует

есть задача формировать отчет программно, собственно функция формирования отчета:
необходимо зарегистрироваться для просмотра ссылки
Функция СформироватьОтчетПрограммно(Склад)
    Таб = Новый ТабличныйДокумент;    
    
    ТекОтчет = Отчеты.Отчет_РегистрацияВзвешиваний.Создать();
    СКД = ТекОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    Настройки = СКД.НастройкиПоУмолчанию;
    НачДата = НачалоДня(ТекущаяДата()) - 1;
    НачДата = Дата(Год(НачДата),Месяц(НачДата),День(НачДата),20,0,0);
    НачальнаяДата = СКД.Параметры.Найти("НачалоПериода");
    Если НачальнаяДата = Неопределено Тогда
        
        ПараметрПериод = СКД.Параметры.Добавить();
        ПараметрПериод.Имя = "НачалоПериода";
        ПараметрПериод.Заголовок = "НачалоПериода";
        ПараметрПериод.ТипЗначения = Новый ОписаниеТипов("Дата");
        ПараметрПериод.ОграничениеИспользования = Ложь;
        ПараметрПериод.Значение = НачДата;
        ПараметрПериод.Использование =ИспользованиеПараметраКомпоновкиданных.Всегда;
        ПараметрПериод.ВключатьВДоступныеПоля = Истина;    
        НачальнаяДата = ПараметрПериод;
    КонецЕсли;
        
    КонечнаяДата = СКД.Параметры.Найти("КонецПериода");
    
    Если КонечнаяДата = Неопределено Тогда
        
        ПараметрПериод = СКД.Параметры.Добавить();
        ПараметрПериод.Имя = "КонецПериода";
        ПараметрПериод.Заголовок = "КонецПериода";
        ПараметрПериод.ТипЗначения = Новый ОписаниеТипов("Дата");
        ПараметрПериод.ОграничениеИспользования = Ложь;
        ПараметрПериод.Значение = НачДата;
        ПараметрПериод.Использование =ИспользованиеПараметраКомпоновкиданных.Всегда;
        ПараметрПериод.ВключатьВДоступныеПоля = Истина;    
        КонечнаяДата = ПараметрПериод;
        
    КонецЕсли;
    
    
    ПараметрКомпоновки = Новый ПараметрКомпоновкиДанных("НачалоПериода");
    ПараметрСКД = ТекОтчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(ПараметрКомпоновки);
    ПараметрСКД.Значение = НачДата;
    ПараметрСКД.Использование = Истина;    
    
    КонДата = Дата(Год(ТекущаяДата()),Месяц(текущаяДата()),День(ТекущаяДата()),20,0,0);
    
    ПараметрКомпоновки = Новый ПараметрКомпоновкиДанных("КонецПериода");
    ПараметрСКД = ТекОтчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(ПараметрКомпоновки);
    ПараметрСКД.Значение = КонДата;
    ПараметрСКД.Использование = Истина;        //Помещаем в переменную данные о расшифровке данных
        
    
    ПараметрДанных= ТекОтчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("НачалоПериода");
    ПараметрДанных.Значение = НачДата;
        
    ПараметрДанных.Использование=Истина;
    
    
    ПараметрДанных= ТекОтчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("КонецПериода");
    ПараметрДанных.Значение = КонДата;
    
    ПараметрДанных.Использование=Истина;
    
        
    МассивН = Новый Массив;
    МассивН.Добавить(Справочники.Номенклатура.НайтиПоКоду("00000001198"));
    МассивН.Добавить(Справочники.Номенклатура.НайтиПоКоду("00000001197"));
    МассивН.Добавить(Справочники.Номенклатура.НайтиПоКоду("00000001200"));
    СЗ = Новый СписокЗначений;
    СЗ.ЗагрузитьЗначения(МассивН);
    
    тОтчет = ТекОтчет;
    
    //НастройкиКД = ТекОтчет.КомпоновщикНастроек.ПолучитьНастройки();
    НастройкиКД = Настройки;
    ВидВзвешивания = тОтчет.КомпоновщикНастроек.Настройки.Отбор.ДоступныеПоляОтбора.Элементы.Найти("ВидВзвешивания"); //поле отбора присутствует в СКД
    
    НовыйОтбор = НастройкиКД.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    НовыйОтбор.ЛевоеЗначение = ВидВзвешивания.Поле;
    НовыйОтбор.ПравоеЗначение = Перечисления.ИнтекоВидыВзвешивания.Отгрузка;
    НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    НовыйОтбор.Использование = Истина;
    
    
    Отправитель = тОтчет.КомпоновщикНастроек.Настройки.Отбор.ДоступныеПоляОтбора.Элементы.Найти("Отправитель"); //поле отбора присутствует в СКД
    
    НовыйОтбор = НастройкиКД.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    НовыйОтбор.ЛевоеЗначение = Отправитель.Поле;
    НовыйОтбор.ПравоеЗначение = Склад;
    НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    НовыйОтбор.Использование = Истина;
    
    
    Номенклатура = тОтчет.КомпоновщикНастроек.Настройки.Отбор.ДоступныеПоляОтбора.Элементы.Найти("Номенклатура"); //поле отбора присутствует в СКД
    
    НовыйОтбор = НастройкиКД.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    НовыйОтбор.ЛевоеЗначение = Номенклатура.Поле;
    НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии;
    НовыйОтбор.ПравоеЗначение = СЗ;
    НовыйОтбор.Использование = Истина;
    
    тОтчет.КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиКД);
    //
    
    ///////////////////////////////////////////////////////////////////////////////////////////////////
        ПараметрКомпоновки = Новый ПараметрКомпоновкиДанных("НачалоПериода");
    ПараметрСКД = ТекОтчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(ПараметрКомпоновки);
    ПараметрСКД.Значение = НачДата;
    ПараметрСКД.Использование = Истина;    
    
    КонДата = Дата(Год(ТекущаяДата()),Месяц(текущаяДата()),День(ТекущаяДата()),20,0,0);
    
    ПараметрКомпоновки = Новый ПараметрКомпоновкиДанных("КонецПериода");
    ПараметрСКД = ТекОтчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(ПараметрКомпоновки);
    ПараметрСКД.Значение = КонДата;
    ПараметрСКД.Использование = Истина;        //Помещаем в переменную данные о расшифровке данных
    
    
    ПараметрДанных= ТекОтчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("НачалоПериода");
    ПараметрДанных.Значение = НачДата;
    
    ПараметрДанных.Использование=Истина;
    
    ПараметрДанных= ТекОтчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("КонецПериода");
    ПараметрДанных.Значение = КонДата;

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

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

    ВОзврат Таб;    
    
КонецФункции

в результате получаем отчет, но без данных табличных частей.

Ткните пожалуйста носом, где недочет.
sava1
Установка параметров - тупо и неэффективно.
а вооще-то необходимо зарегистрироваться для просмотра ссылки
Moloko
Sirius83 @ Сегодня, 13:00 необходимо зарегистрироваться для просмотра ссылки ,
У вас есть два пути: легкий и трудный.
Первый - это воспользоваться кнопочкой "сохранение настройки",
второй - это создание отчета через Построитель, на базе Универсального Отчета.
Посмотрите по конфигурации, большинство регистровых отчетов работают именно так.
Vofka
Sirius83, если нажать на настройки в отчете, там и параметры и отбор заполнены как надо?
Sirius83
Vofka @ Сегодня, 13:37 необходимо зарегистрироваться для просмотра ссылки ,
Цитата(Vofka @ 11.11.20, 13:37) необходимо зарегистрироваться для просмотра ссылки
если нажать на настройки в отчете, там и параметры и отбор заполнены как надо?

Да с настройками все ок:



Moloko @ Сегодня, 13:31 необходимо зарегистрироваться для просмотра ссылки ,

Цитата(Moloko @ 11.11.20, 13:31) необходимо зарегистрироваться для просмотра ссылки
Первый - это воспользоваться кнопочкой "сохранение настройки",

Так настройки сохраненные
Vofka
Sirius83, выглядит так, будто элементы отбора не совпадают, хотя по названию одинаковые. Я бы попробовал выключить отборы, оставить только Параметры. Если что-то покажет, добавлять оторы и смотреть где пропадают данные.
Sirius83
Vofka @ Вчера, 18:29 необходимо зарегистрироваться для просмотра ссылки ,
Я пробовал выключить отборы и оставить только Параметры. Тоже самое, таблица не заполняется.
sava1
Цитата(Sirius83 @ 11.11.20, 12:00) необходимо зарегистрироваться для просмотра ссылки
ТаблицаРезультат = Новый ТаблицаЗначений;


а здесь что-то есть ?
Sirius83
sava1 @ Сегодня, 16:19 необходимо зарегистрироваться для просмотра ссылки ,
sava1
не так - ТаблицаЗначений после компоновки
Sirius83
sava1 @ Вчера, 18:16 необходимо зарегистрироваться для просмотра ссылки ,
Тоже самое:
sava1

вот полностью рабочий код -
измените свои Параметры и ттРезультат - Табл.Документ

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

    НастройкиКомпоновщика = Компоновщик.Настройки;     

    НастройкиКомпоновщика.ПараметрыДанных.УстановитьЗначениеПараметра("Период",Период);
        
        
    Компоновщик.ЗагрузитьНастройки(НастройкиКомпоновщика);
        

        КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
        МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД, НастройкиКомпоновщика,,,Тип("ГенераторМакетаКомпоновкиДанных"));

        ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
        ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

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