Какие следует учитывать нюансы при реализации такого рода задач....
Здесь я на личном уже не одноразовом примере, хочу лично для себя сделать важную пометку, чтобы в очередной раз не наступать на одну и ту же ошибку... Забегая немного наперед хочу подчеркунть важность моментов, это обязательность флага "Роль - Измерение" в настройке СКД на закладке (наборы данных). И особо, что не маловажно при програмном разборе дерева значений брать во внимание дату периода из основной группировки, где и делается дополнение периодами.
А теперь все по порядку. Есть очень небольшой запрос и результатом его должно выйти дерево значений с периодами по дням.
ВЫБРАТЬ
&КодСклада КАК Wareh_Code,
ТоварыНаСкладахОстаткиИОбороты.Номенклатура.ерпКодПоставщика КАК Code,
0 КАК LOT_ID,
ТоварыНаСкладахОстаткиИОбороты.ПериодДень КАК Date,
СУММА(ТоварыНаСкладахОстаткиИОбороты.ВНаличииКонечныйОстаток) КАК Stock,
&КодУзла КАК CUST_ID,
СУММА(ТоварыНаСкладахОстаткиИОбороты.ВНаличииНачальныйОстаток) КАК ВНаличииНачальныйОстаток,
СУММА(ТоварыНаСкладахОстаткиИОбороты.ВНаличииПриход) КАК ВНаличииПриход,
СУММА(ТоварыНаСкладахОстаткиИОбороты.ВНаличииРасход) КАК ВНаличииРасход
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(
,
,
Авто,
,
Номенклатура В ИЕРАРХИИ (&ГруппаТовара)
И Склад = &Склад) КАК ТоварыНаСкладахОстаткиИОбороты
СГРУППИРОВАТЬ ПО
ТоварыНаСкладахОстаткиИОбороты.Номенклатура.ерпКодПоставщика,
ТоварыНаСкладахОстаткиИОбороты.ПериодДень
Дальше пойдут настройки СКД. В данном случае для нас крайне важна роль Измерение, поскольку группировка происходит из расчетным полем и самого измерения нет в отчете.
Дополнения периода и группировка по деталям.
Возвращаюсь к коду и программному выводу.
СхемаКомпоновки = ПолучитьМакет(ВидОтчета.ИмяОтчета);
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
АдресСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновки, Новый УникальныйИдентификатор);
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновки.НастройкиПоУмолчанию);
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
//устанавливаем параметры
УстановитьЗначенияОбщихПараметров(Настройки);
// Отключение вывода общих итогов
Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("ГоризонтальноеРасположениеОбщихИтогов", РасположениеИтоговКомпоновкиДанных.Нет);
Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("ВертикальноеРасположениеОбщихИтогов", РасположениеИтоговКомпоновкиДанных.Нет);
// Компоновка макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
// Инициализация процессора компоновки
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(Макет);
Если ВидОтчета.ИмяОтчета = "ТоварныеОстатки" Тогда
Результат = Новый ДеревоЗначений;
Иначе
Результат = Новый ТаблицаЗначений;
КонецЕсли;
// Получение результата
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
Если ВидОтчета.ИмяОтчета = "ТоварныеОстатки" Тогда
ВидОтчета.ТаблицаВывода = ЗаполнитьТаблицуОстатковПоПериодам(Результат);
КонецЕсли;
ГДЕ, ЗаполнитьТаблицуОстатковПоПериодам(Результат)
Функция ЗаполнитьТаблицуОстатковПоПериодам(ДеревоОстаткиПоПериодам)
Таблица = Новый ТаблицаЗначений;
Для Каждого Колонка Из ДеревоОстаткиПоПериодам.Колонки Цикл
Таблица.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения);
КонецЦикла;
Для Каждого СтрокиГруппировкиПериоды Из ДеревоОстаткиПоПериодам.Строки Цикл //->группировка ""
Для Каждого СтрокиДетали Из СтрокиГруппировкиПериоды.Строки Цикл
СтрокаТаблицы = Таблица.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаТаблицы, СтрокиДетали);
СтрокаТаблицы.Date = СтрокиГруппировкиПериоды.Date; //важно!!! Дата берется из группировки дополнений, а не строк деталей. По строкам детали отображается дата движений
КонецЦикла;
КонецЦикла; //<- Номенклатура ""
Возврат Таблица;
КонецФункции
Вот как выглядит результат дерева первого уровня. Все красиво идет по дням, а как только посмотреть строку с периодом где не было движений по товару, то в деталях даты будет отражен период расчета остатка. Так что это важно для реализации задач подобного рода.
Первый уровень, отображается весь период.
А вот с деталями проблема, надо учитывать этот факт и брать период с верхнего уровня!!!
А так выводится в табличный документ непосредственно с помощью простого консоли СКД, без какого либо программмного кода указано выше.
Здесь я на личном уже не одноразовом примере, хочу лично для себя сделать важную пометку, чтобы в очередной раз не наступать на одну и ту же ошибку... Забегая немного наперед хочу подчеркунть важность моментов, это обязательность флага "Роль - Измерение" в настройке СКД на закладке (наборы данных). И особо, что не маловажно при програмном разборе дерева значений брать во внимание дату периода из основной группировки, где и делается дополнение периодами.
А теперь все по порядку. Есть очень небольшой запрос и результатом его должно выйти дерево значений с периодами по дням.
ВЫБРАТЬ
&КодСклада КАК Wareh_Code,
ТоварыНаСкладахОстаткиИОбороты.Номенклатура.ерпКодПоставщика КАК Code,
0 КАК LOT_ID,
ТоварыНаСкладахОстаткиИОбороты.ПериодДень КАК Date,
СУММА(ТоварыНаСкладахОстаткиИОбороты.ВНаличииКонечныйОстаток) КАК Stock,
&КодУзла КАК CUST_ID,
СУММА(ТоварыНаСкладахОстаткиИОбороты.ВНаличииНачальныйОстаток) КАК ВНаличииНачальныйОстаток,
СУММА(ТоварыНаСкладахОстаткиИОбороты.ВНаличииПриход) КАК ВНаличииПриход,
СУММА(ТоварыНаСкладахОстаткиИОбороты.ВНаличииРасход) КАК ВНаличииРасход
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(
,
,
Авто,
,
Номенклатура В ИЕРАРХИИ (&ГруппаТовара)
И Склад = &Склад) КАК ТоварыНаСкладахОстаткиИОбороты
СГРУППИРОВАТЬ ПО
ТоварыНаСкладахОстаткиИОбороты.Номенклатура.ерпКодПоставщика,
ТоварыНаСкладахОстаткиИОбороты.ПериодДень
Дальше пойдут настройки СКД. В данном случае для нас крайне важна роль Измерение, поскольку группировка происходит из расчетным полем и самого измерения нет в отчете.
Дополнения периода и группировка по деталям.
Возвращаюсь к коду и программному выводу.
СхемаКомпоновки = ПолучитьМакет(ВидОтчета.ИмяОтчета);
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
АдресСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновки, Новый УникальныйИдентификатор);
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновки.НастройкиПоУмолчанию);
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
//устанавливаем параметры
УстановитьЗначенияОбщихПараметров(Настройки);
// Отключение вывода общих итогов
Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("ГоризонтальноеРасположениеОбщихИтогов", РасположениеИтоговКомпоновкиДанных.Нет);
Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("ВертикальноеРасположениеОбщихИтогов", РасположениеИтоговКомпоновкиДанных.Нет);
// Компоновка макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
// Инициализация процессора компоновки
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(Макет);
Если ВидОтчета.ИмяОтчета = "ТоварныеОстатки" Тогда
Результат = Новый ДеревоЗначений;
Иначе
Результат = Новый ТаблицаЗначений;
КонецЕсли;
// Получение результата
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
Если ВидОтчета.ИмяОтчета = "ТоварныеОстатки" Тогда
ВидОтчета.ТаблицаВывода = ЗаполнитьТаблицуОстатковПоПериодам(Результат);
КонецЕсли;
ГДЕ, ЗаполнитьТаблицуОстатковПоПериодам(Результат)
Функция ЗаполнитьТаблицуОстатковПоПериодам(ДеревоОстаткиПоПериодам)
Таблица = Новый ТаблицаЗначений;
Для Каждого Колонка Из ДеревоОстаткиПоПериодам.Колонки Цикл
Таблица.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения);
КонецЦикла;
Для Каждого СтрокиГруппировкиПериоды Из ДеревоОстаткиПоПериодам.Строки Цикл //->группировка ""
Для Каждого СтрокиДетали Из СтрокиГруппировкиПериоды.Строки Цикл
СтрокаТаблицы = Таблица.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаТаблицы, СтрокиДетали);
СтрокаТаблицы.Date = СтрокиГруппировкиПериоды.Date; //важно!!! Дата берется из группировки дополнений, а не строк деталей. По строкам детали отображается дата движений
КонецЦикла;
КонецЦикла; //<- Номенклатура ""
Возврат Таблица;
КонецФункции
Вот как выглядит результат дерева первого уровня. Все красиво идет по дням, а как только посмотреть строку с периодом где не было движений по товару, то в деталях даты будет отражен период расчета остатка. Так что это важно для реализации задач подобного рода.
Первый уровень, отображается весь период.
А вот с деталями проблема, надо учитывать этот факт и брать период с верхнего уровня!!!
А так выводится в табличный документ непосредственно с помощью простого консоли СКД, без какого либо программмного кода указано выше.
Комментариев нет:
Отправить комментарий