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

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

    Запрос.УстановитьПараметр("ДатаДокумента" , Объект.Дата);
    Запрос.УстановитьПараметр("ПодпискаПользователя" , Справочники.Подписки);
    Запрос.УстановитьПараметр("ПравилоКоличествоДнейВозврата" , Перечисления.ПравилаИспользования.КоличествоДнейПользования);
    Запрос.УстановитьПараметр("ПользовательДокумента" , Объект.Пользователь);

    РезультатЗапроса = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

    Если НЕ ПустаяСтрока(Объект.Пользователь) И ВыборкаДетальныеЗаписи.Следующий() Тогда
    Возврат Объект.Дата + 86400 * ВыборкаДетальныеЗаписи.Значение;
    КонецЕсли;

    Возврат '00010101';
```

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

Прикрепляю dt, моя версия 8.3.15.1830 (Код в Документы - ОрендаКниг - ФормаДокумента в модуле)
---
Реквизит формы АктуальнаяПодписка имеет тип строка.
Нужно либо изменить тип реквизита АктуальнаяПодписка на Справочник.Подписки в запрос в качестве параметра будет передаваться элемент справочника или заменить

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

на

```1c
    Запрос.УстановитьПараметр("ПодпискаПользователя" , Справочники.Подписки.НайтиПоНаименованию(ЭтаФорма.АктуальнаяПодписка));
```
---
Я бы поменял у реквизита формы АктуальнаяПодписка тип на Справочники.Подписки
Для этого нужно подправить процедуру ПользовательПриИзмененииНаСервере() на следующую

```1c
    Процедура ПользовательПриИзмененииНаСервере()

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ПодпискиПользователейСрезПоследних.ДатаОкончания КАК ДатаОкончания,
    //| ПодпискиПользователейСрезПоследних.Подписка.Наименование КАК ПодпискаНаименование
    | ПодпискиПользователейСрезПоследних.Подписка КАК Подписка
    |ИЗ
    | РегистрСведений.ПодпискиПользователей.СрезПоследних(
    | &ДатаДокумента,
    | Пользователь = &ПользовательДокумента
    | И ДатаОкончания >= &ДатаДокумента) КАК ПодпискиПользователейСрезПоследних";

    Запрос.УстановитьПараметр("ПользовательДокумента" , Объект.Пользователь);
    Запрос.УстановитьПараметр("ДатаДокумента" , Объект.Дата);

    РезультатЗапроса = Запрос.Выполнить();

    Если РезультатЗапроса.Пустой() Тогда
    //ЭтаФорма.АктуальнаяПодписка = "Немає актуальної підписки";
    ЭтаФорма.АктуальнаяПодписка = Справочники.Подписки.ПустаяСсылка();
    Возврат;
    КонецЕсли;

    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

    Если ВыборкаДетальныеЗаписи.Следующий() Тогда
    ЭтаФорма.АктуальнаяПодписка = ВыборкаДетальныеЗаписи.Подписка;
    КонецЕсли;

    КонецПроцедуры
```

Ну и для красоты у реквизита формы АктуальнаяПодписка установить свойства ПоложениеЗаголовка=Нет, КнопкаВыпадающегоСписка = Нет, КнопкаОткрытия=Нет, ПодсказкаВвода = Немає актуальної підписки
---
Тип у ПравилаИспользованияСрезПоследних.Подписка ? какой

ИМХО - в Регистре у вас Подписка = Строка, а в запросе Справочники.Подписки
---
Видимо вы имели ввиду Справочники.Подписки?
---
И как исправить? Как в запросе указать что это строка?
---
укажите конкретную подписку(элемент справочника "подписки") в качестве параметра запроса, а не менеджер справочника.
что-то вроде:

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

или

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

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

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

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

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

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

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

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

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

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

    Запрос.УстановитьПараметр("ПодпискаПользователя" , Массив);
```
---
Массив = Новый Массив;
В вашем варианте есть одно но. Если пользователь решит изменить название подписки или добавить новое, то без новой строчки Массив.Добавить(Справочники.Подписки.НайтиПоНаименованию("НАЗВАНИЕ_ПОДПИСКИ", Истина)); как он это сделает?
---
если пользователь рулит отбором по подпискам, то в таком случае, необходимо на форму вынести реквизит вида СписокЗначений, чтобы пользователь набивал нужные и в зависимости от заполненности реквизита формы в самом запросе включается отбор.
---
возможно есть место быть
Запрос.УстановитьПараметр("ПодпискаПользователя" , ЭтаФорма.АктуальнаяПодписка);
---
возможно, если оно выведено на форму. Можно просто

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

в случае, если "АктуальнаяПодписка" - реквизит формы.
---
Да, реквизит формы. Но такой код не работает
---
не идёт в возврат
---
Потому что Объект.Пользователь никогда не будет = ПустаяСтрока().

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

```1c
    Если ЗначениеЗаполнено(Объект.Пользователь) И ВыборкаДетальныеЗаписи.Следующий() Тогда
    Возврат Объект.Дата + 86400 * ВыборкаДетальныеЗаписи.Значение;
    КонецЕсли;
```
---
Если не указать пользователя то будет, или ошибаюсь? И у меня в условии если НЕ будет.
Через дебагер там не пустое значение, не выходит ничего с ВыборкаДетальныеЗаписи.Следующий(), если через Запрос.УстановитьПараметр("ПодпискаПользователя", АктуальнаяПодписка);
---
У вас условие на НЕ пустую строку, т.е на заполненое значение.
Если пользователя не указать, то условие не выполнится.

ВыборкаДетальныеЗаписи.Следующий() дает ИСТИНА до тех пор, пока не дойдет до конца коллекции.
Если в выборке 0 записей, то будет всегда ЛОЖЬ.
---
Да, верно. Но с ВыборкаДетальныеЗаписи.Следующий() я ничего не получаю, хотя там есть запись
---
вот, так не работает

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

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

    Запрос.УстановитьПараметр("ПравилоКоличествоДнейВозврата" , Перечисления.ПравилаИспользования.КоличествоДнейПользования);

    РезультатЗапроса = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

    Если НЕ ПустаяСтрока(Объект.Пользователь) И ВыборкаДетальныеЗаписи.Следующий() Тогда
    Возврат Объект.Дата + 86400 * ВыборкаДетальныеЗаписи.Значение;
    КонецЕсли;

    Возврат '00010101';
```
---
но да, такой код работает. Правда не то что нужно
---
Запрос.УстановитьПараметр("ПодпискаПользователя" , Справочники.Подписки.Наименование);
---
Запрос.УстановитьПараметр("ПодпискаПользователя" , Справочники.Подписки.Наименование);

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

```1c
    Запрос.УстановитьПараметр("ПодпискаПользователя" , ЭтаФорма.АктуальнаяПодписка);
```
---
Наименование
Нет ошибок, но запрос ничего не возвращает
---
В справочнике Подписки нет элемента с наименованием "Простая".

```1c
    Массив.Добавить(Справочники.Подписки.НайтиПоНаименованию("Простая", Истина));
    Заменить на
    Массив.Добавить(Справочники.Подписки.НайтиПоКоду("000000001", Истина));
```
---
есть
---
Где есть? У вас написано слово Проста, а не Простая. Ищите элементы по коду.
---
А Простая здесь при чем?
Не нужно в коде указывать наименование подписки. Человек может захотеть изменить/добавить подписку. Выше писал об этом.
---
У вас сейчас все правильно отрабатывает? Если нет, то напишите что не работает и приложите выгрузку базы.
---
можно с элемента формы получить какая подписка у пользователя, не нужно в коде указывать какая подписка. Комментарии в документе написал

Документ ОрендаКниг, код в модуле ФормыДокумента.
Функция ПолучитьПлановоюДатуВозврата()
---
Реквизит формы АктуальнаяПодписка имеет тип строка.
Нужно либо изменить тип реквизита АктуальнаяПодписка на Справочник.Подписки в запрос в качестве параметра будет передаваться элемент справочника или заменить

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

на

```1c
    Запрос.УстановитьПараметр("ПодпискаПользователя" , Справочники.Подписки.НайтиПоНаименованию(ЭтаФорма.АктуальнаяПодписка));
```
---
Запрос.УстановитьПараметр("ПодпискаПользователя" , Справочники.Подписки.НайтиПоНаименованию(ЭтаФорма.АктуальнаяПодписка));

Первый вариант не работает, видимо где-то на выводе нужно ещё что-то поправить.
Второй вариант работает, большое спасибо!!
И вопрос, какой из вариантов будет лучше?
---
Я бы поменял у реквизита формы АктуальнаяПодписка тип на Справочники.Подписки
Для этого нужно подправить процедуру ПользовательПриИзмененииНаСервере() на следующую

```1c
    Процедура ПользовательПриИзмененииНаСервере()

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ПодпискиПользователейСрезПоследних.ДатаОкончания КАК ДатаОкончания,
    //| ПодпискиПользователейСрезПоследних.Подписка.Наименование КАК ПодпискаНаименование
    | ПодпискиПользователейСрезПоследних.Подписка КАК Подписка
    |ИЗ
    | РегистрСведений.ПодпискиПользователей.СрезПоследних(
    | &ДатаДокумента,
    | Пользователь = &ПользовательДокумента
    | И ДатаОкончания >= &ДатаДокумента) КАК ПодпискиПользователейСрезПоследних";

    Запрос.УстановитьПараметр("ПользовательДокумента" , Объект.Пользователь);
    Запрос.УстановитьПараметр("ДатаДокумента" , Объект.Дата);

    РезультатЗапроса = Запрос.Выполнить();

    Если РезультатЗапроса.Пустой() Тогда
    //ЭтаФорма.АктуальнаяПодписка = "Немає актуальної підписки";
    ЭтаФорма.АктуальнаяПодписка = Справочники.Подписки.ПустаяСсылка();
    Возврат;
    КонецЕсли;

    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

    Если ВыборкаДетальныеЗаписи.Следующий() Тогда
    ЭтаФорма.АктуальнаяПодписка = ВыборкаДетальныеЗаписи.Подписка;
    КонецЕсли;

    КонецПроцедуры
```

Ну и для красоты у реквизита формы АктуальнаяПодписка установить свойства ПоложениеЗаголовка=Нет, КнопкаВыпадающегоСписка = Нет, КнопкаОткрытия=Нет, ПодсказкаВвода = Немає актуальної підписки
---
Большое вам спасибо!!!
---
У вас для реквизита формы АктуальнаяПодписка установлен тип Строка, а нужен СправочникСсылка.Подписки. И переделать как в (34) Тогда будет работать.
---
да. в (34) работает, спасибо