Заполнение отбора СКД программно и запуск отчета на СКД программно

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

Нужно было из справочника "Номенклатура" запустить отчет на СКД с отбором по элементу справочника. В интернете много решений, часть не работает (нужно бродить по веткам форума и читать как в итоге все заработало), часть слишком заумные (для спец. задач). Нужно было быстрое решение... Сделал сам. Если есть что то проще - пишите.

Итак, есть в конфигурации отчет на СКД (у меня это ОтчетПоЦенамИНаценкам)

В нужном месте добавляем кнопку вызова отчета, где пишем:


тОтчет = Отчеты.ОтчетПоЦенамИНаценкам.Создать();

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

ПолеНоменклатура = тОтчет.КомпоновщикНастроек.Настройки.Отбор.ДоступныеПоляОтбора.Элементы.Найти("Номенклатура"); //поле отбора присутствует в СКД
ПолеНоменклатураСкидка = тОтчет.КомпоновщикНастроек.Настройки.Отбор.ДоступныеПоляОтбора.Элементы.Найти("НоменклатураСкидка"); //поле отбора присутствует в СКД

НовыйОтбор = НастройкиКД.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйОтбор.ЛевоеЗначение = ПолеНоменклатура.Поле;
НовыйОтбор.ПравоеЗначение = ЭлементыФормы.Список.ТекущаяСтрока;
НовыйОтбор.Использование = Истина;

НовыйОтбор = НастройкиКД.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйОтбор.ЛевоеЗначение = ПолеНоменклатураСкидка.Поле;
НовыйОтбор.ПравоеЗначение = ЭлементыФормы.Список.ТекущаяСтрока;
НовыйОтбор.Использование = Истина;

тОтчет.КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиКД);
тФорма = тОтчет.ПолучитьФорму("ФормаОтчета");
тОтчет.СкомпоноватьРезультат(тФорма.ЭлементыФормы.Результат); //таб док на форме
тФорма.Открыть();

 

См. также

Комментарии
1. Armando Armando (Armando) 1374 05.06.14 21:50 Сейчас в теме
2. Константин Соболевский (Константин С.) 485 06.06.14 11:32 Сейчас в теме
(1) отчасти прав, но примеры никак не относятся к СКД.
3. Сергей Ожерельев (Поручик) 3517 06.06.14 21:47 Сейчас в теме
(0) Ваш код в управляемом приложении работать не будет. Кто-нибудь наткнётся, сделает по образцу, убедится в очередной раз "В интернете много решений, часть не работает" и всё заверте....
4. Яков Коган (Yashazz) 1987 08.06.14 16:22 Сейчас в теме
Ну или Хрусталёву почитайте, или просто код типовой конфы посмотрите.
5. Сергей Смирнов (andogskiy) 11.06.14 15:43 Сейчас в теме
(4) Yashazz, не подскажете, где в типовых конфигурациях можно посмотреть? Интересует механизм для управляемого приложения.
6. alem alem (alem) 27 25.06.14 17:14 Сейчас в теме
Для управляемого приложения нужно видимо по предыдущим коментам ходить - это только для обычного, сам изучаю упр приложение.
К сожалению не осталось ссылки, но где то в предыдущей мой статье в коментах писали про встроенные механизмы ( как в 10.3 жмёшь свойства на форме и там где то настраиваешь - попробую поискаить статью снова
7. Il'ya Mankov (Tpakmop) 11 29.07.14 06:41 Сейчас в теме
На клиенте сделал так:
	ФормаОтчета = ПолучитьФорму("Отчет.ПеремещенияНоменклатуры.Форма");
	КомпоновщикНастроек = ФормаОтчета.Отчет.КомпоновщикНастроек;
	Настройки = КомпоновщикНастроек.Настройки.Отбор;
	
	Для каждого ТекОтбор Из Настройки.Элементы Цикл
		
		Если Строка(ТекОтбор.ЛевоеЗначение) = "Номенклатура" Тогда
			Элемент = ФормаОтчета.Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(ТекОтбор.ИдентификаторПользовательскойНастройки);
			Если Элемент <> Неопределено Тогда
				Элемент.Использование = ЗначениеЗаполнено(спНом);
				Элемент.ВидСравнения = ?(ТипЗнч(спНом) = Тип("СписокЗначений"), ВидСравненияКомпоновкиДанных.ВСписке, ВидСравненияКомпоновкиДанных.Равно);
				Элемент.ПравоеЗначение = спНом;
			КонецЕсли;
		КонецЕсли;
		
		Если Строка(ТекОтбор.ЛевоеЗначение) = "Склад" Тогда
			Элемент = ФормаОтчета.Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(ТекОтбор.ИдентификаторПользовательскойНастройки);
			Если Элемент <> Неопределено Тогда
				Элемент.Использование = ЗначениеЗаполнено(спСклад);
				Элемент.ВидСравнения = ?(ТипЗнч(спСклад) = Тип("СписокЗначений"), ВидСравненияКомпоновкиДанных.ВСписке, ВидСравненияКомпоновкиДанных.Равно);
				Элемент.ПравоеЗначение = спСклад;
			КонецЕсли;
		КонецЕсли;
		
	КонецЦикла; 
...Показать Скрыть
8. Юрий Чертоляс (juricher) 4 22.05.16 16:19 Сейчас в теме
Работает в УТ но только в толстом клиенте. Приходится выбирать режим запуска. Некошерно как-то
9. Sergey Andreev (starik-2005) 860 22.05.16 19:13 Сейчас в теме
(8) juricher, в управляемом отбор передаете в параметрах открываемой формы - и все. Читайте синтаксис-помощник - умные существа писали.
10. igor_gk (igor_gk) 44 01.02.17 10:33 Сейчас в теме
Это называется: "Пока другие умничали и давали очень умные советы пришел мужик, взял молча молоток и вбил гвоздь".
Просто и практично.
Спасибо.
11. Дмитрий К (k.dm.v@mail.ru) 16.02.17 13:07 Сейчас в теме
Как работает в упр. формах

&НаКлиенте
Процедура ВывестиВОтчете(Команда)
	
	Номенклатура = Объект.Ссылка;
	//структура отбора
	Отбор = Новый Структура("Номенклатура", Номенклатура);
	Отбор.Вставить("НачалоПериода", Дата(2016, 01, 01, 00, 00, 00));
	Отбор.Вставить("КонецПериода", ТекущаяДата());
	ПараметрыФормы = Новый Структура("СформироватьПриОткрытии, Отбор", Истина, Отбор);
	ФормаОтчета = ПолучитьФорму("Отчет.ВедомостьПоТоварамНаСкладах.ФормаОбъекта", ПараметрыФормы);
	//затираем пользовательские настройки
	НовыеПользовательскиеНастройки = Новый ПользовательскиеНастройкиКомпоновкиДанных;
	ФормаОтчета.Отчет.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(НовыеПользовательскиеНастройки);
	ОткрытьФорму(ФормаОтчета);

КонецПроцедуры
...Показать Скрыть