вторник, 31 мая 2016 г.

Дополнения периода используя СКД. При программном выводе в дерево значений. Что все-таки следует учесть!...

Какие следует учитывать нюансы при реализации такого рода задач....

Здесь я на личном уже не одноразовом примере, хочу лично для себя сделать важную пометку, чтобы в очередной раз не наступать на одну и ту же ошибку... Забегая немного наперед хочу подчеркунть важность моментов, это обязательность флага "Роль - Измерение" в настройке СКД на закладке (наборы данных). И особо, что не маловажно при програмном разборе дерева значений брать во внимание дату периода из основной группировки, где и делается дополнение периодами.

А теперь все по порядку. Есть очень небольшой запрос и результатом его должно выйти дерево значений с периодами по дням.

ВЫБРАТЬ
&КодСклада КАК Wareh_Code,
ТоварыНаСкладахОстаткиИОбороты.Номенклатура.ерпКодПоставщика КАК Code,
0 КАК LOT_ID,
ТоварыНаСкладахОстаткиИОбороты.ПериодДень КАК Date,
СУММА(ТоварыНаСкладахОстаткиИОбороты.ВНаличииКонечныйОстаток) КАК Stock,
&КодУзла КАК CUST_ID,
СУММА(ТоварыНаСкладахОстаткиИОбороты.ВНаличииНачальныйОстаток) КАК ВНаличииНачальныйОстаток,
СУММА(ТоварыНаСкладахОстаткиИОбороты.ВНаличииПриход) КАК ВНаличииПриход,
СУММА(ТоварыНаСкладахОстаткиИОбороты.ВНаличииРасход) КАК ВНаличииРасход
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(
,
,
Авто,
,
Номенклатура В ИЕРАРХИИ (&ГруппаТовара)
И Склад = &Склад) КАК ТоварыНаСкладахОстаткиИОбороты

СГРУППИРОВАТЬ ПО
ТоварыНаСкладахОстаткиИОбороты.Номенклатура.ерпКодПоставщика,
ТоварыНаСкладахОстаткиИОбороты.ПериодДень


Дальше пойдут настройки СКД. В данном случае для нас крайне важна роль Измерение, поскольку группировка происходит из расчетным полем и самого измерения нет в отчете.


 Дополнения периода и группировка по деталям.

Возвращаюсь к коду и программному выводу.

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

Настройки = КомпоновщикНастроек.ПолучитьНастройки();

//устанавливаем параметры
УстановитьЗначенияОбщихПараметров(Настройки);

// Отключение вывода общих итогов
Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("ГоризонтальноеРасположениеОбщихИтогов", РасположениеИтоговКомпоновкиДанных.Нет);
Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("ВертикальноеРасположениеОбщихИтогов", РасположениеИтоговКомпоновкиДанных.Нет);

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

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

Если ВидОтчета.ИмяОтчета = "ТоварныеОстатки" Тогда
Результат = Новый ДеревоЗначений;
Иначе
Результат = Новый ТаблицаЗначений;
КонецЕсли;

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

ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);

Если ВидОтчета.ИмяОтчета = "ТоварныеОстатки" Тогда

ВидОтчета.ТаблицаВывода = ЗаполнитьТаблицуОстатковПоПериодам(Результат);

КонецЕсли;


ГДЕ, ЗаполнитьТаблицуОстатковПоПериодам(Результат)

Функция ЗаполнитьТаблицуОстатковПоПериодам(ДеревоОстаткиПоПериодам)

Таблица = Новый ТаблицаЗначений;

Для Каждого Колонка Из ДеревоОстаткиПоПериодам.Колонки Цикл

Таблица.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения);

КонецЦикла;

Для Каждого СтрокиГруппировкиПериоды Из ДеревоОстаткиПоПериодам.Строки Цикл //->группировка ""

Для Каждого СтрокиДетали Из СтрокиГруппировкиПериоды.Строки Цикл

СтрокаТаблицы = Таблица.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаТаблицы, СтрокиДетали);
СтрокаТаблицы.Date = СтрокиГруппировкиПериоды.Date; //важно!!! Дата берется из группировки дополнений, а не строк деталей. По строкам детали отображается дата движений

КонецЦикла;

КонецЦикла; //<- Номенклатура ""

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

Вот как выглядит результат дерева первого уровня. Все красиво идет по дням, а как только посмотреть строку с периодом где не было движений по товару, то в деталях даты будет отражен период расчета остатка. Так что это важно для реализации задач подобного рода.

Первый уровень, отображается весь период.

А вот с деталями проблема, надо учитывать этот факт и брать период с верхнего уровня!!!


А так выводится в табличный документ непосредственно с помощью простого консоли СКД, без какого либо программмного кода указано выше.












Комментариев нет:

Отправить комментарий