[РЕШЕНО] Как сделать запрос по номенклатуре при условии что в наименование входит одно из 25 тыс.значений...

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Ktyf, 8 окт 2014.

  1. TopicStarter Overlay
    Ktyf
    Offline

    Ktyf Опытный в 1С

    Регистрация:
    16 янв 2013
    Сообщения:
    457
    Симпатии:
    12
    Баллы:
    29
    Сама задача такова! Есть excel-файл - фактически прайс лист. В нем отдельный столбец - уникальный каталожный номер. Надо по имеющимся данным из этого файла найти соответствующие номенклатуры. И кстати этот номер в справочнике номенклатуры пробит в наименовании.
    На данный момент извлекла эти кат.номера в массив. Теперь надо как-то выбрать соответствующие им номенклатуры. Самый простой вариант - Цикл с "НайтиПоНаименованию" - не очень-то и вариант т.к там 25 тыс.строк.
    Хотелось бы решить дело запросом, НО как его составить не представляю. Мне надо сделать выборку по номенклатуре при условии что в наименование входит одно из 25 тыс.значений...
  2. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.980
    Симпатии:
    398
    Баллы:
    104
    Если в наименовании хранится еще что-то кроме этого номера, типа: 987465416841 Каталка белая. То в запросе нужно будет уже действовать через ПОДОБНО. Других вариантов нет. А если мне память не изменяет, то в ПОДОБНО нельзя указать список значений, только конкретное значение. Соответственно остается только один вариант. В цикле перебирайте весь ваш массив и запросом через ПОДОБНО получайте всю номенклатуру. Не обязательно каждый раз обращаться к базе. Можно один раз вытащить данные и поместить в таблицу значений. Затем данные просто из памяти тянуть.
  3. TopicStarter Overlay
    Ktyf
    Offline

    Ktyf Опытный в 1С

    Регистрация:
    16 янв 2013
    Сообщения:
    457
    Симпатии:
    12
    Баллы:
    29
    угу - первым делом проверила.
    т.е сделать полную выборку номенклатуры и запихнуть ее во временную таблицу. А потом в цикле вторым запросом обращаться к этой таблице постоянно меняя параметр для "ПОДОБНО"?
  4. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.980
    Симпатии:
    398
    Баллы:
    104
    Да, используя менеджер временных таблиц.
  5. Draco
    Online

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.635
    Симпатии:
    946
    Баллы:
    204
    1 сначала выполняете обрабутку файла и запихиваете все значения массив (ну вы это сделали)
    2. если наименования совпадают, точь в точь то принципе можно провернуть финт ушами
    Первая таблица это у вас будет Ваш массив Ну его можно получить передать через &
    Потом вторая таблица это Ваш справочник номенклатура.
    И берете соединяете Первую таблицу со второй левым соединением и вытаскиваете со второй сслыку или код
    И отбор что ссылка не равно NULL и получите то что Вам надо.

    Понятно описал.
  6. TopicStarter Overlay
    Ktyf
    Offline

    Ktyf Опытный в 1С

    Регистрация:
    16 янв 2013
    Сообщения:
    457
    Симпатии:
    12
    Баллы:
    29
    они не совпадают..
  7. XXL
    Offline

    XXL Опытный в 1С Команда форума

    Регистрация:
    22 янв 2007
    Сообщения:
    1.159
    Симпатии:
    19
    Баллы:
    29
    Если делать запрос в цикле, то не вижу смысла сначала выбирать данные из файла в массив или ТЗ, делаете цикл, построчно выбираете данные из файла и сразу запросом через ПОДОБНО находите номенклатуру.
  8. Draco
    Online

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.635
    Симпатии:
    946
    Баллы:
    204
    Ну тогда Вам и НайтиПоНаименованию () не поможет без разницы сколько там строк, что Вы нас в заблуждение вводите.
    Тогда как написано выше через ПОДОБНО только.
    --- Объединение сообщений, 8 окт 2014 ---
    Согласен что сразу искать надо в обходе строк экселя
  9. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.980
    Симпатии:
    398
    Баллы:
    104
    Смысл есть. Все это будет храниться лишь в памяти. В принципе задача пустяковая.
    1. Обработать файл и получить массив с нужными номерами.
    2. Получить всю номенклатуру из базы и поместить ее во временную таблицу (чтобы та тоже в памяти весела).
    3. В цикле перебрать все эти значения. Все.
  10. XXL
    Offline

    XXL Опытный в 1С Команда форума

    Регистрация:
    22 янв 2007
    Сообщения:
    1.159
    Симпатии:
    19
    Баллы:
    29
    Насколько быстрее будет работать?
  11. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.980
    Симпатии:
    398
    Баллы:
    104
    Ну это зависит от многих факторов. Если у нее в файле 100 позиций. То она в принципе не заметит разницы. А если 10000 в файле и 25000 в справочнике. То разница во времени будет значительной. Также имеет значение и значения компа. Процессор, оперативка и т.д.
  12. TopicStarter Overlay
    Ktyf
    Offline

    Ktyf Опытный в 1С

    Регистрация:
    16 янв 2013
    Сообщения:
    457
    Симпатии:
    12
    Баллы:
    29
    в файле 25 тыс позиций, в справочнике 12 тыс.
    Т.е только циклом?
    Просто я "не волшебник, а только учусь", поэтому всех возможностей не знаю. Надеялась, что можно одним запросом все сравнить и выбрать.
  13. rshakiro
    Offline

    rshakiro Профессионал в 1С Команда форума

    Регистрация:
    17 мар 2011
    Сообщения:
    2.236
    Симпатии:
    144
    Баллы:
    104
    Мда... Подумайте, может какой-то обработкой выделить нужный Вам код из наименования и записать его в свойства(либо какой-то реквизит)... Потом уже по этому реквизиту будете находить соответствия с прайсом, все "будет летать"...
  14. TopicStarter Overlay
    Ktyf
    Offline

    Ktyf Опытный в 1С

    Регистрация:
    16 янв 2013
    Сообщения:
    457
    Симпатии:
    12
    Баллы:
    29
    чисто програмно - нереально. Мало того, что этот код может стаять или в начале или в конце наименования так еще и длина кода варьируется по длине и может включать буквы.
  15. rshakiro
    Offline

    rshakiro Профессионал в 1С Команда форума

    Регистрация:
    17 мар 2011
    Сообщения:
    2.236
    Симпатии:
    144
    Баллы:
    104
    Ну как вариант, написать Вашу обработку, которая обсуждается в теме, в циклах, когда находите ссылку на номенклатуру, записать нужный реквизит из прайса
  16. Draco
    Online

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.635
    Симпатии:
    946
    Баллы:
    204
    Ну вы же сами написали что наименования в прайсе не совпадают с наименованием в в 1С. Тогда можно искать только через ПОДОБНО.
    На самом деле вариант как я вам писал то же может прокатить свзяь только установитьне через равно а через подобно. Типа
    РеализацияТоваровУслугТовары.Номенклатура.Наименование ПОДОБНО (Ном.Наименование)
  17. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.433
    Симпатии:
    373
    Баллы:
    104
    каталожный номер = Артикул :D
  18. TopicStarter Overlay
    Ktyf
    Offline

    Ktyf Опытный в 1С

    Регистрация:
    16 янв 2013
    Сообщения:
    457
    Симпатии:
    12
    Баллы:
    29
    Прогоняю на тестовом файле всего с 8-ю значениями которые ТОЧНО есть в спрНоменклатуры (ручками проверяла).
    Код:
    зпНом.Текст =
        "ВЫБРАТЬ
        |    Номенклатура.Ссылка,
        |    Номенклатура.Наименование
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.ЭтоГруппа = ЛОЖЬ
        |    И Номенклатура.Наименование ПОДОБНО &КатНом";
    
        Для Каждого Стр из мсВложенный Цикл
            зпНом.УстановитьПараметр("КатНом", СОКРЛП(Стр));
            тзНом = зпНом.Выполнить().Выгрузить();
        КонецЦикла;
    мсВложенный - массив всего с одним значением типа строка, соответственно Стр тоже типа строка. Однако тзНом - пустая. -Banghead- Причем если из запроса убрать ПОДОБНО и при отладке открыть тзНом, то там по F1 все чудненько находится.
    --- Объединение сообщений, 8 окт 2014 ---
    я НЕ знаю почему они запихнули каталожный номер в наименование, но мне надо плясать от того что есть!
  19. Foreman
    Offline

    Foreman

    Регистрация:
    19 фев 2008
    Сообщения:
    22
    Симпатии:
    0
    Баллы:
    1
    а если вот так попробовать
    | И Номенклатура.Наименование ПОДОБНО "%"+&КатНом"+"%";
  20. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.554
    Симпатии:
    716
    Баллы:
    204
    необходимо сделать:

    зпНом.УстановитьПараметр("КатНом", "%" + СОКРЛП(Стр) + "%");

    и будет Щастье

Поделиться этой страницей