Неверные параметры в операции сравнения

1. Mag1strate 26.12.21 15:31 Сейчас в теме
Здравствуйте, коллеги. Делаю запрос с двумя ВТ. Запрос вроде как верный, возможно параметры указал неверно. Запрос с регистра сведений достает правило (через сколько дней человек должен отдать книгу), а эти дни узнаются в зависимости от того какая подписка.

Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ПравилаИспользованияСрезПоследних.Значение КАК Значение,
	|	ПравилаИспользованияСрезПоследних.Подписка КАК Подписка
	|ПОМЕСТИТЬ Вт_Правила
	|ИЗ
	|	РегистрСведений.ПравилаИспользования.СрезПоследних(
	|			&ДатаДокумента,
	|			Подписка = &ПодпискаПользователя
	|				И Правило = &ПравилоКоличествоДнейВозврата) КАК ПравилаИспользованияСрезПоследних
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	ПодпискиПользователейСрезПоследних.Подписка КАК Подписка
	|ПОМЕСТИТЬ ВТ_ПодпискаПользователя
	|ИЗ
	|	РегистрСведений.ПодпискиПользователей.СрезПоследних(&ДатаДокумента, Пользователь = &ПользовательДокумента) КАК ПодпискиПользователейСрезПоследних
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	ВТ_ПодпискаПользователя.Подписка КАК Подписка,
	|	Вт_Правила.Значение КАК Значение
	|ИЗ
	|	Вт_Правила КАК Вт_Правила
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПодпискаПользователя КАК ВТ_ПодпискаПользователя
	|		ПО Вт_Правила.Подписка = ВТ_ПодпискаПользователя.Подписка";
	
	Запрос.УстановитьПараметр("ДатаДокумента"                 , Объект.Дата); 
	Запрос.УстановитьПараметр("ПодпискаПользователя"          , Справочники.Подписки); 
	Запрос.УстановитьПараметр("ПравилоКоличествоДнейВозврата" , Перечисления.ПравилаИспользования.КоличествоДнейПользования);
	Запрос.УстановитьПараметр("ПользовательДокумента"         , Объект.Пользователь); 
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	     
	Если НЕ ПустаяСтрока(Объект.Пользователь) И ВыборкаДетальныеЗаписи.Следующий() Тогда
		Возврат Объект.Дата + 86400 * ВыборкаДетальныеЗаписи.Значение;
	КонецЕсли;
	
	Возврат '00010101';
Показать


Ошибка
{Документ.АрендаКниг.Форма.ФормаДокумента.Форма(50)}: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос.Выполнить();
через:
{(8, 13)}: Неправильные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов
Подписка <<?>>= &ПодпискаПользователя


Прикрепляю dt, моя версия 8.3.15.1830 (Код в Документы - ОрендаКниг - ФормаДокумента в модуле)
Прикрепленные файлы:
1Cv8.dt
По теме из базы знаний
Найденные решения
32. Dимыч 27.12.21 18:41 Сейчас в теме
(31)
Реквизит формы АктуальнаяПодписка имеет тип строка.
Нужно либо изменить тип реквизита АктуальнаяПодписка на Справочник.Подписки в запрос в качестве параметра будет передаваться элемент справочника или заменить
Запрос.УстановитьПараметр("ПодпискаПользователя" 		  , ЭтаФорма.АктуальнаяПодписка);

на
Запрос.УстановитьПараметр("ПодпискаПользователя" 		  , Справочники.Подписки.НайтиПоНаименованию(ЭтаФорма.АктуальнаяПодписка));
Mag1strate; +1 Ответить
34. Dимыч 27.12.21 19:06 Сейчас в теме
(33)
Я бы поменял у реквизита формы АктуальнаяПодписка тип на Справочники.Подписки
Для этого нужно подправить процедуру ПользовательПриИзмененииНаСервере() на следующую
Процедура ПользовательПриИзмененииНаСервере()
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ПодпискиПользователейСрезПоследних.ДатаОкончания КАК ДатаОкончания,
	//|	ПодпискиПользователейСрезПоследних.Подписка.Наименование КАК ПодпискаНаименование
	|	ПодпискиПользователейСрезПоследних.Подписка КАК Подписка
	|ИЗ
	|	РегистрСведений.ПодпискиПользователей.СрезПоследних(
	|			&ДатаДокумента,
	|			Пользователь = &ПользовательДокумента
	|				И ДатаОкончания >= &ДатаДокумента) КАК ПодпискиПользователейСрезПоследних";
	
	Запрос.УстановитьПараметр("ПользовательДокумента" , Объект.Пользователь);
	Запрос.УстановитьПараметр("ДатаДокумента"         , Объект.Дата);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Если РезультатЗапроса.Пустой() Тогда		
		//ЭтаФорма.АктуальнаяПодписка = "Немає актуальної підписки";	
		ЭтаФорма.АктуальнаяПодписка = Справочники.Подписки.ПустаяСсылка();
		Возврат;	
	КонецЕсли;
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Если ВыборкаДетальныеЗаписи.Следующий()  Тогда	
		ЭтаФорма.АктуальнаяПодписка = ВыборкаДетальныеЗаписи.Подписка;
	КонецЕсли;
	
КонецПроцедуры
Показать


Ну и для красоты у реквизита формы АктуальнаяПодписка установить свойства ПоложениеЗаголовка=Нет, КнопкаВыпадающегоСписка = Нет, КнопкаОткрытия=Нет, ПодсказкаВвода = Немає актуальної підписки
Прикрепленные файлы:
Mag1strate; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Torin 847 26.12.21 15:45 Сейчас в теме
(1) Тип у ПравилаИспользованияСрезПоследних.Подписка ? какой

ИМХО - в Регистре у вас Подписка = Строка, а в запросе Справочники.Подписки
3. Mag1strate 26.12.21 15:54 Сейчас в теме
(2) Видимо вы имели ввиду Справочники.Подписки?
4. Mag1strate 26.12.21 16:02 Сейчас в теме
(2) И как исправить? Как в запросе указать что это строка?
7. nomad_irk 81 26.12.21 17:15 Сейчас в теме
(1)укажите конкретную подписку(элемент справочника "подписки") в качестве параметра запроса, а не менеджер справочника.
что-то вроде:

Запрос.УстановитьПараметр("ПодпискаПользователя"          , Справочники.Подписки.НайтиПоНаименованию("Подписка", Истина));

или
Запрос.УстановитьПараметр("ПодпискаПользователя"          , Справочники.Подписки.ПредопределеннаяПодписка);
8. Mag1strate 26.12.21 17:18 Сейчас в теме
(7)
Справочники.Подписки.ПредопределеннаяПодписка

Первый вариант не подойдет, у меня есть разные подписки (Простая, Продвинутая).
А со вторым вариантом ошибка
{Документ.АрендаКниг.Форма.ФормаДокумента.Форма(47)}: Поле объекта не обнаружено (ПредопределеннаяПодписка)
Запрос.УстановитьПараметр("ПодпискаПользователя" , Справочники.Подписки.ПредопределеннаяПодписка);
9. nomad_irk 81 26.12.21 17:24 Сейчас в теме
(8)И они вам все нужны сразу? для чего тогда отбор по подписке выполнять?

"ПредопределеннаяПодписка" - это имя предопределенного элемента, я не знаю, есть ли они вообще в справочнике.
10. Mag1strate 26.12.21 17:33 Сейчас в теме
(9) Нет ПредопределеннаяПодписка. Названия подписок устанавливает справочник Подписки.
Делаю сразу отбор, чтобы потом из правил узнавать сколько дней будет действовать подписка
12. nomad_irk 81 26.12.21 17:53 Сейчас в теме
(10)
Нет ПредопределеннаяПодписка. Названия подписок устанавливает справочник Подписки.

Вы вообще знаете, что есть предопределенные элементы справочника? Для чего служат? Как к ним обращаться в коде?
Судя по написанному - вообще не представляете.

В вашем коде установки значения параметра:

Запрос.УстановитьПараметр("ПодпискаПользователя"          , Справочники.Подписки);
написана чушь.

Нужно использовать определенный элемент справочника "Подписки", а не весь справочник целиком(в данном случае - менеджер справочника).

Определенный элемент справочника:

Справочники.Подписки.НайтиПоНаименованию("Простая", Истина);


Если нужны несколько значений, то создайте массив значений и именно массив передавайте в качестве параметра запроса:

".............
|ИЗ
|    РегистрСведений.ПравилаИспользования.СрезПоследних(
|            &ДатаДокумента,
|            Подписка В (&ПодпискаПользователя)
|                И Правило = &ПравилоКоличествоДнейВозврата) КАК ПравилаИспользованияСрезПоследних
|................."

Массив = Новый Массив;
Массив.Добавить(Справочники.Подписки.НайтиПоНаименованию("Простая", Истина));
Массив.Добавить(Справочники.Подписки.НайтиПоНаименованию("Сложная", Истина));

Запрос.УстановитьПараметр("ПодпискаПользователя"          , Массив);
Показать
Torin; Mag1strate; +2 Ответить
14. Mag1strate 26.12.21 18:20 Сейчас в теме
(12)
Массив = Новый Массив;

В вашем варианте есть одно но. Если пользователь решит изменить название подписки или добавить новое, то без новой строчки Массив.Добавить(Справочники.Подписки.НайтиПоНаименованию("НАЗВАНИЕ_ПОДПИСКИ", Истина)); как он это сделает?
16. nomad_irk 81 26.12.21 18:38 Сейчас в теме
(14)если пользователь рулит отбором по подпискам, то в таком случае, необходимо на форму вынести реквизит вида СписокЗначений, чтобы пользователь набивал нужные и в зависимости от заполненности реквизита формы в самом запросе включается отбор.
17. Mag1strate 26.12.21 18:52 Сейчас в теме
(16) возможно есть место быть
Запрос.УстановитьПараметр("ПодпискаПользователя" , ЭтаФорма.АктуальнаяПодписка);
18. nomad_irk 81 26.12.21 18:54 Сейчас в теме
(17)возможно, если оно выведено на форму. Можно просто

Запрос.УстановитьПараметр("ПодпискаПользователя" , АктуальнаяПодписка); 

в случае, если "АктуальнаяПодписка" - реквизит формы.
19. Mag1strate 26.12.21 18:56 Сейчас в теме
(18) Да, реквизит формы. Но такой код не работает
20. Mag1strate 26.12.21 18:59 Сейчас в теме
22. nomad_irk 81 26.12.21 22:07 Сейчас в теме
(20)Потому что Объект.Пользователь никогда не будет = ПустаяСтрока().

Проверять нужно на ЗначениеЗаполнено(Объект.Пользователь)

Если ЗначениеЗаполнено(Объект.Пользователь) И ВыборкаДетальныеЗаписи.Следующий() Тогда
       Возврат Объект.Дата + 86400 * ВыборкаДетальныеЗаписи.Значение;
КонецЕсли;
23. Mag1strate 26.12.21 22:18 Сейчас в теме
(22) Если не указать пользователя то будет, или ошибаюсь? И у меня в условии если НЕ будет.
Через дебагер там не пустое значение, не выходит ничего с ВыборкаДетальныеЗаписи.Следующий(), если через Запрос.УстановитьПараметр("ПодпискаПользователя", АктуальнаяПодписка);
25. nomad_irk 81 27.12.21 08:18 Сейчас в теме
(23)У вас условие на НЕ пустую строку, т.е на заполненое значение.
Если пользователя не указать, то условие не выполнится.

ВыборкаДетальныеЗаписи.Следующий() дает ИСТИНА до тех пор, пока не дойдет до конца коллекции.
Если в выборке 0 записей, то будет всегда ЛОЖЬ.
26. Mag1strate 27.12.21 12:58 Сейчас в теме
(25) Да, верно. Но с ВыборкаДетальныеЗаписи.Следующий() я ничего не получаю, хотя там есть запись
21. Mag1strate 26.12.21 20:51 Сейчас в теме
(18) вот, так не работает
Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ПравилаИспользованияСрезПоследних.Значение КАК Значение,
	|	ПравилаИспользованияСрезПоследних.Подписка КАК Подписка
	|ПОМЕСТИТЬ Вт_Правила
	|ИЗ
	|	РегистрСведений.ПравилаИспользования.СрезПоследних(
	|			&ДатаДокумента,
	|			Подписка В (&ПодпискаПользователя)
	|				И Правило = &ПравилоКоличествоДнейВозврата) КАК ПравилаИспользованияСрезПоследних
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	ПодпискиПользователейСрезПоследних.Подписка КАК Подписка
	|ПОМЕСТИТЬ ВТ_ПодпискаПользователя
	|ИЗ
	|	РегистрСведений.ПодпискиПользователей.СрезПоследних(&ДатаДокумента, Пользователь = &ПользовательДокумента) КАК ПодпискиПользователейСрезПоследних
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	ВТ_ПодпискаПользователя.Подписка КАК Подписка,
	|	Вт_Правила.Значение КАК Значение
	|ИЗ
	|	Вт_Правила КАК Вт_Правила
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПодпискаПользователя КАК ВТ_ПодпискаПользователя
	|		ПО Вт_Правила.Подписка = ВТ_ПодпискаПользователя.Подписка";
	

	Запрос.УстановитьПараметр("ДатаДокумента"                 , Объект.Дата);
	Запрос.УстановитьПараметр("ПользовательДокумента"         , Объект.Пользователь);
	Запрос.УстановитьПараметр("ПодпискаПользователя" 	, АктуальнаяПодписка);
	
	Запрос.УстановитьПараметр("ПравилоКоличествоДнейВозврата" , Перечисления.ПравилаИспользования.КоличествоДнейПользования);	
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	     
	Если НЕ ПустаяСтрока(Объект.Пользователь) И ВыборкаДетальныеЗаписи.Следующий() Тогда
		Возврат Объект.Дата + 86400 * ВыборкаДетальныеЗаписи.Значение;
	КонецЕсли;
	
	Возврат '00010101';
Показать
15. Mag1strate 26.12.21 18:30 Сейчас в теме
(12) но да, такой код работает. Правда не то что нужно
5. Torin 847 26.12.21 16:36 Сейчас в теме
(4) Запрос.УстановитьПараметр("ПодпискаПользователя" , Справочники.Подписки.Наименование);
6. Mag1strate 26.12.21 17:08 Сейчас в теме
(5)
Запрос.УстановитьПараметр("ПодпискаПользователя" , Справочники.Подписки.Наименование);


{Документ.АрендаКниг.Форма.ФормаДокумента.Форма(47)}: Поле объекта не обнаружено (Наименование)
Запрос.УстановитьПараметр("ПодпискаПользователя" , Справочники.Подписки.Наименование);
11. Torin 847 26.12.21 17:46 Сейчас в теме
(6) ПравилаИспользованияСрезПоследних.Подписка.Наименование КАК Подписка

Запрос.УстановитьПараметр("ПодпискаПользователя"          , ЭтаФорма.АктуальнаяПодписка);
13. Mag1strate 26.12.21 18:17 Сейчас в теме
(11)
Наименование

Нет ошибок, но запрос ничего не возвращает
24. a30v 27.12.21 01:38 Сейчас в теме
(13) В справочнике Подписки нет элемента с наименованием "Простая".
Массив.Добавить(Справочники.Подписки.НайтиПоНаименованию("Простая", Истина));
Заменить на
Массив.Добавить(Справочники.Подписки.НайтиПоКоду("000000001", Истина));
27. Mag1strate 27.12.21 13:00 Сейчас в теме
28. a30v 27.12.21 16:29 Сейчас в теме
(27) Где есть? У вас написано слово Проста, а не Простая. Ищите элементы по коду.
Прикрепленные файлы:
1Cv8.dt
29. Mag1strate 27.12.21 17:31 Сейчас в теме
(28) А Простая здесь при чем?
Не нужно в коде указывать наименование подписки. Человек может захотеть изменить/добавить подписку. Выше писал об этом.
30. a30v 27.12.21 18:24 Сейчас в теме
(29) У вас сейчас все правильно отрабатывает? Если нет, то напишите что не работает и приложите выгрузку базы.
31. Mag1strate 27.12.21 18:32 Сейчас в теме
(30) можно с элемента формы получить какая подписка у пользователя, не нужно в коде указывать какая подписка. Комментарии в документе написал

Документ ОрендаКниг, код в модуле ФормыДокумента.
Функция ПолучитьПлановоюДатуВозврата()
Прикрепленные файлы:
base.dt
32. Dимыч 27.12.21 18:41 Сейчас в теме
(31)
Реквизит формы АктуальнаяПодписка имеет тип строка.
Нужно либо изменить тип реквизита АктуальнаяПодписка на Справочник.Подписки в запрос в качестве параметра будет передаваться элемент справочника или заменить
Запрос.УстановитьПараметр("ПодпискаПользователя" 		  , ЭтаФорма.АктуальнаяПодписка);

на
Запрос.УстановитьПараметр("ПодпискаПользователя" 		  , Справочники.Подписки.НайтиПоНаименованию(ЭтаФорма.АктуальнаяПодписка));
Mag1strate; +1 Ответить
33. Mag1strate 27.12.21 18:53 Сейчас в теме
(32)
Запрос.УстановитьПараметр("ПодпискаПользователя" , Справочники.Подписки.НайтиПоНаименованию(ЭтаФорма.АктуальнаяПодписка));

Первый вариант не работает, видимо где-то на выводе нужно ещё что-то поправить.
Второй вариант работает, большое спасибо!!
И вопрос, какой из вариантов будет лучше?
34. Dимыч 27.12.21 19:06 Сейчас в теме
(33)
Я бы поменял у реквизита формы АктуальнаяПодписка тип на Справочники.Подписки
Для этого нужно подправить процедуру ПользовательПриИзмененииНаСервере() на следующую
Процедура ПользовательПриИзмененииНаСервере()
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ПодпискиПользователейСрезПоследних.ДатаОкончания КАК ДатаОкончания,
	//|	ПодпискиПользователейСрезПоследних.Подписка.Наименование КАК ПодпискаНаименование
	|	ПодпискиПользователейСрезПоследних.Подписка КАК Подписка
	|ИЗ
	|	РегистрСведений.ПодпискиПользователей.СрезПоследних(
	|			&ДатаДокумента,
	|			Пользователь = &ПользовательДокумента
	|				И ДатаОкончания >= &ДатаДокумента) КАК ПодпискиПользователейСрезПоследних";
	
	Запрос.УстановитьПараметр("ПользовательДокумента" , Объект.Пользователь);
	Запрос.УстановитьПараметр("ДатаДокумента"         , Объект.Дата);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Если РезультатЗапроса.Пустой() Тогда		
		//ЭтаФорма.АктуальнаяПодписка = "Немає актуальної підписки";	
		ЭтаФорма.АктуальнаяПодписка = Справочники.Подписки.ПустаяСсылка();
		Возврат;	
	КонецЕсли;
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Если ВыборкаДетальныеЗаписи.Следующий()  Тогда	
		ЭтаФорма.АктуальнаяПодписка = ВыборкаДетальныеЗаписи.Подписка;
	КонецЕсли;
	
КонецПроцедуры
Показать


Ну и для красоты у реквизита формы АктуальнаяПодписка установить свойства ПоложениеЗаголовка=Нет, КнопкаВыпадающегоСписка = Нет, КнопкаОткрытия=Нет, ПодсказкаВвода = Немає актуальної підписки
Прикрепленные файлы:
Mag1strate; +1 Ответить
35. Mag1strate 27.12.21 19:16 Сейчас в теме
(34) Большое вам спасибо!!!
36. a30v 27.12.21 19:26 Сейчас в теме
(33) У вас для реквизита формы АктуальнаяПодписка установлен тип Строка, а нужен СправочникСсылка.Подписки. И переделать как в (34) Тогда будет работать.
Прикрепленные файлы:
1Cv8.cf
Mag1strate; +1 Ответить
37. Mag1strate 27.12.21 20:04 Сейчас в теме
(36) да. в (34) работает, спасибо
Оставьте свое сообщение

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