Skip to content

Instantly share code, notes, and snippets.

@b4tman
Last active March 18, 2020 07:25
Show Gist options
  • Save b4tman/ba68a64247c539a9c78a304c7d626747 to your computer and use it in GitHub Desktop.
Save b4tman/ba68a64247c539a9c78a304c7d626747 to your computer and use it in GitHub Desktop.
1С, произвольное ДеревоЗначений или ТаблицаЗначений в ТабличныйДокумент через СКД
#Область КоллекцияВТабДок
Функция ДеревоТаблица_ВТабДок(ДанныеОбъекта, Заголовок="", ПоляИтога="")
Если Тип("ДеревоЗначений") = ТипЗнч(ДанныеОбъекта) Тогда
ЗаполнитьИД_Дерева_ПолучитьНомер(ДанныеОбъекта);
ИначеЕсли Тип("ТаблицаЗначений") = ТипЗнч(ДанныеОбъекта) Тогда
;// всё норм
Иначе
ВызватьИсключение "Неизвестный тип объекта";
КонецЕсли;
ТабДокумент = Новый ТабличныйДокумент;
ИсточникиДанных = Новый Структура("Данные", ДанныеОбъекта);
СхемаКомпоновки = ПолучитьСхемуКомпоновкиПоКоллекции(ДанныеОбъекта,,,, ПоляИтога);
Настройки = СхемаКомпоновки.НастройкиПоУмолчанию;
Если НЕ ПустаяСтрока(Заголовок) Тогда
Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("Заголовок", Заголовок);
КонецЕсли;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, СхемаКомпоновки.НастройкиПоУмолчанию);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ИсточникиДанных);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДокумент);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Возврат ТабДокумент;
КонецФункции
Функция ЗаполнитьИД_Дерева_ПолучитьНомер(ЭлементДерева, НачальныйНомер=1, РодительИД=0)
Если Тип("ДеревоЗначений") = ТипЗнч(ЭлементДерева) Тогда
Дерево = ЭлементДерева;
Дерево.Колонки.Добавить("ИД", Новый ОписаниеТипов("Число"));
Дерево.Колонки.Добавить("РодительИД", Новый ОписаниеТипов("Число"));
КонецЕсли;
Сч = НачальныйНомер;
Для Каждого ТекСтр Из ЭлементДерева.Строки Цикл
ТекСтр.РодительИД = РодительИД;
ТекСтр.ИД = Сч;
Сч = 1 + Сч;
Сч = ЗаполнитьИД_Дерева_ПолучитьНомер(ТекСтр, Сч, ТекСтр.ИД);
КонецЦикла;
Возврат Сч;
КонецФункции
Функция ПолучитьСхемуКомпоновкиПоКоллекции(ДанныеОбъекта, ВыбранныеПоляОбъекта = Неопределено, ПолеИД = "ИД", ПолеРодительИД = "РодительИД", ПоляИтога="")
ЭтоДерево = ( Тип("ДеревоЗначений") = ТипЗнч(ДанныеОбъекта) );
Если ВыбранныеПоляОбъекта = Неопределено Тогда
ВыбранныеПоляОбъекта = Новый Массив;
КонецЕсли;
ЗаполнитьВыбранныеПоля = НЕ ВыбранныеПоляОбъекта.Количество();
СхемаКомпоновки = Новый СхемаКомпоновкиДанных;
НастройкиКомпоновки = СхемаКомпоновки.НастройкиПоУмолчанию;
ИсточникДанных = СхемаКомпоновки.ИсточникиДанных.Добавить();
ИсточникДанных.Имя = "ИсточникДанных";
ИсточникДанных.ТипИсточникаДанных = "Local";
НаборДанных = СхемаКомпоновки.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
НаборДанных.ИмяОбъекта = "Данные";
НаборДанных.Имя = "НаборДанных";
НаборДанных.ИсточникДанных = "ИсточникДанных";
Для Каждого ТекКолонка Из ДанныеОбъекта.Колонки Цикл
ИмяПоля = ТекКолонка.Имя;
ЗаголовокПоля = ТекКолонка.Заголовок;
ПолеНабора = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеНабора.Заголовок = ЗаголовокПоля;
ПолеНабора.Поле = ИмяПоля;
ПолеНабора.ТипЗначения = ТекКолонка.ТипЗначения;
Если ЗаполнитьВыбранныеПоля И НЕ (ИмяПоля = ПолеИД ИЛИ ИмяПоля = ПолеРодительИД)Тогда
ВыбранныеПоляОбъекта.Добавить(Новый Структура("Имя, Заголовок", ИмяПоля, ЗаголовокПоля));
КонецЕсли;
КонецЦикла;
Если ЭтоДерево Тогда
СвязьНабора = СхемаКомпоновки.СвязиНаборовДанных.Добавить();
СвязьНабора.НаборДанныхИсточник = "НаборДанных";
СвязьНабора.НаборДанныхПриемник = "НаборДанных";
СвязьНабора.ВыражениеИсточник = ПолеИД;
СвязьНабора.ВыражениеПриемник = ПолеРодительИд;
СвязьНабора.НачальноеВыражение = "0";
КонецЕсли;
Если Не ПустаяСтрока(ПоляИтога) Тогда
СписокРесурсов = СтрРазделить(ПоляИтога, ",");
Для Каждого Ресурс Из СписокРесурсов Цикл
ПолеИтога = СхемаКомпоновки.ПоляИтога.Добавить();
ПолеИтога.ПутьКДанным = Ресурс;
ЭтоЧисло = ДанныеОбъекта.Колонки[Ресурс].ТипЗначения.СодержитТип(Тип("Число"));
АгрегатнаяФункция = ?(ЭтоЧисло, "Сумма", "Количество");
ПолеИтога.Выражение = СтрШаблон("%1(%2)", АгрегатнаяФункция, Ресурс);
КонецЦикла;
КонецЕсли;
ВыбранныеПоля = НастройкиКомпоновки.Выбор.Элементы;
Для Каждого ТекПоле Из ВыбранныеПоляОбъекта Цикл
ПолеОтчет = ВыбранныеПоля.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ПолеОтчет.Поле = Новый ПолеКомпоновкиДанных(ТекПоле.Имя);
ПолеОтчет.Заголовок = ТекПоле.Заголовок;
КонецЦикла;
СтруктураГруппировки = НастройкиКомпоновки.Структура;
ЭлементГруппировки = СтруктураГруппировки.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ЭлементГруппировки.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
Возврат СхемаКомпоновки;
КонецФункции
// КоллекцияВТабДок
#КонецОбласти
@b4tman
Copy link
Author

b4tman commented Mar 13, 2020

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment