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

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

Поиск по полному соответсвию

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

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

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


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


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

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