Здравствуйте, коллеги. Делаю запрос с двумя ВТ. Запрос вроде как верный, возможно параметры указал неверно. Запрос с регистра сведений достает правило (через сколько дней человек должен отдать книгу), а эти дни узнаются в зависимости от того какая подписка.
Ошибка
{Документ.АрендаКниг.Форма.ФормаДокумента.Форма(50)}: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос.Выполнить();
через:
{(8, 13)}: Неправильные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов
Подписка <<?>>= &ПодпискаПользователя
Прикрепляю dt, моя версия 8.3.15.1830 (Код в Документы - ОрендаКниг - ФормаДокумента в модуле)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПравилаИспользованияСрезПоследних.Значение КАК Значение,
| ПравилаИспользованияСрезПоследних.Подписка КАК Подписка
|ПОМЕСТИТЬ Вт_Правила
|ИЗ
| РегистрСведений.ПравилаИспользования.СрезПоследних(
| &ДатаДокумента,
| Подписка = &ПодпискаПользователя
| И Правило = &ПравилоКоличествоДнейВозврата) КАК ПравилаИспользованияСрезПоследних
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ПодпискиПользователейСрезПоследних.Подписка КАК Подписка
|ПОМЕСТИТЬ ВТ_ПодпискаПользователя
|ИЗ
| РегистрСведений.ПодпискиПользователей.СрезПоследних(&ДатаДокумента, Пользователь = &ПользовательДокумента) КАК ПодпискиПользователейСрезПоследних
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ПодпискаПользователя.Подписка КАК Подписка,
| Вт_Правила.Значение КАК Значение
|ИЗ
| Вт_Правила КАК Вт_Правила
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПодпискаПользователя КАК ВТ_ПодпискаПользователя
| ПО Вт_Правила.Подписка = ВТ_ПодпискаПользователя.Подписка";
Запрос.УстановитьПараметр("ДатаДокумента" , Объект.Дата);
Запрос.УстановитьПараметр("ПодпискаПользователя" , Справочники.Подписки);
Запрос.УстановитьПараметр("ПравилоКоличествоДнейВозврата" , Перечисления.ПравилаИспользования.КоличествоДнейПользования);
Запрос.УстановитьПараметр("ПользовательДокумента" , Объект.Пользователь);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если НЕ ПустаяСтрока(Объект.Пользователь) И ВыборкаДетальныеЗаписи.Следующий() Тогда
Возврат Объект.Дата + 86400 * ВыборкаДетальныеЗаписи.Значение;
КонецЕсли;
Возврат '00010101';
ПоказатьОшибка
{Документ.АрендаКниг.Форма.ФормаДокумента.Форма(50)}: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос.Выполнить();
через:
{(8, 13)}: Неправильные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов
Подписка <<?>>= &ПодпискаПользователя
Прикрепляю dt, моя версия 8.3.15.1830 (Код в Документы - ОрендаКниг - ФормаДокумента в модуле)
Прикрепленные файлы:
1Cv8.dt
По теме из базы знаний
Найденные решения
(31)
Реквизит формы АктуальнаяПодписка имеет тип строка.
Нужно либо изменить тип реквизита АктуальнаяПодписка на Справочник.Подписки в запрос в качестве параметра будет передаваться элемент справочника или заменить
на
Реквизит формы АктуальнаяПодписка имеет тип строка.
Нужно либо изменить тип реквизита АктуальнаяПодписка на Справочник.Подписки в запрос в качестве параметра будет передаваться элемент справочника или заменить
Запрос.УстановитьПараметр("ПодпискаПользователя" , ЭтаФорма.АктуальнаяПодписка);
на
Запрос.УстановитьПараметр("ПодпискаПользователя" , Справочники.Подписки.НайтиПоНаименованию(ЭтаФорма.АктуальнаяПодписка));
(33)
Я бы поменял у реквизита формы АктуальнаяПодписка тип на Справочники.Подписки
Для этого нужно подправить процедуру ПользовательПриИзмененииНаСервере() на следующую
Ну и для красоты у реквизита формы АктуальнаяПодписка установить свойства ПоложениеЗаголовка=Нет, КнопкаВыпадающегоСписка = Нет, КнопкаОткрытия=Нет, ПодсказкаВвода = Немає актуальної підписки
Я бы поменял у реквизита формы АктуальнаяПодписка тип на Справочники.Подписки
Для этого нужно подправить процедуру ПользовательПриИзмененииНаСервере() на следующую
Процедура ПользовательПриИзмененииНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПодпискиПользователейСрезПоследних.ДатаОкончания КАК ДатаОкончания,
//| ПодпискиПользователейСрезПоследних.Подписка.Наименование КАК ПодпискаНаименование
| ПодпискиПользователейСрезПоследних.Подписка КАК Подписка
|ИЗ
| РегистрСведений.ПодпискиПользователей.СрезПоследних(
| &ДатаДокумента,
| Пользователь = &ПользовательДокумента
| И ДатаОкончания >= &ДатаДокумента) КАК ПодпискиПользователейСрезПоследних";
Запрос.УстановитьПараметр("ПользовательДокумента" , Объект.Пользователь);
Запрос.УстановитьПараметр("ДатаДокумента" , Объект.Дата);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
//ЭтаФорма.АктуальнаяПодписка = "Немає актуальної підписки";
ЭтаФорма.АктуальнаяПодписка = Справочники.Подписки.ПустаяСсылка();
Возврат;
КонецЕсли;
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
ЭтаФорма.АктуальнаяПодписка = ВыборкаДетальныеЗаписи.Подписка;
КонецЕсли;
КонецПроцедуры
ПоказатьНу и для красоты у реквизита формы АктуальнаяПодписка установить свойства ПоложениеЗаголовка=Нет, КнопкаВыпадающегоСписка = Нет, КнопкаОткрытия=Нет, ПодсказкаВвода = Немає актуальної підписки
Прикрепленные файлы:

Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)укажите конкретную подписку(элемент справочника "подписки") в качестве параметра запроса, а не менеджер справочника.
что-то вроде:
или
что-то вроде:
Запрос.УстановитьПараметр("ПодпискаПользователя" , Справочники.Подписки.НайтиПоНаименованию("Подписка", Истина));
или
Запрос.УстановитьПараметр("ПодпискаПользователя" , Справочники.Подписки.ПредопределеннаяПодписка);
(7)
Первый вариант не подойдет, у меня есть разные подписки (Простая, Продвинутая).
А со вторым вариантом ошибка
{Документ.АрендаКниг.Форма.ФормаДокумента.Форма(47)}: Поле объекта не обнаружено (ПредопределеннаяПодписка)
Запрос.УстановитьПараметр("ПодпискаПользователя" , Справочники.Подписки.ПредопределеннаяПодписка);
Справочники.Подписки.ПредопределеннаяПодписка
Первый вариант не подойдет, у меня есть разные подписки (Простая, Продвинутая).
А со вторым вариантом ошибка
{Документ.АрендаКниг.Форма.ФормаДокумента.Форма(47)}: Поле объекта не обнаружено (ПредопределеннаяПодписка)
Запрос.УстановитьПараметр("ПодпискаПользователя" , Справочники.Подписки.ПредопределеннаяПодписка);
(10)
Вы вообще знаете, что есть предопределенные элементы справочника? Для чего служат? Как к ним обращаться в коде?
Судя по написанному - вообще не представляете.
В вашем коде установки значения параметра:
написана чушь.
Нужно использовать определенный элемент справочника "Подписки", а не весь справочник целиком(в данном случае - менеджер справочника).
Определенный элемент справочника:
Если нужны несколько значений, то создайте массив значений и именно массив передавайте в качестве параметра запроса:
Нет ПредопределеннаяПодписка. Названия подписок устанавливает справочник Подписки.
Вы вообще знаете, что есть предопределенные элементы справочника? Для чего служат? Как к ним обращаться в коде?
Судя по написанному - вообще не представляете.
В вашем коде установки значения параметра:
Запрос.УстановитьПараметр("ПодпискаПользователя" , Справочники.Подписки);
Нужно использовать определенный элемент справочника "Подписки", а не весь справочник целиком(в данном случае - менеджер справочника).
Определенный элемент справочника:
Справочники.Подписки.НайтиПоНаименованию("Простая", Истина);
Если нужны несколько значений, то создайте массив значений и именно массив передавайте в качестве параметра запроса:
".............
|ИЗ
| РегистрСведений.ПравилаИспользования.СрезПоследних(
| &ДатаДокумента,
| Подписка В (&ПодпискаПользователя)
| И Правило = &ПравилоКоличествоДнейВозврата) КАК ПравилаИспользованияСрезПоследних
|................."
Массив = Новый Массив;
Массив.Добавить(Справочники.Подписки.НайтиПоНаименованию("Простая", Истина));
Массив.Добавить(Справочники.Подписки.НайтиПоНаименованию("Сложная", Истина));
Запрос.УстановитьПараметр("ПодпискаПользователя" , Массив);
Показать
(20)Потому что Объект.Пользователь никогда не будет = ПустаяСтрока().
Проверять нужно на ЗначениеЗаполнено(Объект.Пользователь)
Проверять нужно на ЗначениеЗаполнено(Объект.Пользователь)
Если ЗначениеЗаполнено(Объект.Пользователь) И ВыборкаДетальныеЗаписи.Следующий() Тогда
Возврат Объект.Дата + 86400 * ВыборкаДетальныеЗаписи.Значение;
КонецЕсли;
(22) Если не указать пользователя то будет, или ошибаюсь? И у меня в условии если НЕ будет.
Через дебагер там не пустое значение, не выходит ничего с ВыборкаДетальныеЗаписи.Следующий(), если через Запрос.УстановитьПараметр("ПодпискаПользователя", АктуальнаяПодписка);
Через дебагер там не пустое значение, не выходит ничего с ВыборкаДетальныеЗаписи.Следующий(), если через Запрос.УстановитьПараметр("ПодпискаПользователя", АктуальнаяПодписка);
(23)У вас условие на НЕ пустую строку, т.е на заполненое значение.
Если пользователя не указать, то условие не выполнится.
ВыборкаДетальныеЗаписи.Следующий() дает ИСТИНА до тех пор, пока не дойдет до конца коллекции.
Если в выборке 0 записей, то будет всегда ЛОЖЬ.
Если пользователя не указать, то условие не выполнится.
ВыборкаДетальныеЗаписи.Следующий() дает ИСТИНА до тех пор, пока не дойдет до конца коллекции.
Если в выборке 0 записей, то будет всегда ЛОЖЬ.
(18) вот, так не работает
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПравилаИспользованияСрезПоследних.Значение КАК Значение,
| ПравилаИспользованияСрезПоследних.Подписка КАК Подписка
|ПОМЕСТИТЬ Вт_Правила
|ИЗ
| РегистрСведений.ПравилаИспользования.СрезПоследних(
| &ДатаДокумента,
| Подписка В (&ПодпискаПользователя)
| И Правило = &ПравилоКоличествоДнейВозврата) КАК ПравилаИспользованияСрезПоследних
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ПодпискиПользователейСрезПоследних.Подписка КАК Подписка
|ПОМЕСТИТЬ ВТ_ПодпискаПользователя
|ИЗ
| РегистрСведений.ПодпискиПользователей.СрезПоследних(&ДатаДокумента, Пользователь = &ПользовательДокумента) КАК ПодпискиПользователейСрезПоследних
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ПодпискаПользователя.Подписка КАК Подписка,
| Вт_Правила.Значение КАК Значение
|ИЗ
| Вт_Правила КАК Вт_Правила
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПодпискаПользователя КАК ВТ_ПодпискаПользователя
| ПО Вт_Правила.Подписка = ВТ_ПодпискаПользователя.Подписка";
Запрос.УстановитьПараметр("ДатаДокумента" , Объект.Дата);
Запрос.УстановитьПараметр("ПользовательДокумента" , Объект.Пользователь);
Запрос.УстановитьПараметр("ПодпискаПользователя" , АктуальнаяПодписка);
Запрос.УстановитьПараметр("ПравилоКоличествоДнейВозврата" , Перечисления.ПравилаИспользования.КоличествоДнейПользования);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если НЕ ПустаяСтрока(Объект.Пользователь) И ВыборкаДетальныеЗаписи.Следующий() Тогда
Возврат Объект.Дата + 86400 * ВыборкаДетальныеЗаписи.Значение;
КонецЕсли;
Возврат '00010101';
Показать
(5)
{Документ.АрендаКниг.Форма.ФормаДокумента.Форма(47)}: Поле объекта не обнаружено (Наименование)
Запрос.УстановитьПараметр("ПодпискаПользователя" , Справочники.Подписки.Наименование);
Запрос.УстановитьПараметр("ПодпискаПользователя" , Справочники.Подписки.Наименование);
{Документ.АрендаКниг.Форма.ФормаДокумента.Форма(47)}: Поле объекта не обнаружено (Наименование)
Запрос.УстановитьПараметр("ПодпискаПользователя" , Справочники.Подписки.Наименование);
(31)
Реквизит формы АктуальнаяПодписка имеет тип строка.
Нужно либо изменить тип реквизита АктуальнаяПодписка на Справочник.Подписки в запрос в качестве параметра будет передаваться элемент справочника или заменить
на
Реквизит формы АктуальнаяПодписка имеет тип строка.
Нужно либо изменить тип реквизита АктуальнаяПодписка на Справочник.Подписки в запрос в качестве параметра будет передаваться элемент справочника или заменить
Запрос.УстановитьПараметр("ПодпискаПользователя" , ЭтаФорма.АктуальнаяПодписка);
на
Запрос.УстановитьПараметр("ПодпискаПользователя" , Справочники.Подписки.НайтиПоНаименованию(ЭтаФорма.АктуальнаяПодписка));
(32)
Первый вариант не работает, видимо где-то на выводе нужно ещё что-то поправить.
Второй вариант работает, большое спасибо!!
И вопрос, какой из вариантов будет лучше?
Запрос.УстановитьПараметр("ПодпискаПользователя" , Справочники.Подписки.НайтиПоНаименованию(ЭтаФорма.АктуальнаяПодписка));
Первый вариант не работает, видимо где-то на выводе нужно ещё что-то поправить.
Второй вариант работает, большое спасибо!!
И вопрос, какой из вариантов будет лучше?
(33)
Я бы поменял у реквизита формы АктуальнаяПодписка тип на Справочники.Подписки
Для этого нужно подправить процедуру ПользовательПриИзмененииНаСервере() на следующую
Ну и для красоты у реквизита формы АктуальнаяПодписка установить свойства ПоложениеЗаголовка=Нет, КнопкаВыпадающегоСписка = Нет, КнопкаОткрытия=Нет, ПодсказкаВвода = Немає актуальної підписки
Я бы поменял у реквизита формы АктуальнаяПодписка тип на Справочники.Подписки
Для этого нужно подправить процедуру ПользовательПриИзмененииНаСервере() на следующую
Процедура ПользовательПриИзмененииНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПодпискиПользователейСрезПоследних.ДатаОкончания КАК ДатаОкончания,
//| ПодпискиПользователейСрезПоследних.Подписка.Наименование КАК ПодпискаНаименование
| ПодпискиПользователейСрезПоследних.Подписка КАК Подписка
|ИЗ
| РегистрСведений.ПодпискиПользователей.СрезПоследних(
| &ДатаДокумента,
| Пользователь = &ПользовательДокумента
| И ДатаОкончания >= &ДатаДокумента) КАК ПодпискиПользователейСрезПоследних";
Запрос.УстановитьПараметр("ПользовательДокумента" , Объект.Пользователь);
Запрос.УстановитьПараметр("ДатаДокумента" , Объект.Дата);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
//ЭтаФорма.АктуальнаяПодписка = "Немає актуальної підписки";
ЭтаФорма.АктуальнаяПодписка = Справочники.Подписки.ПустаяСсылка();
Возврат;
КонецЕсли;
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
ЭтаФорма.АктуальнаяПодписка = ВыборкаДетальныеЗаписи.Подписка;
КонецЕсли;
КонецПроцедуры
ПоказатьНу и для красоты у реквизита формы АктуальнаяПодписка установить свойства ПоложениеЗаголовка=Нет, КнопкаВыпадающегоСписка = Нет, КнопкаОткрытия=Нет, ПодсказкаВвода = Немає актуальної підписки
Прикрепленные файлы:

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