Версия для печати темы (https://pro1c.org.ua/index.php?s=159636427ff3df240320ae6697a34321&showtopic=62824)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Создание отчета на СКД програмно

Автор: Sirius83 11.11.20, 12:00

Платформа 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 11.11.20, 12:29

Установка параметров - тупо и неэффективно.
а вооще-то https://pro1c.org.ua/redirect.php?https://infostart.ru/1c/articles/1179039/

Автор: Moloko 11.11.20, 12:31

Sirius83 @ Сегодня, 13:00 * ,
У вас есть два пути: легкий и трудный.
Первый - это воспользоваться кнопочкой "сохранение настройки",
второй - это создание отчета через Построитель, на базе Универсального Отчета.
Посмотрите по конфигурации, большинство регистровых отчетов работают именно так.

Автор: Vofka 11.11.20, 12:37

Sirius83, если нажать на настройки в отчете, там и параметры и отбор заполнены как надо?

Автор: Sirius83 11.11.20, 16:37

Vofka @ Сегодня, 13:37 * ,

Цитата(Vofka @ 11.11.20, 13:37) *
если нажать на настройки в отчете, там и параметры и отбор заполнены как надо?

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



Moloko @ Сегодня, 13:31 * ,

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

Так настройки сохраненные

Автор: Vofka 11.11.20, 17:29

Sirius83, выглядит так, будто элементы отбора не совпадают, хотя по названию одинаковые. Я бы попробовал выключить отборы, оставить только Параметры. Если что-то покажет, добавлять оторы и смотреть где пропадают данные.

Автор: Sirius83 12.11.20, 15:08

Vofka @ Вчера, 18:29 * ,
Я пробовал выключить отборы и оставить только Параметры. Тоже самое, таблица не заполняется.

Автор: sava1 12.11.20, 15:19

Цитата(Sirius83 @ 11.11.20, 12:00) *
ТаблицаРезультат = Новый ТаблицаЗначений;


а здесь что-то есть ?

Автор: Sirius83 12.11.20, 15:49

sava1 @ Сегодня, 16:19 * ,

Автор: sava1 12.11.20, 17:16

не так - ТаблицаЗначений после компоновки

Автор: Sirius83 16.11.20, 10:26

sava1 @ Вчера, 18:16 * ,
Тоже самое:

Автор: sava1 16.11.20, 11:12


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

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

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

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

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

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

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

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua