Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Программный код в запросе 1С          
Fabri Подменю пользователя
сообщение 17.12.13, 20:29
Сообщение #1

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 188
Спасибо сказали: 56 раз
Рейтинг: 0

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

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


Прошу подправить и показать как правильно. Спасибо.

Ardi Подменю пользователя
сообщение 17.12.13, 20:56
Сообщение #2

Живет на форуме
***********
Гений телепатии и социального моделирования
Группа: Пользователи
Сообщений: 4121
Из: Киев
Спасибо сказали: 957 раз
Рейтинг: 0

ПОДСТРОКА(Номенклатура.Наименование, 1, 6) = &Имя


Signature
Услуги 1С программиста 8.2, 7.7 (Плохо, дорого, очередь). Киев.

Fabri Подменю пользователя
сообщение 17.12.13, 21:00
Сообщение #3

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 188
Спасибо сказали: 56 раз
Рейтинг: 0

Оно бы катило если знать точную длину наименования, но текст до пробела может быть как 5 так и 20 символов, поэтому функция ПОДСТРОКА тут не катит sad.gif

Ardi Подменю пользователя
сообщение 17.12.13, 21:02
Сообщение #4

Живет на форуме
***********
Гений телепатии и социального моделирования
Группа: Пользователи
Сообщений: 4121
Из: Киев
Спасибо сказали: 957 раз
Рейтинг: 0

Перед выполнением запроса мы знаем длину.


Signature
Услуги 1С программиста 8.2, 7.7 (Плохо, дорого, очередь). Киев.

Fabri Подменю пользователя
сообщение 17.12.13, 21:06
Сообщение #5

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 188
Спасибо сказали: 56 раз
Рейтинг: 0

Правильно, только вот беда в том что
Запрос.УстановитьПараметр("Имя", ГруппаИменФайла);

Где ГруппаИменФайла это массив строк, а не строка.

Ardi Подменю пользователя
сообщение 17.12.13, 21:16
Сообщение #6

Живет на форуме
***********
Гений телепатии и социального моделирования
Группа: Пользователи
Сообщений: 4121
Из: Киев
Спасибо сказали: 957 раз
Рейтинг: 0

Поместить ГруппаИменФайла в виртуальную таблицу запроса. А потом сделать объединение со справочником наподобие:
ПОДСТРОКА(Номенклатура.Наименование, 1, 1) = Т1.Имя или ПОДСТРОКА(Номенклатура.Наименование, 1, 2) = Т1.Имя или ПОДСТРОКА(Номенклатура.Наименование, 1, 3) = Т1.Имя или ПОДСТРОКА(Номенклатура.Наименование, 1, 4) = Т1.Имя или .................


Сообщение отредактировал Ardi - 17.12.13, 21:16


Signature
Услуги 1С программиста 8.2, 7.7 (Плохо, дорого, очередь). Киев.

Fabri Подменю пользователя
сообщение 17.12.13, 22:14
Сообщение #7

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 188
Спасибо сказали: 56 раз
Рейтинг: 0

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


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

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

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

Ardi Подменю пользователя
сообщение 17.12.13, 22:17
Сообщение #8

Живет на форуме
***********
Гений телепатии и социального моделирования
Группа: Пользователи
Сообщений: 4121
Из: Киев
Спасибо сказали: 957 раз
Рейтинг: 0

Может так? Смотря какая задача.
Запрос.УстановитьПараметр("Имя", Элемент+" ");
Запрос.УстановитьПараметр("ДлинСтр", СтрДлина(Элемент + " "));


Signature
Услуги 1С программиста 8.2, 7.7 (Плохо, дорого, очередь). Киев.

Спасибо сказали: Fabri,

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 03.07.25, 14:44
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!