Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

ПОДОБНО в запросе

ПОДОБНО в запросе
Я
   Mikhail Volkov
 
11.11.18 - 11:51
Альфа-Авто. Раньше за услугу "Стоянка автомобиля" плату не брали. Теперь решили брать с тех кто не сдает автомобиль в ремонт, а просто оставляет. В документе "Акт об оказании услуг" есть реквизит Автомобиль, но чтобы его занести нужно заполнить кучу параметров необходимых для ремонта. А для стоянки достаточно гос. номера. Поэтому в акт сделал реквизит Автомобиль составным, добавил тип Строка для занесения в нее гос. номера. Но все же желательно если Автомобиль есть в базе, то Строка заменялась им. Для этого написал функцию:

// Возвращает Автомобиль (если найден) по строке, к которой гос. номер указан

//
Функция АвтомобильПоГосНомеру(СтрокаАвтомобиль, ГосНомер = "") Экспорт
    
    СтрАвтомобиль = СтрЗаменить(ВРег(СтрокаАвтомобиль), "-", "");
    СтрАвтомобиль = СтрЗаменить(СтрАвтомобиль, " ", "");
    
    Автомобиль = Справочники.Автомобили.ПустаяСсылка();
    Если СтрДлина(СтрокаАвтомобиль) < 8 Тогда
        Возврат Автомобиль;
    КонецЕсли;
    
    // Замена английских символов русскими

    СтрАвтомобиль = СтрЗаменить(СтрАвтомобиль,"A","А");
    СтрАвтомобиль = СтрЗаменить(СтрАвтомобиль,"B","В");
    СтрАвтомобиль = СтрЗаменить(СтрАвтомобиль,"E","Е");
    СтрАвтомобиль = СтрЗаменить(СтрАвтомобиль,"K","К");
    СтрАвтомобиль = СтрЗаменить(СтрАвтомобиль,"M","М");
    СтрАвтомобиль = СтрЗаменить(СтрАвтомобиль,"H","Н");
    СтрАвтомобиль = СтрЗаменить(СтрАвтомобиль,"O","О");
    СтрАвтомобиль = СтрЗаменить(СтрАвтомобиль,"P","Р");
    СтрАвтомобиль = СтрЗаменить(СтрАвтомобиль,"C","С");
    СтрАвтомобиль = СтрЗаменить(СтрАвтомобиль,"T","Т");
    СтрАвтомобиль = СтрЗаменить(СтрАвтомобиль,"Y","У");
    СтрАвтомобиль = СтрЗаменить(СтрАвтомобиль,"X","Х");
    
    Запрос = Новый Запрос; 
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    АвтомобилиСрезПоследних.Автомобиль,
    |    АвтомобилиСрезПоследних.Значение
    |ИЗ
    |    РегистрСведений.Автомобили.СрезПоследних КАК АвтомобилиСрезПоследних
    |ГДЕ
    |    АвтомобилиСрезПоследних.ВидЗначения = ЗНАЧЕНИЕ(Перечисление.ДополнительнаяИнформацияАвтомобилей.ГосНомер)
    |
    |УПОРЯДОЧИТЬ ПО
    |    АвтомобилиСрезПоследних.Период УБЫВ";
    
    Выборка = Запрос.Выполнить().Выбрать(); 
    Пока Выборка.Следующий() Цикл
        Если Найти(СтрАвтомобиль, Выборка.Значение) > 0 Тогда
            ГосНомер = Выборка.Значение;
            Возврат Выборка.Автомобиль;
        КонецЕсли;
    КонецЦикла;
    Возврат Автомобиль;
    
КонецФункции// АвтомобильПоГосНомеру()
 
 
   Mikhail Volkov
 
1 - 11.11.18 - 11:52
РегистрСведений.Автомобили.СрезПоследних КАК АвтомобилиСрезПоследних
от фонаря написал. Правильно ли сделал?
   ktibo
 
2 - 11.11.18 - 13:15
А юзеры теперь каждый раз тип реквизита выбирают (строка или справочник)?
   Mikhail Volkov
 
3 - 11.11.18 - 13:32
(0) Сам вопрос забыл написать: а нельзя ли в запросе использовать ПОДОБНО для ускорения запроса?
(2) Ну если автомобиль знакомый, был в ремонте, есть в базе, то из справочника. А если нет, то строкой.
   Кирпич
 
4 - 11.11.18 - 15:33
(3) для ускорения надо писать "ПОДОБНО МОЛНИИ"
   Mikhail Volkov
 
5 - 11.11.18 - 17:21
(4) Как другим способом ускорить? И насчет СрезПоследних, правильно?
   Вася Теркин
 
6 - 11.11.18 - 17:25
Жуть " если автомобиль есть в базе накине. Ему деньжат" то есть вашим клиентом лучше не становиться. Ибо незнакомым авто счет выставить не получится...
   Вася Теркин
 
7 - 11.11.18 - 17:27
Интересно как средний ценник по ремонту коррелирует со средним ценником по стоянке. Ваша рентабельность действительно в глубокой заднице?
   youalex
 
8 - 11.11.18 - 17:28
   vi0
 
9 - 11.11.18 - 17:28
а в чем проблема то?
   Вася Теркин
 
10 - 11.11.18 - 17:29
Прикольно "если автомобиль есть в базе..." А если нету? Вы ему задним числом будете счет выставлять за стоянку? А он с вами подписывался платить за стоянку или это кабальная сделка?
 
 Рекламное место пустует
   Mikhail Volkov
 
11 - 11.11.18 - 17:41
(10) Если нет, то реквизит автомобиль строкой, например, только гос.номер.
   Mikhail Volkov
 
12 - 12.11.18 - 11:15
ПОДОБНО вряд ли здесь поможет. А вот по поводу СрезПоследних, переписал текст запроса так

    Запрос.Текст = "
    |ВЫБРАТЬ
    |    АвтомобилиСрезПоследних.Автомобиль,
    |    АвтомобилиСрезПоследних.Значение
    |ИЗ
    |    РегистрСведений.Автомобили.СрезПоследних(
    |    &Дата, 
    |    ЗНАЧЕНИЕ(Перечисление.ДополнительнаяИнформацияАвтомобилей.ГосНомер)) КАК АвтомобилиСрезПоследних";
    
    Запрос.УстановитьПараметр("Дата", ТекущаяДата());

Ошибку дает:
Неверные параметры "РегистрСведений.Автомобили.СрезПоследних, 1" 
ЗНАЧЕНИЕ(<<?>>Перечисление.ДополнительнаяИнформацияАвтомобилей.ГосНомер)) КАК АвтомобилиСрезПоследних

Что ни так?
   иубиповец
 
13 - 12.11.18 - 11:46
(12) запрос сам должен догадаться к чему это условие относится значение = ЗНАЧЕНИЕ(Перечисление.ДополнительнаяИнформацияАвтомобилей.ГосНомер))

А чем  не подходит то Подобно %ААА666А%
   PR
 
14 - 12.11.18 - 11:50
(0) Ма. Ла. Дец.
   catena
 
15 - 12.11.18 - 12:22
" Если Найти(СтрАвтомобиль, Выборка.Значение) > 0"
"ПОДОБНО вряд ли здесь поможет."

А для чего, по-вашему, вообще ПОДОБНО?
   Mikhail Volkov
 
16 - 12.11.18 - 14:57
(15) А так можно?
    |    &Дата, 
    |    ВидЗначения = ЗНАЧЕНИЕ(Перечисление.ДополнительнаяИнформацияАвтомобилей.ГосНомер)) КАК АвтомобилиСрезПоследних
    |    И &СтрАвтомобиль ПОДОБНО АвтомобилиСрезПоследних.Значение";
   Mikhail Volkov
 
17 - 12.11.18 - 15:02
Не, так;
    |    &Дата, 
    |    ВидЗначения = ЗНАЧЕНИЕ(Перечисление.ДополнительнаяИнформацияАвтомобилей.ГосНомер)
    |    И &СтрАвтомобиль ПОДОБНО Значение) КАК АвтомобилиСрезПоследних";

    Запрос.УстановитьПараметр("Дата", ТекущаяДата());
    Запрос.УстановитьПараметр("СтрАвтомобиль", %СтрАвтомобиль%);
   catena
 
18 - 13.11.18 - 06:01
(17)Нет, так нельзя. Можно
    |    И Значение ПОДОБНО &СтрАвтомобиль) КАК АвтомобилиСрезПоследних";

    Запрос.УстановитьПараметр("СтрАвтомобиль", "%"+СокрЛП(СтрАвтомобиль)+"%");
   Mikhail Volkov
 
19 - 13.11.18 - 06:51
(18) Жаль, мне нужно в строке СтрАвтомобиль найти (проверить содержится ли) подстроку ГосНомер (т.е. Значение).
В СтрАвтомобиль пользователь может написать любую информацию о  автомобиле: цвет, марку... кроме гос. номера.
   МимохожийОднако
 
20 - 13.11.18 - 06:52
(0) Кто запретил добавить реквизит ГосНомер и использовать его?
   catena
 
21 - 13.11.18 - 07:02
(19)Понятно. Ну, тогда да, наоборот. И проценты прибавлять наоборот.
   catena
 
22 - 13.11.18 - 07:03
|    И &СтрАвтомобиль ПОДОБНО ""%""+Выразить(Значение как строка(100))+""%"" ) КАК АвтомобилиСрезПоследних";

    Запрос.УстановитьПараметр("СтрАвтомобиль", СокрЛП(СтрАвтомобиль));
   Mikhail Volkov
 
23 - 13.11.18 - 07:57
(22) Спс, так заработало!

    Запрос = Новый Запрос; 
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    АвтомобилиСрезПоследних.Автомобиль,
    |    АвтомобилиСрезПоследних.Значение
    |ИЗ
    |    РегистрСведений.Автомобили.СрезПоследних(
    |            &Дата,
    |            ВидЗначения = ЗНАЧЕНИЕ(Перечисление.ДополнительнаяИнформацияАвтомобилей.ГосНомер)
    |                И &СтрАвтомобиль ПОДОБНО ""%"" + (ВЫРАЗИТЬ(Значение КАК СТРОКА(100))) + ""%""
    |                И Значение <> """") КАК АвтомобилиСрезПоследних";
    
    Запрос.УстановитьПараметр("Дата", ТекущаяДата());
    Запрос.УстановитьПараметр("СтрАвтомобиль", СокрЛП(СтрАвтомобиль));
    Выборка = Запрос.Выполнить().Выбрать(); 
    Если Выборка.Следующий() Тогда
        ГосНомер = Выборка.Значение;
        Возврат Выборка.Автомобиль;
    КонецЕсли;
    Возврат Автомобиль;
   vi0
 
24 - 13.11.18 - 14:36
(23) если тебе нужно ускорить, и Дата в запросе всегда = ТекущаяДата(), то у регистра можно попробовать установить флаг "разрешить итоге среза первых", и в запросе не указывать параметр Дата
   Mikhail Volkov
 
25 - 13.11.18 - 17:21
(24) Спс, но изменять сами объекты конфигурации боязно.
   Bober
 
26 - 13.11.18 - 19:30
(23) если таблица регистра большая, то такое условие приведет к полному перебору всех записей таблицы.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует