Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Программный код в запросе 1С
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
Fabri
Добрый день. Столкнулся с такой проблемой: Запрос для выбора элемента справочника номенклатура, но выбирать нужно не по точному соответствию, а обрезать наименование до первого пробела.
Пример, есть номенклатура с именем "Абвгд наш товар", нужно осуществлять сверку наименования не по всему имени, а только до первого пробела, т.е. "Абвгд".
Вот код запроса:

    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |    Номенклатура.Ссылка
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Лев(Номенклатура.Наименование,Найти(Номенклатура.Наименование, " ")) В (&Имя) //Это я тут намудрил (по логике так нужно), так как не знаю как использовать код 1с в запросе
        |    И Номенклатура.ЭтоГруппа = ЛОЖЬ";
        
    Запрос.УстановитьПараметр("Имя", ГруппаИменФайла);


Прошу подправить и показать как правильно. Спасибо.
Ardi
ПОДСТРОКА(Номенклатура.Наименование, 1, 6) = &Имя
Fabri
Оно бы катило если знать точную длину наименования, но текст до пробела может быть как 5 так и 20 символов, поэтому функция ПОДСТРОКА тут не катит sad.gif
Ardi
Перед выполнением запроса мы знаем длину.
Fabri
Правильно, только вот беда в том что
Запрос.УстановитьПараметр("Имя", ГруппаИменФайла);

Где ГруппаИменФайла это массив строк, а не строка.
Ardi
Поместить ГруппаИменФайла в виртуальную таблицу запроса. А потом сделать объединение со справочником наподобие:
ПОДСТРОКА(Номенклатура.Наименование, 1, 1) = Т1.Имя или ПОДСТРОКА(Номенклатура.Наименование, 1, 2) = Т1.Имя или ПОДСТРОКА(Номенклатура.Наименование, 1, 3) = Т1.Имя или ПОДСТРОКА(Номенклатура.Наименование, 1, 4) = Т1.Имя или .................
Fabri
В таком случае уже проще будет осуществить перебор элементов массива в цикле и уже вызывать запрос с параметрами
Для А=1 По Массив.Количество Цикл
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
|    Номенклатура.Ссылка
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|    ПОДСТРОКА(Номенклатура.Наименование,1,&ДлинСтр) = &Имя
|    И Номенклатура.ЭтоГруппа = ЛОЖЬ";
        
Запрос.УстановитьПараметр("Имя", Массив.Получить(А);
Запрос.УстановитьПараметр("ДлинСтр", СтрДлина(Массив.Получить(А)));


Конечно запрос в цикле это не кошерно, но все же проще, тем более что элементов в массиве будет не больше 10-ти.

Даже не так сделал, а так как писал
Цитата
В таком случае уже проще будет осуществить перебор элементов массива в цикле

Для Каждого Элемент ИЗ Массив Цикл
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
|    Номенклатура.Ссылка
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|    ПОДСТРОКА(Номенклатура.Наименование,1,&ДлинСтр) = &Имя
|    И Номенклатура.ЭтоГруппа = ЛОЖЬ";
        
Запрос.УстановитьПараметр("Имя", Элемент;
Запрос.УстановитьПараметр("ДлинСтр", СтрДлина(Элемент));
Ardi
Может так? Смотря какая задача.
Запрос.УстановитьПараметр("Имя", Элемент+" ");
Запрос.УстановитьПараметр("ДлинСтр", СтрДлина(Элемент + " "));
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.