При программном создании отбора динамического списка возникает ошибка: "Ошибка в элементе отбора: глобальные элементы отбора обязательно должны использовать поля"

1. Niki_Pro 14.10.19 11:36 Сейчас в теме
На форме есть динамический список. Выведены поля "номенклатура, код"
Добавляю отбор программно по полю булевного типа "номенклатура.условие1" (равно истина)

отбор корректно добавляется, но вылезает такая ошибка
Ошибка в элементе отбора: глобальные элементы отбора обязательно должны использовать поля  "номенклатура.условие1 Равно ..."


Не понимаю чего не хватает. Это из-за того, что это поле не выведено в динамическом списке?
По теме из базы знаний
Найденные решения
5. Niki_Pro 14.10.19 13:34 Сейчас в теме
Нашел в чем была трабла. При поиске в уже имеющихся отборах случайно присваивал не то значение.

В итоге вот процедурка для установки произвольного отбора (вытаскивать явно в запросе динамического списка ничего не надо)

//Параметры:
//  ПолеОтбора              - тип строка
//  ДСП                            - Динамический список
//  УстановитьОтбор - условие по которому либо устанавливаем отбор, либо удаляем его
&НаСервере
Процедура УстановитьПараметрыОтбораДинамическогоСписка(ПолеОтбора, ДСП, УстановитьОтбор)
	
	ИскомоеПолеОтбора = Новый ПолеКомпоновкиДанных(ПолеОтбора);
	//Проверяем возможность установки отбора
	ПолеОтбораДоступно = ложь;
	Для Каждого ДоступныйЭлементОтбора из ДСП.Отбор.ДоступныеПоляОтбора.Элементы Цикл
		Если ДоступныйЭлементОтбора.Поле = ИскомоеПолеОтбора Тогда
			ПолеОтбораДоступно = истина;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	Если ПолеОтбораДоступно Тогда
		
		Если УстановитьОтбор Тогда
			ОтборУжеЕсть = ложь;
			//Проверяем установлен ли уже отбор
			СписокОтборов = ОбщегоНазначенияКлиентСервер.НайтиЭлементыИГруппыОтбора(ДСП.Отбор, ПолеОтбора);
			Для каждого ОтборИзСписка Из СписокОтборов Цикл
				Если ТипЗнч(ОтборИзСписка.ЛевоеЗначение) = Тип("ПолеКомпоновкиДанных") Тогда
						Если ОтборИзСписка.ЛевоеЗначение = ИскомоеПолеОтбора Тогда
							ОтборУжеЕсть = истина;
							Прервать;
						КонецЕсли;
				КонецЕсли;
			КонецЦикла;
			
			//если отбор не установлен, то добавляем его
			Если не ОтборУжеЕсть Тогда
				ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(ДСП,ПолеОтбора,Истина,ВидСравненияКомпоновкиДанных.Равно,,истина);
			КонецЕсли;
		Иначе
				//очищаем параметры отбора динамического списка, если такой отбор есть
			СписокОтборов = ОбщегоНазначенияКлиентСервер.НайтиЭлементыИГруппыОтбора(ДСП.Отбор,ПолеОтбора);
			Для каждого ОтборИзСписка Из СписокОтборов Цикл
				Если ОтборИзСписка.ЛевоеЗначение = ИскомоеПолеОтбора Тогда
 					ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбораДинамическогоСписка(ДСП, ПолеОтбора);
					Прервать;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. aka Любитель XML 14.10.19 11:38 Сейчас в теме
Вроде в УФ решалось галочкой "использовать всегда" у нужного реквизита динамического списка
3. Niki_Pro 14.10.19 11:50 Сейчас в теме
(2) на реквизите "Номенклатура" такая галочка на форме стоит, но на дочернем реквизите я ее поставить не могу, так как реквизит "условие1" в запросе явно не выбирается
4. Niki_Pro 14.10.19 12:36 Сейчас в теме
Вытащил явно в запросе необходимое поле. Вроде сначала помогло (отбор сработал и осталось все необходимое), а теперь опять эта ошибка
5. Niki_Pro 14.10.19 13:34 Сейчас в теме
Нашел в чем была трабла. При поиске в уже имеющихся отборах случайно присваивал не то значение.

В итоге вот процедурка для установки произвольного отбора (вытаскивать явно в запросе динамического списка ничего не надо)

//Параметры:
//  ПолеОтбора              - тип строка
//  ДСП                            - Динамический список
//  УстановитьОтбор - условие по которому либо устанавливаем отбор, либо удаляем его
&НаСервере
Процедура УстановитьПараметрыОтбораДинамическогоСписка(ПолеОтбора, ДСП, УстановитьОтбор)
	
	ИскомоеПолеОтбора = Новый ПолеКомпоновкиДанных(ПолеОтбора);
	//Проверяем возможность установки отбора
	ПолеОтбораДоступно = ложь;
	Для Каждого ДоступныйЭлементОтбора из ДСП.Отбор.ДоступныеПоляОтбора.Элементы Цикл
		Если ДоступныйЭлементОтбора.Поле = ИскомоеПолеОтбора Тогда
			ПолеОтбораДоступно = истина;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	Если ПолеОтбораДоступно Тогда
		
		Если УстановитьОтбор Тогда
			ОтборУжеЕсть = ложь;
			//Проверяем установлен ли уже отбор
			СписокОтборов = ОбщегоНазначенияКлиентСервер.НайтиЭлементыИГруппыОтбора(ДСП.Отбор, ПолеОтбора);
			Для каждого ОтборИзСписка Из СписокОтборов Цикл
				Если ТипЗнч(ОтборИзСписка.ЛевоеЗначение) = Тип("ПолеКомпоновкиДанных") Тогда
						Если ОтборИзСписка.ЛевоеЗначение = ИскомоеПолеОтбора Тогда
							ОтборУжеЕсть = истина;
							Прервать;
						КонецЕсли;
				КонецЕсли;
			КонецЦикла;
			
			//если отбор не установлен, то добавляем его
			Если не ОтборУжеЕсть Тогда
				ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(ДСП,ПолеОтбора,Истина,ВидСравненияКомпоновкиДанных.Равно,,истина);
			КонецЕсли;
		Иначе
				//очищаем параметры отбора динамического списка, если такой отбор есть
			СписокОтборов = ОбщегоНазначенияКлиентСервер.НайтиЭлементыИГруппыОтбора(ДСП.Отбор,ПолеОтбора);
			Для каждого ОтборИзСписка Из СписокОтборов Цикл
				Если ОтборИзСписка.ЛевоеЗначение = ИскомоеПолеОтбора Тогда
 					ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбораДинамическогоСписка(ДСП, ПолеОтбора);
					Прервать;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры
Показать
6. dhurricane 14.10.19 13:41 Сейчас в теме
(5) А не могли бы Вы подробнее описать, что именно не так Вы присваивали? Какие именно инструкции приводят к описанной в топике ошибке?

К сожалению, приведенная процедура вызывает больше вопросов, нежели дает какие-либо ответы.
7. Niki_Pro 14.10.19 13:49 Сейчас в теме
(6)
я просто вместо проверки в этой процедуре в месте

Если ОтборИзСписка.ЛевоеЗначение = ИскомоеПолеОтбора Тогда
  ОтборУжеЕсть = истина;
  Прервать;
КонецЕсли;


Случайно оставил такое:
  ОтборИзСписка.ЛевоеЗначение = "ПолеСтрокой";
  ОтборУжеЕсть = истина;
  Прервать;


и получается что присваивал в первый попавшийся элемент найденого отбора динамического списка в левое значение еще и другой тип "Строка",
а мне надо было его найти.
Оставьте свое сообщение

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