Имя: Пароль:
1C
1С v8
Как реализовать сопоставление товаров в выборке по артикулу?
0 MathaiShung
 
30.05.16
14:39
Задача: Сопоставить номенклатурные позиции по артикулу. Если точного совпадения артикула не найдено, тогда - по фрагменту артикула (с шагом в минус один знак справа), до минимум 4 знаков слева.
Пока единственное, что приходит на ум это перебор Выборки с помощью НайтиСледующий, если нет совпадений - изменение Артикулов в всей Выборке и новый цикл с аналогичными действиями, пока не выявится совпадение, или не достигнет минимального предела знаков артикула.
Но по-моему это очень громоздко получится и неоптимально, да и слишком сложно. Кто-нибудь знает как сделать это правильнее и проще? Всё что есть пока на данный момент:
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
        |    ТоварыНаСкладахОстатки.КоличествоОстаток
        |ПОМЕСТИТЬ Товары
        |ИЗ
        |    РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад) КАК ТоварыНаСкладахОстатки
        |
        |ИНДЕКСИРОВАТЬ ПО
        |    Номенклатура
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ВложенныйЗапрос.НоменклатураАртикул КАК Артикул,
        |    ВложенныйЗапрос.Номенклатура,
        |    МАКСИМУМ(ПоступлениеТоваровУслугТовары.Цена) КАК Цена,
        |    МАКСИМУМ(ВложенныйЗапрос.КоличествоОстаток) КАК Остаток
        |ИЗ
        |    (ВЫБРАТЬ
        |        ПоступлениеТоваровУслугТовары.Номенклатура.Артикул КАК НоменклатураАртикул,
        |        ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
        |        МАКСИМУМ(ПоступлениеТоваровУслугТовары.Ссылка.Дата) КАК Дата,
        |        МАКСИМУМ(Товары.КоличествоОстаток) КАК КоличествоОстаток
        |    ИЗ
        |        Товары КАК Товары
        |            ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
        |            ПО Товары.Номенклатура = ПоступлениеТоваровУслугТовары.Номенклатура
        |    ГДЕ
        |        ПоступлениеТоваровУслугТовары.Номенклатура В
        |                (ВЫБРАТЬ
        |                    Товары.Номенклатура
        |                ИЗ
        |                    Товары КАК Товары)
        |        И ПоступлениеТоваровУслугТовары.Ссылка.Дата <= &Дата
        |        И ПоступлениеТоваровУслугТовары.Ссылка.Проведен = ИСТИНА
        |    
        |    СГРУППИРОВАТЬ ПО
        |        ПоступлениеТоваровУслугТовары.Номенклатура.Артикул,
        |        ПоступлениеТоваровУслугТовары.Номенклатура) КАК ВложенныйЗапрос
        |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
        |        ПО ВложенныйЗапрос.Номенклатура = ПоступлениеТоваровУслугТовары.Номенклатура
        |            И ВложенныйЗапрос.Дата = ПоступлениеТоваровУслугТовары.Ссылка.Дата
        |ГДЕ
        |    ПоступлениеТоваровУслугТовары.Номенклатура В
        |            (ВЫБРАТЬ
        |                Товары.Номенклатура
        |            ИЗ
        |                Товары КАК Товары)
        |    И ПоступлениеТоваровУслугТовары.Ссылка.Дата <= &Дата
        |    И ПоступлениеТоваровУслугТовары.Ссылка.Проведен = ИСТИНА
        |
        |СГРУППИРОВАТЬ ПО
        |    ВложенныйЗапрос.НоменклатураАртикул,
        |    ВложенныйЗапрос.Номенклатура";
    
    Запрос.УстановитьПараметр("Дата", Объект.Дата);
    Запрос.УстановитьПараметр("Склад", Объект.Склад);
    Результат = Запрос.Выполнить();    
    Выборка = Результат.Выбрать();
1 Маратыч
 
30.05.16
14:45
Сделай соединением точной выборки и ПОДОБНО, дальше по ЕСТЬNULL(ВыборкаТочно.Значение,ВыборкаПодобно.Значение) получай результат.
2 Маратыч
 
30.05.16
14:46
Хз правда, как это в плане оптимизации, но уж всяко быстрее перебора.
3 MathaiShung
 
30.05.16
14:53
(1) О, спасибо, уже лучше. Попробую...
4 Маратыч
 
30.05.16
14:57
(3) Угу, правда, для четырех знаков придется четыре выборки делать, но с учетом кэширования не должно сильно тормозить.
5 hhhh
 
30.05.16
15:12