gifts2017

Программное создание СКД

Опубликовал Сергей Доронин (factor0) в раздел Программирование - Практика программирования

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

Для начала веберем объект метаданных. Дерево метаданных строится из наличия таковых в любой тестовой конфигурации для версии 8.2 и выше (Управляемые формы). Далее строим макет, используя доступные поля объекта. Группировки, таблицы группировок со строками и колонками, ресурсы - настраиваем (как нам удобно) в визуально-интерактивном режиме . Жмем "Сформировать" на вкладке Результат, и вуаля! Изучаем, что да как.

Приложенная в качестве примера обработка формирует отчет с помощью СКД на любой тестовой конфигурации. На форме обработки реализована возможность Drag'n'Drop добавления строк и колонок в таблицах группировки СКД.  

  С помощью обработки реализуются учебные цели: 

1. Создние универсального отчета на СКД
2. Вывод двух таблиц на форму: 1-я должна содержать выбранные поля отчета, 2-я - все остальные доступные поля СКД
3. Вывод на форму трех таблиц: 1-я строки для компановки, 2-я столбцы, 3-я ресурсы - первоначально это пустые таблицы
4. Должен работать Drag'n'Drop для перетаскивания полей указанных в п.2 в поля указанные в п.3
5. Реализация заполнение отчета исходя из п. 3 настроек

СКД = Новый СхемаКомпоновкиДанных; 
    
    // При необходимости можно получить ранее созданный макет СКД
    //ОтчетОбъект  = РеквизитФормыВЗначение("Отчет");
    //СКД = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"); 
    
    // определим источник данных для схемы 
    Источник = СКД.ИсточникиДанных.Добавить();
    Источник.Имя = "ЛокальнаяБаза";
    Источник.СтрокаСоединения = "";
    Источник.ТипИсточникаДанных = "Local"; 
    
    НаборДанных = СКД.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
    НаборДанных.Имя = "Продажи";
    НаборДанных.ИсточникДанных = "ЛокальнаяБаза";
    НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
   

Следует предусмотреть вариант с (жестким) установленным запросом набора данных, когда необходимо программно создавать нужные нам поля группировки, для формирования жесткой структуры отчета:

 

НаборДанных.Запрос = (
	
	"ВЫБРАТЬ
	|	ТоварыНаСкладахОстаткиИОбороты.Регистратор,
	|	ТоварыНаСкладахОстаткиИОбороты.Склад,
	|	ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
	|	ТоварыНаСкладахОстаткиИОбороты.Партия,
	|	ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход КАК Количество,
	|	ТоварыНаСкладахОстаткиИОбороты.СуммаРасход КАК Сумма,
	|	ТоварыНаСкладахОстаткиИОбороты.СуммаРасход / ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход КАК Стоимость
	|ИЗ
	|	РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Регистратор, , ) КАК ТоварыНаСкладахОстаткиИОбороты
	|ГДЕ
	|	ТоварыНаСкладахОстаткиИОбороты.Регистратор ССЫЛКА Документ.РасходнаяТоварнаяНакладная"    
	
	);
	
	// добавим поля
	НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
	
	//Ручное заполнение полей при необходимости (пример, используем для описания полей внешнего источника)
	//ПолеНабораДанных             = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
	//ПолеНабораДанных.Заголовок   = "Номенклатура";
	//ПолеНабораДанных.ПутьКДанным = "Номенклатура";
	//ПолеНабораДанных.Поле        = "Номенклатура";
	//ПолеНабораДанных.ТипЗначения = Тип("СправочникСсылка.Номенклатура");
	
	//ПолеНабораДанных             = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
	//ПолеНабораДанных.Заголовок   = "Количество";
	//ПолеНабораДанных.ПутьКДанным = "Количество";
	//ПолеНабораДанных.Поле        = "Количество";
	//ПолеНабораДанных.ТипЗначения = Тип("Число");
	//
	//ПолеНабораДанных             = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
	//ПолеНабораДанных.Заголовок   = "Стоимость";
	//ПолеНабораДанных.ПутьКДанным = "Стоимость";
	//ПолеНабораДанных.Поле        = "Стоимость";
	//ПолеНабораДанных.ТипЗначения = Тип("Число");
	
	// определим пареметры  
	ПараметрДанных               = СКД.Параметры.Добавить();
	ПараметрДанных.Имя           = "НачалоПериода";
	ПараметрДанных.Использование = ИспользованиеПараметраКомпоновкиДанных.Всегда;
	ПараметрДанных.Заголовок     = "Начало периода";
	ПараметрДанных.ВключатьВДоступныеПоля = Истина;
	
	ПараметрДанных               = СКД.Параметры.Добавить();
	ПараметрДанных.Имя           = "КонецПериода";
	ПараметрДанных.Использование = ИспользованиеПараметраКомпоновкиДанных.Всегда;
	ПараметрДанных.Заголовок     = "Конец периода";
	ПараметрДанных.ВключатьВДоступныеПоля = Истина;
	
	// определим ресурсы, для примера поле "Сумма"
	ПолеРесурса             = СКД.ПоляИтога.Добавить();
	ПолеРесурса.Выражение   = "Сумма(Сумма)";
	ПолеРесурса.ПутьКДанным = "Сумма";
	
	// получим настройки для схемы 
	НастройкиСКД = СКД.НастройкиПоУмолчанию;
	
	//Добавим выбранные поля к нашему отчету (Эти поля будут наследоватся автополем в группировках ниже)
	ВыбранноеПолеНоменклатура           = НастройкиСКД.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
	ВыбранноеПолеНоменклатура.Поле      = Новый ПолеКомпоновкиДанных("Номенклатура");
	ВыбранноеПолеНоменклатура.Заголовок = "Номенклатура";
	
	ВыбранноеПолеКоличество           = НастройкиСКД.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
	ВыбранноеПолеКоличество.Поле      = Новый ПолеКомпоновкиДанных("Количество");
	ВыбранноеПолеКоличество.Заголовок = "Количество";
		
	// добавим поле Сумма в выбранные поля - необходимо для программного добавления этого поля в ресурс
	ВыбранноеПолеСумма           = НастройкиСКД.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
	ВыбранноеПолеСумма.Поле      = Новый ПолеКомпоновкиДанных("Сумма");
	ВыбранноеПолеСумма.Заголовок = "Сумма";
		
	//// определим структуру --->>>
	
	//добавим группировку СКЛАД --
	ГруппировкаПоСкладу     = НастройкиСКД.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
	ГруппировкаПоСкладу.Имя = "Склад";
	
	//созданная группировка по полю "Склад"
	ПолеГруппировкиСклад                = ГруппировкаПоСкладу.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));       
	ПолеГруппировкиСклад.Поле           = Новый ПолеКомпоновкиДанных("Склад");
	ПолеГруппировкиСклад.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
	ПолеГруппировкиСклад.ТипДополнения  = ТипДополненияПериодаКомпоновкиДанных.БезДополнения;
	
	//добавить Автополя в группировке Склад
	ВыбранноеАвтоПоле = ГруппировкаПоСкладу.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));     
	
	//Добавим группировку детальные записи к группировке склад
	ДетальныеЗаписиГруппировкиСклад = ГруппировкаПоСкладу.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
	АвтоПолеГруппировки = ДетальныеЗаписиГруппировкиСклад.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
	АвтоПолеГруппировки.Использование = Истина;
	
	// таблица группировки (создание таблицы группировки с автополем выбора)--
	ТаблицаГруппировкаОтчета = НастройкиСКД.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных"));
	АвтоПолеГруппировки = ТаблицаГруппировкаОтчета.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
	АвтоПолеГруппировки.Использование = Истина;
	
	// Создадим строки таблицы группировки --
	
	//// Пример создания строки таблицы группировки СКД (строка группировки детальные записи с автополем)
	//ГруппировкаСтроки = ТаблицаГруппировкаОтчета.Строки.Добавить();    
	//АвтоПолеГруппировкаДетальныеЗаписи = ГруппировкаСтроки.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); 
	//АвтоПолеГруппировкаДетальныеЗаписи.Использование = Истина;
	
	//// пример заполнения выбранных полей строки группировки детальные записи
	//ПолеГруппировкаДетальныеЗаписи = ГруппировкаСтроки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
	//ПолеГруппировкаДетальныеЗаписи.Поле = Новый ПолеКомпоновкиДанных("Склад");
	//ПолеГруппировкаДетальныеЗаписи.Использование = Истина; <-- конец примера
	
	// создадим строку таблицы группировки "Номенклатура"
	ГруппировкаСтроки = ТаблицаГруппировкаОтчета.Строки.Добавить(); 	
	ГруппировкаСтроки.Использование = Истина;
	
	// определим поля группировки в строке таблицы группировки 
	ПолеГруппировки                = ГруппировкаСтроки.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));      
	ПолеГруппировки.Поле           = Новый ПолеКомпоновкиДанных("Номенклатура");
	ПолеГруппировки.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
	ПолеГруппировки.ТипДополнения  = ТипДополненияПериодаКомпоновкиДанных.БезДополнения;
	
	// добавим автополе в выбранные поля строки "Номенклатура"
	АвтоПолеГруппировкаДетальныеЗаписи = ГруппировкаСтроки.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); 
	АвтоПолеГруппировкаДетальныеЗаписи.Использование = Истина;
	
	// колонки таблицы группировки (Создание детальных записей)
	ГруппировкаКолонки = ТаблицаГруппировкаОтчета.Колонки.Добавить();
	ГруппировкаКолонки.Имя = "<Детальные записи>";
	АвтоПолеГруппировкаДетальныеЗаписи = ГруппировкаКолонки.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
	АвтоПолеГруппировкаДетальныеЗаписи.Использование = Истина;


Полный пример и комментарии к нему в приложенном внешнем отчете примере.

Скачать файлы

Наименование Файл Версия Размер
ОтчетПримерУниверсальный 93
.erf 25,54Kb
24.06.15
93
.erf 25,54Kb Скачать
ОтчетПримерСУстановленнымЗапросом 49
.erf 15,27Kb
22.06.15
49
.erf 15,27Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Павел Жихарев (palsergeich) 02.04.15 10:48
Спасибо большое. Очень толково и полно всё расписано. Давно искал полный пример програмного создания, к сожалению доступны были только отдельные фрагменты. Добавил в закладки.
2. Яков Коган (Yashazz) 02.04.15 12:28
Я смотрю, за копипаст хрусталёвских и прочих жёлтых книжек по-прежнему благодарят и плюсят. Ну-ну.

(1) Дофигища примеров. Хотя бы некоторые мои публикации, где функция СоздатьСКД юзается регулярно.
h00k; qwinter; +2 1 Ответить 2
3. Сергей Доронин (factor0) 02.04.15 12:44
Если плюсят, значит кому-то необходима эта информация. Да хотя бы мне, вот и решил поделиться )
4. Сергей Доронин (factor0) 02.04.15 13:35
(2) Yashazz, не стоит раскручивать себя за чужой счет. И вопрос - сам то не юзал желтые книжки? Вот доходить умом, а не заниматься плагиатом, цель этой публикации.
5. Михаил (ZMGMSC) 02.04.15 14:29
Примеров работы с СКД действительно много. У все начинается с книги Хрусталевой, и это правильно.
lavdeenko; factor0; +2 Ответить
6. Яков Коган (Yashazz) 02.04.15 17:39
(4) factor0, не ожидал подобной откровенности. Да, к сожалению, всё так. Вы раскручиваетесь за чужой счёт. Хрусталёва, Радченко и другие замечательные авторы старались, писали книги и статьи, а затем подобные вам копипастят обрывки этих книг, получают за это благодарности и раскручиваются таким сомнительным образом. Рад, что вы понимаете неприглядность подобных действий. Впрочем, если уж вы терзаетесь угрызениями совести, примите совет - переведите публикацию в "life". Тогда ваш копипаст будет хотя бы смотреться не столь вопиюще наглой попыткой заработать стартмани.

Не случилось у меня тогда ещё жёлтой книжечки. Не было её ещё в природе. СКД тогда только появилась, всё приходилось изучать самому. Впрочем, в первой редакции о программной работе с СКД вообще было негусто, а в типовых конфах тоже примеров было мало.
7. Сергей Доронин (factor0) 02.04.15 18:29
(6) Yashazz, где в этом отчете копипаст??? Кроме как язвить и переиначивать других у вас пока ничего не получается. Ну если вы такой гений изобретать велосипед, то продумайте и свой язык программирования. Тогда может для Вас копипаст исчезнет из навязчивых идей. Прошу не надоедать вашими бестолковыми комментариями. Если что по делу, тогда пишите! А так, в треп вдаваться, это к бабкам на лавочку ))) Так вот - ненужно здесь вам себя пиарить!!!
8. Сергей Доронин (factor0) 02.04.15 18:37
(6) Yashazz, да и не мешайте другим развиваться. Делитесь лучше опытом разработки, если он есть. Статья эта для этого и создавалась.
9. Яков Коган (Yashazz) 02.04.15 21:46
Товарищ, а вы случаем не тролль? Забавно, как вы сначала гневно переходите на личности, потом советуете мне себя не пиарить и - внимание! - одновременно предлагаете делиться опытом разработки. Попытка же "поделиться опытом разработки" наверняка будет названа самопиаром. Словом, от упрёка по существу (что всё это есть в жёлтых книжках) вы, как заправский тролль, перевели акцент на мою скромную персону. Ну а поскольку время ценно, а мне с вами уж всё предельно ясно, засим откланяюсь.

p.s. по делу: если кто видел примеры или сам владеет кун-фу использования свойства источника данных "ТипИсточникаДанных" с каким-либо другим значением, кроме "Local" (подозреваю, это должны быть СКД к внешним источникам), маякните, плиз.
10. Сергей Доронин (factor0) 03.04.15 00:21
(9) Yashazz, ну наконец - то. Какие у Вас классные шнурки на ботинках.
11. Игорь (IgorS) 09.04.15 10:19
(6) Yashazz, не все программисты 1С живут в Москве, соотв. не всем доступны книги Хрусталёвой, Радченко и проч. А на дисках ИТС - только сведения начального уровня об использовании СКД. В таких условиях любая найденная на просторах интернета информация полезна.
ПС. Если подскажите доступные в интернете книги по СКД, буду благодарен.
12. Сергей Доронин (factor0) 09.04.15 12:15
(11) IgorS, по Вашей просьбе могу предложить курс по СКД. Бесплатно, наглядно и по делу. http://www.spec8.ru/kurs-po-skd-besplatno
13. Павел Алексеенко (qwinter) 06.05.15 17:17
(2) Yashazz, просто иногда поражаешься, как люди любят усложнять себе жизнь)))

(11) IgorS, это на ИТС то базовый уровень?))) Там все расписано в гораздо большем объеме, понятнее и правильнее.

http://its.1c.ru/db/metod8dev#content:3450:hdoc

h00k; PVG_73; factor0; +3 Ответить 1
14. Сергей Доронин (factor0) 06.05.15 18:20
(13) qwinter, не могу не согласиться с Вами в части большего объема, но текст сухой, разобраться получается не сразу (особенно для новичков в этом направлении). Хотелось бы побольше действенных примеров с подробным описанием. Кидайте еще ссылки с кодом и примерами, пусть будет :)
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа