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

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

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

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

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

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

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

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

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

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

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