Автор: 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)
ТаблицаРезультат = Новый ТаблицаЗначений;
а здесь что-то есть ?
Автор: sava1 12.11.20, 17:16
не так - ТаблицаЗначений после компоновки
Автор: Sirius83 16.11.20, 10:26
sava1 @ Вчера, 18:16
,
Тоже самое:
Автор: sava1 16.11.20, 11:12
вот полностью рабочий код -
измените свои Параметры и ттРезультат - Табл.Документ
СКД = ПолучитьМакет("СКД_Заказы");
Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СКД));
Компоновщик.ЗагрузитьНастройки(СКД.НастройкиПоУмолчанию);
НастройкиКомпоновщика = Компоновщик.Настройки;
НастройкиКомпоновщика.ПараметрыДанных.УстановитьЗначениеПараметра("Период",Период);
Компоновщик.ЗагрузитьНастройки(НастройкиКомпоновщика);
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД, НастройкиКомпоновщика,,,Тип("ГенераторМакетаКомпоновкиДанных"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ттРезультат = ЭлементыФормы.Результат;
ттРезультат.Очистить();
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ттРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);