Имя: Пароль:
1C
1С v8
Поиск по полному соответсвию
, ,
0 Olissen
 
26.11.18
22:49
Здравствуйте, есть проблема, есть внешняя обработка, на ней есть таб.часть куда грузятся данные из xls файла (Номенклатура, Код, Артикул, Цена) (реквизиты таб.части: "Т_Наименование", "Т_Код", "Т_Артикул", "Т_Цена", "Т_Номенклатура") то есть список номенклатуры из xls грузится в эту таб.часть. Также есть три флажка "Код", "Артикул", "Наименование" в зависимости от установки галки на этих флажках происходит поиск по выбранным критериям в справочнике "Номенклатура" (конфигурация УТ 10.3), и найденный результат (а именно ссылка на найденную номенклатуру) попадает  в реквизит Т_Номенклатура. Например установил я галку "Код", в  таб.часть из xls загружаются такие данные по коду: "777", "0000111", "0000099" и если в справочнике есть номенклатура с такими данными кода,то ссылка на неё попадает в реквизит "Т_Номенклатура" так вот, по одной галке у меня ищет хорошо, но задача такая чтобы он искал по полному соответствию в случае если выбрано несколько галок, например есть номенклатура "Грабли" с кодом "0000555" так вот в случае если установллены галки "Код" и "Номенклатура" он будет искать по полному соответсвию в строке таб.части, то есть если в строке таб.части есть номенклатура "Грабли" с кодом "0000555", то поиск отобразит ссылку в реквизите "Т_Номенклатура"  в иных случаях нет, также и в по любым сочетаниям галок,хоть по всем трём.
Нагуглил,что как-то через запрос можно сделать,но не понимаю как с чего начать и от чего отталкиваться непонятно пока...
Объяснил конечно криво, буду рад любой помощи.
1 Сияющий в темноте
 
27.11.18
09:32
Ищем то где
если в справочнике,то в условии запроса перечисляем условия поиска в зависимости от установленных галочек.
2 Olissen
 
27.11.18
11:14
(1) пойдёт так,если я сделаю через параметры, а затем установлю значения параметров исходя из данных текущих полей таб.части чтобы искал по полному соответсвию. Что-то типа такого:
[code]
Для Каждого ТекСтрока из ТабЧасть Цикл
Если Флаг_Номенклатура и Флаг_Код Тогда
Запрос=Новый Запрос;
Запрос.Текст="
ВЫБРАТЬ
    Номенклатура.Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Наименование = &Наименование
    И Номенклатура.Код = &Код";
Запрос.УстановитьПараметр("Наименование", ТекСтрока.Т_Наименование);
Запрос.УстановитьПараметр("Код", ТекСтрока.Т_Код);
КонецЦикла
[/code]
Так пойдёт?
3 catena
 
27.11.18
11:17
(2)А если отдельно поставят Флаг_Номенклатура или Флаг_Код, будешь еще две ветки обработки писать? А если флажков три, то будет шесть веток?
4 Olissen
 
27.11.18
11:19
(3) Не знаю,пока думаю,получается надо как-то значение флажков передать в условия запроса или что?
5 Olissen
 
27.11.18
11:32
(3) Ну короче так работает ищет то,что я хотел:
[code]
Для Каждого ТекСтрока из ТабЧасть Цикл
Если Флаг_Номенклатура И Флаг_Код Тогда
Запрос=Новый Запрос;
            Запрос.Текст="
            |ВЫБРАТЬ
            |    Номенклатура.Ссылка КАК Ссылка
            |ИЗ
            |    Справочник.Номенклатура КАК Номенклатура
            |ГДЕ
            |    Номенклатура.Наименование = &Наименование
            |    И Номенклатура.Код = &Код";
            Запрос.УстановитьПараметр("Наименование", ТекСтрока.Т_Наименование);
            Запрос.УстановитьПараметр("Код", ТекСтрока.Т_Код);
            
            Результат=Запрос.Выполнить();
            Выборка=Результат.Выбрать();
            Пока Выборка.Следующий() Цикл
              ТекСтрока.Т_Номенклатура=Выборка.Ссылка;    
            КонецЦикла;
КонецЕсли;
КонецЦикла

[/code]
Однако смущает вопрос по флажкам, просто в таком случае придётся писать много "Если...Тогда....КонецЕсли".
6 Olissen
 
27.11.18
11:34
(5) есть ли вариант получше?
7 catena
 
27.11.18
11:45
Дарю

ВЫБРАТЬ
            |    Номенклатура.Ссылка КАК Ссылка
            |ИЗ
            |    Справочник.Номенклатура КАК Номенклатура
            |ГДЕ
            |    (Номенклатура.Наименование = &Наименование или не &Флаг_Номенклатура)
            |    И (Номенклатура.Код = &Код или не &Флаг_Код)
8 Andy13
 
27.11.18
11:56
Функция ПолучитьНоменклатуру(Наименование, Код, Артикул)
    Возвр    = Справочники.Номенклатура.ПустаяСсылка();
    Если Наименование = Неопеределено
        и Код = Неопеределено
        и Артикул = Неопеределено Тогда
        
    Иначе
        
        Запрос    = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ
            |    Номенклатура.Ссылка КАК Ссылка
            |ИЗ
            |    Справочник.Номенклатура КАК Номенклатура
            |ГДЕ
            |    ВЫБОР
            |            КОГДА &Наименование = НЕОПРЕДЕЛЕНО
            |                ТОГДА ИСТИНА
            |            ИНАЧЕ Номенклатура.Наименование = &Наименование
            |        КОНЕЦ
            |    И ВЫБОР
            |            КОГДА &Код = НЕОПРЕДЕЛЕНО
            |                ТОГДА ИСТИНА
            |            ИНАЧЕ Номенклатура.Код = &Код
            |        КОНЕЦ
            |    И ВЫБОР
            |            КОГДА &Артикул = НЕОПРЕДЕЛЕНО
            |                ТОГДА ИСТИНА
            |            ИНАЧЕ Номенклатура.Артикул = &Артикул
            |        КОНЕЦ";
        Запрос.УстановитьПараметр("Наименование", Наименование);
        Запрос.УстановитьПараметр("Код", Код);
        Запрос.УстановитьПараметр("Артикул", Артикул);
        Результат    = Запрос.Выполнить();
        Если Не Результат.Пустой() Тогда
            Выборка    = Результат.Выбрать();
            Выборка.Следующий();
            Возвр    = Выборка.Ссылка;
        КонецЕсли;
    КонецЕсли;
    
    Возврат    Возвр;
    
КонецФункции // ПолучитьНоменклатуру()

Для Каждого ТекСтрока из ТабЧасть Цикл
    
    Наименование= ?(Флаг_Номенклатура, ТекСтрока.Т_Наименование, Неопределено);
    Код            = ?(Флаг_Код, ТекСтрока.Т_Код, Неопределено);
    Артикул        = ?(Флаг_Артикул, ТекСтрока.Т_Артикул, Неопределено);
    
    ТекСтрока.Т_Номенклатура    = ПолучитьНоменклатуру(Наименование, Код, Артикул);
        
КонецЦикла
9 Andy13
 
27.11.18
11:57
Мда...
Неопеределено = Непределено
Накосячил...
10 Andy13
 
27.11.18
11:57
Тяжелый день..
Неопеределено = Неопределено
11 Olissen
 
27.11.18
12:50
(8) Спасибо за помощь, разобрался.
(7)тоже спасибо за помощь,воспользовался вашим вариантом в итоге получилось (не додумался связать значение флажка с параметром :( нуб ),а можете пожалуйста если не затруднит пояснить что означает фрагмент ""ИЛИ НЕ &Флаг_НазваниеФлага""


[/code]
Запрос=Новый Запрос;
            Запрос.Текст="
            |ВЫБРАТЬ
            |    Номенклатура.Ссылка КАК Ссылка
            |ИЗ
            |    Справочник.Номенклатура КАК Номенклатура
            |ГДЕ
            |    (Номенклатура.Наименование = &Наименование ИЛИ НЕ &Флаг_Номенклатура)
            |    И (Номенклатура.Код = &Код ИЛИ НЕ &Флаг_Код)
            |    И (Номенклатура.Артикул=&Артикул ИЛИ НЕ &Флаг_Артикул)";
            Запрос.УстановитьПараметр("Наименование", ТекСтрока.Т_Наименование);
            Запрос.УстановитьПараметр("Код", ТекСтрока.Т_Код);
            Запрос.УстановитьПараметр("Артикул", ТекСтрока.Т_Артикул);
            Запрос.УстановитьПараметр("Флаг_Номенклатура", Номенклатура);
            Запрос.УстановитьПараметр("Флаг_Код", Код);
            Запрос.УстановитьПараметр("Флаг_Артикул", Артикул);
            
            Результат=Запрос.Выполнить();
            Выборка=Результат.Выбрать();
            Пока Выборка.Следующий() Цикл
              ТекСтрока.Т_Номенклатура=Выборка.Ссылка;    
            КонецЦикла;
[/code]
12 Вафель
 
27.11.18
13:10
лучше без фглагов, а через построитель
13 Вафель
 
27.11.18
13:11
Запрос=Новый ПостроительЗапроса;
...
Если Флаг_Код Тогда
  ЭлементОтбора = Запрос.Отбор.Добавить("Код");
  ЭлементОтбора.Установить(Код, Истина);
КонецЕсли;
14 catena
 
27.11.18
13:16
(11)Это значит, что если снят флаг, то все, если флаг стоит, то по равенству наименования.
15 1Сергей
 
27.11.18
13:18
(8) а ты уверен, что там в реквизитах вообще может быть неопределено?
16 catena
 
27.11.18
13:18
(13)Нет, не лучше, потому что потом нужно будет еще избавляться от запроса в цикле, а там появится соединение ТЗ со справочником, а построитель не умеет ТЗ в запрос.
17 Olissen
 
27.11.18
16:31
(13) в этом способе получается будет много "Если"?
(14)спасибо за объяснение,понял,разобрался.
18 Вафель
 
27.11.18
16:33
(17) можно без если

ЭлементОтбора = Запрос.Отбор.Добавить("Код");
ЭлементОтбора.Установить(Код, Флаг_Код
);