Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
19 янв 2026, 10:32

программно добавить параметры в запрос

Автор sali, 16 янв 2026, 19:35

0 Пользователей и 1 гость просматривают эту тему.

sali

были проблемы с выгрузкой через скд, и пришлось запрос написать на форме , а параметры отбора брать со старой скд и пихать в запрос. так вот появилась такая ошибка если сразу 2 параметра забиваешь , или 1 (который тоже странно себя ведет, должен быть справочник , а там перечисление параметров)
запрос
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ДисконтныеКарты.Ссылка КАК ДисконтнаяКарта,
| ИСТИНА КАК Выбран,
| ДисконтныеКарты.КодКартыШтрихкод КАК КодКартыШтрихкод,
| ДисконтныеКарты.ВладелецКарты КАК ВладелецКарты,
| ДисконтныеКарты.Владелец КАК ВидДисконтнойКарты,
| БонусныеБаллыОстатки.НачисленоОстаток - БонусныеБаллыОстатки.КСписаниюОстаток КАК Бонусы,
| ПродажиПоДисконтнымКартамОбороты.СуммаОборот КАК СуммаПродаж
|{ВЫБРАТЬ
| Выбран,
| ДисконтнаяКарта.*,
| КодКартыШтрихкод,
| ВладелецКарты.*,
| ВидДисконтнойКарты.*,
| Бонусы,
| СуммаПродаж}
|ИЗ
| Справочник.ДисконтныеКарты КАК ДисконтныеКарты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.БонусныеБаллы.Остатки КАК БонусныеБаллыОстатки
| ПО ДисконтныеКарты.Ссылка = БонусныеБаллыОстатки.БонуснаяКарта
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПродажиПоДисконтнымКартам.Обороты(, , Авто, ) КАК ПродажиПоДисконтнымКартамОбороты
| ПО ДисконтныеКарты.Ссылка = ПродажиПоДисконтнымКартамОбороты.ДисконтнаяКарта
|ГДЕ
| НЕ ДисконтныеКарты.ПометкаУдаления
|%Условие1% %Условие2%";
Если КомпоновщикНастроек.Настройки.Отбор.Элементы[1].Использование  Тогда

Если КомпоновщикНастроек.Настройки.Отбор.Элементы[1].ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке
ИЛИ КомпоновщикНастроек.Настройки.Отбор.Элементы[1].ВидСравнения = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии
ИЛИ КомпоновщикНастроек.Настройки.Отбор.Элементы[1].ВидСравнения = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии
ИЛИ КомпоновщикНастроек.Настройки.Отбор.Элементы[1].ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке
ИЛИ КомпоновщикНастроек.Настройки.Отбор.Элементы[1].ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСпискеПоИерархии Тогда

Запрос.Текст = СтрЗаменить(Запрос.Текст,"%Условие1%"," И ДисконтныеКарты.Ссылка В (&Карта)");
МассивКарт = НОвый Массив ();
Для Каждого Строка Из КомпоновщикНастроек.Настройки.Отбор.Элементы[1].ПравоеЗначение Цикл
МассивКарт.Добавить(Строка.Значение);
КонецЦикла;
Запрос.УстановитьПараметр("Карта",МассивКарт);
ИначеЕсли КомпоновщикНастроек.Настройки.Отбор.Элементы[1].ВидСравнения = ВидСравненияКомпоновкиДанных.Равно Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст,"%Условие1%"," И ДисконтныеКарты.Ссылка = &Карта");
Запрос.УстановитьПараметр("Карта",КомпоновщикНастроек.Настройки.Отбор.Элементы[1].ПравоеЗначение); 
ИначеЕсли КомпоновщикНастроек.Настройки.Отбор.Элементы[1].ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст,"%Условие1%"," И НЕ ДисконтныеКарты.Ссылка = &Карта");
Запрос.УстановитьПараметр("Карта",КомпоновщикНастроек.Настройки.Отбор.Элементы[1].ПравоеЗначение);
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст,"%Условие1%","");

КонецЕсли;
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст,"%Условие1%","");
КонецЕсли;

Если КомпоновщикНастроек.Настройки.Отбор.Элементы[0].Использование Тогда   

Если КомпоновщикНастроек.Настройки.Отбор.Элементы[0].ВидСравнения = ВидСравненияКомпоновкиДанных.Равно Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст,"%Условие2%"," И ДисконтныеКарты.Владелец = &ВидКарты");
Запрос.УстановитьПараметр("ВидКарты",КомпоновщикНастроек.Настройки.Отбор.Элементы[0].ПравоеЗначение);   
ИначеЕсли КомпоновщикНастроек.Настройки.Отбор.Элементы[0].ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке
ИЛИ КомпоновщикНастроек.Настройки.Отбор.Элементы[0].ВидСравнения = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии
ИЛИ КомпоновщикНастроек.Настройки.Отбор.Элементы[0].ВидСравнения = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии
ИЛИ КомпоновщикНастроек.Настройки.Отбор.Элементы[0].ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке
ИЛИ КомпоновщикНастроек.Настройки.Отбор.Элементы[0].ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСпискеПоИерархии Тогда

Запрос.Текст = СтрЗаменить(Запрос.Текст,"%Условие2%"," И ДисконтныеКарты.Владелец В (&ВидКарты)");
МассивВидов = НОвый Массив ();
Для Каждого Строка Из КомпоновщикНастроек.Настройки.Отбор.Элементы[0].ПравоеЗначение Цикл
МассивВидов.Добавить(Строка.Значение);
КонецЦикла;
Запрос.УстановитьПараметр("ВидКарты",МассивВидов);   

ИначеЕсли КомпоновщикНастроек.Настройки.Отбор.Элементы[0].ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст,"%Условие2%"," И НЕ ДисконтныеКарты.Владелец = &ВидКарты");
Запрос.УстановитьПараметр("ВидКарты",КомпоновщикНастроек.Настройки.Отбор.Элементы[0].ПравоеЗначение);   
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст,"%Условие2%","");
КонецЕсли;
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст,"%Условие2%","");
КонецЕсли;

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

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

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


получившийся вопрос
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ДисконтныеКарты.Ссылка КАК ДисконтнаяКарта,
ИСТИНА КАК Выбран,
ДисконтныеКарты.КодКартыШтрихкод КАК КодКартыШтрихкод,
ДисконтныеКарты.ВладелецКарты КАК ВладелецКарты,
ДисконтныеКарты.Владелец КАК ВидДисконтнойКарты,
БонусныеБаллыОстатки.НачисленоОстаток - БонусныеБаллыОстатки.КСписаниюОстаток КАК Бонусы,
ПродажиПоДисконтнымКартамОбороты.СуммаОборот КАК СуммаПродаж
{ВЫБРАТЬ
Выбран,
ДисконтнаяКарта.*,
КодКартыШтрихкод,
ВладелецКарты.*,
ВидДисконтнойКарты.*,
Бонусы,
СуммаПродаж}
ИЗ
Справочник.ДисконтныеКарты КАК ДисконтныеКарты
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.БонусныеБаллы.Остатки КАК БонусныеБаллыОстатки
ПО ДисконтныеКарты.Ссылка = БонусныеБаллыОстатки.БонуснаяКарта
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПродажиПоДисконтнымКартам.Обороты(, , Авто, ) КАК ПродажиПоДисконтнымКартамОбороты
ПО ДисконтныеКарты.Ссылка = ПродажиПоДисконтнымКартамОбороты.ДисконтнаяКарта
ГДЕ
НЕ ДисконтныеКарты.ПометкаУдаления
 И ДисконтныеКарты.Ссылка = &Карта И ДисконтныеКарты.Владелец = &ВидКарты

почему выходит ошибка? где мой косяк?

LexaK

sali, какаято неистребимая тяга к гов-коду

вот такое сравнение
ДисконтныеКарты.Владелец В (&ВидКарты)
включает и такое
ДисконтныеКарты.Владелец = &ВидКарты;
поэтому его не надо отдельно программировать

и еще совет, для динамического формирования нескольких условий
можно использовать такой прием

в секции где вставить такой код
где
    ВашыУсловия
    и 0 = 0
заменяется так
Запрос.Текст = СтрЗаменить(Запрос.Текст,"0 = 0", ВашеУсловие + " и 0 = 0");
так можно несколько раз добавить свои отборы,
и даже если доп.отборов нет, то из текста запроса это
0 = 0
убирать не надо

и еще - конструктором не ломается!

и еще, для сообразительных, если запрос очень большой и в разные места
нужно добавить разные отборы, то в разных секциях Где можно расставить

...
и 0 = 0
...
и 1 = 1

...
и 2 = 2

и тд
 


если помогло нажмите: Спасибо!

sali

Цитата: LexaK от 16 янв 2026, 21:56ДисконтныеКарты.Владелец В (&ВидКарты)
включает и такое
ДисконтныеКарты.Владелец = &ВидКарты;
поэтому его не надо отдельно программировать

почему? первое это ведь список значений , а второе точно выбранное

Цитата: LexaK от 16 янв 2026, 21:56вставить такой код
у меня прописано похоже на ваш

Цитата: LexaK от 16 янв 2026, 21:56и еще, для сообразительных, если запрос очень большой
круто, но у меня не большой запрос и условия для отбора я могу скопировать, а после редактирования обратно поставить в конце. мне не составит труда. что так сорвались то?

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск