Передача параметров в отчет на СКД

1. silverr 14 29.07.21 16:15 Сейчас в теме
Всем доброго времени суток!
А можно мне задать вопрос по отборам в отчетах на СКД.
Пытаюсь из расширения запустить отчет конфигурации БП 3.0 "Движения товаров". Передаю туда отбор по номенклатуре:

Номенклатура = ТекущиеДанные.Ссылка;
        //структура отбора

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


Выдает ошибку:
Невозможно применить фиксированные настройки. Совпадают значения параметра.
{Отчет.ДвижениеТоваров.Форма.ФормаОтчета.Форма(667)}:    ПараметрыОтчета.НастройкиКомпоновкиДанных         = Отчет.КомпоновщикНастроек.ПолучитьНастройки();
{Отчет.ДвижениеТоваров.Форма.ФормаОтчета.Форма(925)}:    ПараметрыОтчета = ПодготовитьПараметрыОтчетаНаСервере();
{Отчет.ДвижениеТоваров.Форма.ФормаОтчета.Форма(733)}:    БухгалтерскиеОтчеты.ЗаписатьОперациюБизнесСтатистики(ЭтотОбъект, "СформироватьОтчет", НастройкиОтчетаДляСтатистики());
{Отчет.ДвижениеТоваров.Форма.ФормаОтчета.Форма(875)}:    РезультатВыполнения = СформироватьОтчетНаСервере();
{Отчет.ДвижениеТоваров.Форма.ФормаОтчета.Форма(511)}:    ЗапуститьФормированиеОтчета();

по причине:
Невозможно применить фиксированные настройки. Совпадают значения параметра
Показать


Прошу помощи!!!
sacred_a; +1 Ответить
По теме из базы знаний
Найденные решения
6. user925427 126 30.07.21 12:31 Сейчас в теме
Для этого не нужно устанавливать отбор в параметрах формы, нужно установить значение отбора в настройках отчёта.
Настройки получаются через компоновщик. Попробуй так, должно работать:
ЭлементыОтбора = ФормаОтчета.Отчет.КомпоновщикНастроек.Настройки.Отбор.Элементы;
ПолеНоменклатура = Новый ПолеКомпоновкиДанных("Номенклатура");
Для Каждого ЭлементОтбора Из ЭлементыОтбора Цикл
	Если ЭлементОтбора.ЛевоеЗначение = ПолеНоменклатура Тогда
		ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
		ЭлементОтбора.ПравоеЗначение = Номенклатура;
		Прервать;
	КонецЕсли;
КонецЦикла;
Показать
15. silverr 14 16.09.21 12:56 Сейчас в теме
Всем доброго времени суток!
В результате поисков нашел универсальную схему открытия типового (из конфигурации) отчета в 1С: БП 3.0, подходит для большинства отчетов конфигурации. Вот код:
&НаКлиенте
Процедура ОтчетДвиженияНоменклатуры(Команда)
	
	ТекущиеДанные = Элементы.СписокНоменклатуры.ТекущиеДанные;
	Если ТекущиеДанные.Свойство("Ссылка")<>Неопределено Тогда
		Номенклатура = ТекущиеДанные.Ссылка;
		Отборы = Новый Массив;
		Отборы.Добавить(Новый Структура("Поле, Значение, ВидСравнения","Номенклатура", Номенклатура, ВидСравненияКомпоновкиДанных.Равно));
		ОткрытьОтчет("Отчет.ДвижениеТоваров.Форма", ,Отборы, ,"ДвижениеТоваров");
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьОтчет(Отчет, ГруппировкаОтчета = Неопределено, Отборы = Неопределено, Показатели  = Неопределено, КлючВарианта = Неопределено, НачалоПериода = Неопределено, КонецПериода = Неопределено)
	
	ПользовательскиеНастройки = ПользовательскиеНастройкиДляРасшифровки(НачалоПериода, КонецПериода);
	ДополнительныеСвойства = ПользовательскиеНастройки.ДополнительныеСвойства;
	
	Если ГруппировкаОтчета <> Неопределено И ТипЗнч(ГруппировкаОтчета) = Тип("Массив") Тогда
		ДополнительныеСвойства.Вставить("Группировка", ГруппировкаОтчета);
	КонецЕсли;
	
	Если ТипЗнч(Отборы) = Тип("Массив") Тогда
		
		НастройкаОтбора = ПользовательскиеНастройки.Элементы.Добавить(Тип("ОтборКомпоновкиДанных"));
		НастройкаОтбора.ИдентификаторПользовательскойНастройки = "Отбор";
		Для Каждого Отбор Из Отборы Цикл
			БухгалтерскиеОтчетыКлиентСервер.ДобавитьОтбор(НастройкаОтбора, Отбор.Поле, Отбор.Значение, Отбор.ВидСравнения);
		КонецЦикла;
		
	КонецЕсли;
	
	Если ТипЗнч(Показатели) = Тип("Массив") Тогда
		
		Для Каждого Показатель Из Показатели Цикл
			ДополнительныеСвойства.Вставить(Показатель, Истина);
		КонецЦикла;
		
	КонецЕсли;
	
	Если КлючВарианта <> Неопределено Тогда
		ДополнительныеСвойства.Вставить("КлючВарианта", КлючВарианта);
	КонецЕсли;
	
	ПараметрыОтчета = Новый Структура;
	ПараметрыОтчета.Вставить("РежимРасшифровки"         , Истина);
	ПараметрыОтчета.Вставить("ВидРасшифровки"           , 2);
	ПараметрыОтчета.Вставить("ПользовательскиеНастройки", ПользовательскиеНастройки);
	
	ОткрытьФорму(Отчет, ПараметрыОтчета, ЭтотОбъект, Истина);
	
КонецПроцедуры

Показать

Всем удачи.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. alxarz 32 30.07.21 06:52 Сейчас в теме
(1) а что происходит в ПриЗагрузкеВариантаОтчета и в ПриЗагрузкеПользовательскихНастроек ?
5. silverr 14 30.07.21 10:21 Сейчас в теме
(2) Происходит "склейка" Пользовательских" и "Фиксированных" настроек отчета. Как раз наличие в двух настройках одинакового параметра и вызывает данную ошибку. Хочу очистить параметры отбора в Фиксированных настройках, или-же передать Отбор в "Фиксированные".
3. user925427 126 30.07.21 09:24 Сейчас в теме
Фиксированные настройки - настройки, предопределённые разработчиком. Они имеют приоритет перед настройками СКД и пользовательскими. В СКД отчёта есть фиксированные настройки, а ты пытаешься установить значение какой-то из них в пользовательских настройках. Либо нужно убрать пересекающуюся настройку из отбора, либо передать в форму фиксированные настройки:
фиксНастройки = Новый НастройкиКомпоновкиДанных;
....
Установка значений настроек
....
ПараметрыФормы.Вставить("ФиксированныеНастройки", фиксНастройки);
4. silverr 14 30.07.21 10:11 Сейчас в теме
(3) Хотелось-бы передать Отбор в виде Пользовательских настроек, чтоб пользователь (если это ему понадобиться) зашел в "Показать настройки" снял галку отбора и получил полный отчет.
Как получить и очистить Фиксированные настройки? Надеюсь это действие на период текущего сеанса работы с Отчетом.
6. user925427 126 30.07.21 12:31 Сейчас в теме
Для этого не нужно устанавливать отбор в параметрах формы, нужно установить значение отбора в настройках отчёта.
Настройки получаются через компоновщик. Попробуй так, должно работать:
ЭлементыОтбора = ФормаОтчета.Отчет.КомпоновщикНастроек.Настройки.Отбор.Элементы;
ПолеНоменклатура = Новый ПолеКомпоновкиДанных("Номенклатура");
Для Каждого ЭлементОтбора Из ЭлементыОтбора Цикл
	Если ЭлементОтбора.ЛевоеЗначение = ПолеНоменклатура Тогда
		ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
		ЭлементОтбора.ПравоеЗначение = Номенклатура;
		Прервать;
	КонецЕсли;
КонецЦикла;
Показать
7. silverr 14 30.07.21 17:35 Сейчас в теме
(6)Был в отъезде, не видел сообщение. Буду пробовать. Спасибо за помощь.
8. silverr 14 02.08.21 08:46 Сейчас в теме
(6)К сожалению Ваш код не сработал. Удовлетворительно работает только этот код:
		Номенклатура = ТекущиеДанные.Ссылка;
		ПараметрыФормы = Новый Структура("СформироватьПриОткрытии", Истина);
		ФормаОтчета = ПолучитьФорму("Отчет.ДвижениеТоваров.ФормаОбъекта", ПараметрыФормы);
		ФормаОтчета.НастройкиОтчета.ФормироватьСразу = Истина;
		
		КомпоновщикНастроек = ФормаОтчета.Отчет.КомпоновщикНастроек;
		НастройкиКомпоновки = КомпоновщикНастроек.ФиксированныеНастройки;
		
		НастройкиКомпоновки.Отбор.Элементы.Очистить();
		Отбор = НастройкиКомпоновки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		Отбор.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор;
		Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура");
		Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
		Отбор.ПравоеЗначение = Номенклатура;
		Отбор.Использование = Истина;
Показать

Как видите настройки Фиксированные. В Пользовательских настройках не находит "Отбор".
Да и ФормироватьСразу тоже не исполняет.
9. user925427 126 02.08.21 09:49 Сейчас в теме
К счастью, Вы решили свою проблему, но, к сожалению, не разобрались в вопросе. Я не просто так написал код, я его проверил на внешней обработке именно с этим отчётом. Чем последний код отличается от моего? Тем, что очищаются фиксированные настройки отчёта и добавляются свои, а это некорректно, потому что они предусмотрены разработчиком и код, таким образом, вмешивается в разработку. Мой вариант основан на том, что отбор уже установлен в этом конкретном отчёте и код устанавливает значение нужного элемента отбора. Вот и вся разница. Почему он у Вас не сработал, нужно смотреть в целом.
10. silverr 14 02.08.21 11:03 Сейчас в теме
(9)Проверю еще, может нужно сбросить пользовательские настройки.
11. user925427 126 02.08.21 11:11 Сейчас в теме
(10) Просто поэкспериментируйте, чтобы разобраться. Дело не в моём коде или другом. Нужно разобраться в том, как это работает, чтобы больше вопросов не возникало. "СформироватьПриОткрытии" в параметрах формы достаточно для запуска, зачем ещё эта строчка: ФормаОтчета.НастройкиОтчета.ФормироватьСразу = Истина; ?
Получите Настройки, посмотрите в отладчике Отбор. У него есть коллекция элементов. В ней уже есть Номенклатура. Раз так, просто установите её значение. Всё.
Получите ПользовательскиеНастройки, посмотрите, что в них. Потом фиксированные. И выберите подходящий вариант.
12. silverr 14 02.08.21 11:31 Сейчас в теме
(9)Проверил, после сброса настроек. На условии: "Если ЭлементОтбора.ЛевоеЗначение = ПолеНоменклатура Тогда"
выходит из цикла. По причине: первым у меня другое условие "Счет", поэтому в цикле ввел оператор "Иначе". И "ЭлементОтбора.Использование = Истина;" тоже добавил, мало-ли пользователь что выбирал в прошлый раз.
Просто я полагал, что нужно работать с "ПользовательскимиНастройками", а не с "Настройками" вообще.
Спасибо за помощь, так действительно работает, с учетом моих хотелок. Остальные параметры надеюсь передать самостоятельно.
Вот только отчет не формируется автоматом и выходит сообщение: "Отчет не сформирован! Недействительный адрес или не найден родительский сеанс задания".
13. user925427 126 02.08.21 12:46 Сейчас в теме
(12)
сообщение: "Отчет не сформирован! Недействительный адрес или не найден родительский сеанс задания".

появляется при работе с временным хранилищем, адрес которого не обнаружен либо при ошибке в релизе конфигурации БП. Например, в версии БП 29.8. В последнем случае поможет только обновление конфигурации до следующего релиза. У меня, на БП 3.0.95.29 ничего подобного не было. В первом случае нужно смотреть как и откуда вызывается отчёт. Весь приведённый выше код - для клиента, временное хранилище служит для передачи данных между клиентом и сервером. Из приведённого кода этого понять невозможно.
На условии: "Если ЭлементОтбора.ЛевоеЗначение = ПолеНоменклатура Тогда" выходит из цикла.

Так и должно быть, дальше оператор Прервать. Зачем продолжать цикл, если нужный элемент уже найден? Порядок следования элементов коллекции отбора неважен, поэтому то, что первым "Счёт" значения не имеет.
14. silverr 14 04.08.21 11:42 Сейчас в теме
Доброго времени суток!
Всем спасибо за помощь, как говориться "стрижка только начата". До окончания работ еще далеко, будем работать.
15. silverr 14 16.09.21 12:56 Сейчас в теме
Всем доброго времени суток!
В результате поисков нашел универсальную схему открытия типового (из конфигурации) отчета в 1С: БП 3.0, подходит для большинства отчетов конфигурации. Вот код:
&НаКлиенте
Процедура ОтчетДвиженияНоменклатуры(Команда)
	
	ТекущиеДанные = Элементы.СписокНоменклатуры.ТекущиеДанные;
	Если ТекущиеДанные.Свойство("Ссылка")<>Неопределено Тогда
		Номенклатура = ТекущиеДанные.Ссылка;
		Отборы = Новый Массив;
		Отборы.Добавить(Новый Структура("Поле, Значение, ВидСравнения","Номенклатура", Номенклатура, ВидСравненияКомпоновкиДанных.Равно));
		ОткрытьОтчет("Отчет.ДвижениеТоваров.Форма", ,Отборы, ,"ДвижениеТоваров");
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьОтчет(Отчет, ГруппировкаОтчета = Неопределено, Отборы = Неопределено, Показатели  = Неопределено, КлючВарианта = Неопределено, НачалоПериода = Неопределено, КонецПериода = Неопределено)
	
	ПользовательскиеНастройки = ПользовательскиеНастройкиДляРасшифровки(НачалоПериода, КонецПериода);
	ДополнительныеСвойства = ПользовательскиеНастройки.ДополнительныеСвойства;
	
	Если ГруппировкаОтчета <> Неопределено И ТипЗнч(ГруппировкаОтчета) = Тип("Массив") Тогда
		ДополнительныеСвойства.Вставить("Группировка", ГруппировкаОтчета);
	КонецЕсли;
	
	Если ТипЗнч(Отборы) = Тип("Массив") Тогда
		
		НастройкаОтбора = ПользовательскиеНастройки.Элементы.Добавить(Тип("ОтборКомпоновкиДанных"));
		НастройкаОтбора.ИдентификаторПользовательскойНастройки = "Отбор";
		Для Каждого Отбор Из Отборы Цикл
			БухгалтерскиеОтчетыКлиентСервер.ДобавитьОтбор(НастройкаОтбора, Отбор.Поле, Отбор.Значение, Отбор.ВидСравнения);
		КонецЦикла;
		
	КонецЕсли;
	
	Если ТипЗнч(Показатели) = Тип("Массив") Тогда
		
		Для Каждого Показатель Из Показатели Цикл
			ДополнительныеСвойства.Вставить(Показатель, Истина);
		КонецЦикла;
		
	КонецЕсли;
	
	Если КлючВарианта <> Неопределено Тогда
		ДополнительныеСвойства.Вставить("КлючВарианта", КлючВарианта);
	КонецЕсли;
	
	ПараметрыОтчета = Новый Структура;
	ПараметрыОтчета.Вставить("РежимРасшифровки"         , Истина);
	ПараметрыОтчета.Вставить("ВидРасшифровки"           , 2);
	ПараметрыОтчета.Вставить("ПользовательскиеНастройки", ПользовательскиеНастройки);
	
	ОткрытьФорму(Отчет, ПараметрыОтчета, ЭтотОбъект, Истина);
	
КонецПроцедуры

Показать

Всем удачи.
16. mrd_84 28.08.23 13:55 Сейчас в теме
А что такое ОткрытьОтчет()???
17. silverr 14 28.08.23 16:00 Сейчас в теме
(16) Доброго дня! Разверните программный код.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот