|   |   | 
| 
 | v7: Поиск слова или несколько слов предложения из фиксированного списка | ☑ | ||
|---|---|---|---|---|
| 0
    
        Мимохожий Однако 06.02.13✎ 21:26 | 
        Задачка. Дано: Справочник Номенклатуры, у которого в полном наименование в конце один или два слова обозначает цвет товара. Есть отдельный список значений, в котором перечислены возможные цвета.
  Надо: Перебрать список Номенклатуры и удалить из Полного наименования название цвета. .. Я могу по каждому товару разбить наименование на несколько слов и методом НайтиЗначение() поискать в списке нужный цвет. После этого можно провести дальнейшее преобразование. ... Может быть, есть более эффективный алгоритм, а я не знаю? .. Это ТиС 77 | |||
| 1
    
        Cthulhu 06.02.13✎ 21:52 | 
        просто сравнить хвост с наименованием каждыго цвета и отрезать совпадение.     | |||
| 2
    
        Надсмотрщик 06.02.13✎ 21:58 | 
        (0) Найти(Наименование, ТвойЦветИзСпискаЦветов)     | |||
| 3
    
        Cthulhu 06.02.13✎ 22:05 | 
        (2): Медвежонок "красный нос", желтый     | |||
| 4
    
        Надсмотрщик 06.02.13✎ 22:08 | 
        (3) Запятая везде?     | |||
| 5
    
        monsterZE 06.02.13✎ 22:09 | 
        СтрЗаменить(Наименование,Цвет,"");
  если наврал - посмотреть в сп =) | |||
| 6
    
        Мимохожий Однако 07.02.13✎ 22:59 | 
        Задачка усложняется тем, что цвет, который был в наименовании надо запомнить для этого элемента справочника. Пока запланировал использовать свойство номенклатуры.     | |||
| 7
    
        monsterZE 07.02.13✎ 23:07 | 
        а в чем сложность? заведи справочник возможных цветов, у номенклатуры реквизит Цвет - СпрВозмЦвет и заполни его выкусыванием цвета из наименования..     | |||
| 8
    
        Мимохожий Однако 07.02.13✎ 23:15 | 
        (7)Сложности не вижу. Алгоритм я описал. По нему и буду делать. На всякий случай решил посоветоваться. Может быть, есть более прогрессивные или короткие пути. Менять конфигурацию я не буду.     | |||
| 9
    
        kiruha 07.02.13✎ 23:52 | 
        Более эффективный прямой запрос 1С++ в 4 строчки
  и временем выполнения в 100 раз выше | |||
| 10
    
        Cthulhu 08.02.13✎ 17:37 | 
        (9): на поиск в хвосте? хренасдва.     | |||
| 11
    
        Мимохожий Однако 09.02.13✎ 07:49 | 
        Сделал пока так.
  Функция ВыделитьЦветИзНаименования(ПолнНаименование) Для П=1 По СписокЦветов.РазмерСписка() Цикл Поз = Найти(ПолнНаименование,СписокЦветов.ПолучитьЗначение(П)); Если Поз > 0 Тогда Возврат СписокЦветов.ПолучитьЗначение(П); КонецЕсли; КонецЦикла; Возврат ""; КонецФункции | |||
| 12
    
        rphosts 09.02.13✎ 07:59 | 
        неплохо-бы уточнить задачу: для 1 номенклатуры или для всех     | |||
| 13
    
        rphosts 09.02.13✎ 08:00 | 
        в смысле обойти всю номенклатуру и расскавить или однократный вызов?     | |||
| 14
    
        Мимохожий Однако 09.02.13✎ 08:01 | 
        (12)К сожалению, для всей номенклатуры.
  Идет перебор справочника и поиск соответствия. Но я планирую добавить фильтр, который будет пропускать номенклатуру с уже найденным цветом в справочнике свойств. | |||
| 15
    
        rphosts 09.02.13✎ 08:01 | 
        (14) вот как раз для этого придумали хэш-функции! 
  1.Считаешь хэш-код для каждого элемента в справочнике цветов 2.Заливаешь этот список в таблицу значений (3 столбца: код, наименование, хэш-код) и сортируешь по хэш-коду. Для каждой номенклатуры: 3.1.Считаешь хэш-код для твоего цвета именно этой номенклатуры 3.2.ищешь этот цвет только в тех строк ТЗ (из 2.) у которых точнг такой-жэ хэш-код. КонецЦикла на большом списке цветов выигрыш будет приличный. | |||
| 16
    
        Мимохожий Однако 09.02.13✎ 08:01 | 
        При первом запуске будет дольше работать.     | |||
| 17
    
        Мимохожий Однако 09.02.13✎ 08:02 | 
        Ссылка на пример с хэш-кодом есть?     | |||
| 18
    
        Mikeware 09.02.13✎ 08:02 | 
        Ну и в чем проблемы-то? за трое суток отработал бы самый тупой и примитивный метод...     | |||
| 19
    
        rphosts 09.02.13✎ 08:03 | 
        (17)делал на 2 курсе на паскале, по памяти не восстановлю. да и нет смысла восстанавливать     | |||
| 20
    
        Мимохожий Однако 09.02.13✎ 08:04 | 
        (18)Да нет... Справочник не так велик. Отрабатывается за несколько минут.     | |||
| 21
    
        Mikeware 09.02.13✎ 08:04 | 
        (15) и нахрена тут хэширование, если есть ид и индекс?     | |||
| 22
    
        Мимохожий Однако 09.02.13✎ 08:07 | 
        Для большей точности добавлю сортировку списка цветов с максимальной длины значений к минимальным. Возможна ситуация, когда цвета будут из двух слов.     | |||
| 23
    
        rphosts 09.02.13✎ 08:11 | 
        (21) ид чего и индекс чего? и каким местом он помежет если суть проблемы в сопоставлении того что выкусывается из ПолногоНаименования и списка цветов...     | |||
| 24
    
        Mikeware 09.02.13✎ 08:15 | 
        (23) ид цвета. 
  вторая связанная по ключу таблица. в терминах 1с - подчиненный справочник, например. | |||
| 25
    
        rphosts 09.02.13✎ 08:21 | 
        (24) так связь уже есть? Тогда вообще нечего искать     | |||
| 26
    
        Mikeware 09.02.13✎ 08:23 | 
        (25) как я понял, он ее и хочет создать.
  а создав один раз.. | |||
| 27
    
        Мимохожий Однако 09.02.13✎ 08:41 | 
        Когда выделю цвет и запишу в свойства связь появится через подчинение номенклатуре и видам свойств. Перед поиском цвета в наименовании буду проводить поиск значений в справочнике Значения свойства. У меня конфигурация Торговля и склад в данном случае.     | |||
| 28
    
        Mikeware 09.02.13✎ 08:42 | 
        (27) пля, стратегическая задача...
  на ближайшие пол-года? | |||
| 29
    
        Мимохожий Однако 09.02.13✎ 08:44 | 
        Не понял...     | |||
| 30
    
        Mikeware 09.02.13✎ 08:50 | 
        (29) дольше обсуждаем уже. за прошедшие 50 минут уже можно было сделать и забыть...     | |||
| 31
    
        Мимохожий Однако 09.02.13✎ 08:52 | 
        (30)Не нервничай )) Сделал уже...
  //************************************* Процедура ДобавитьЗначениеСвойства(ВыбСвойство,ЗначениеСвойства,ВыбТовар) Спр = СоздатьОбъект("Справочник.Номенклатура"); Если Спр.НайтиЭлемент(ВыбТовар) = 0 Тогда Возврат; КонецЕсли; СпрВидовСвойств = СоздатьОбъект("Справочник.ВидыСвойств"); Если СпрВидовСвойств.НайтиЭлемент(ВыбСвойство) = 0 Тогда Возврат; КонецЕсли; СпрЗначСвойств = СоздатьОбъект("Справочник.ЗначенияСвойств"); СпрЗначСвойств.ИспользоватьВладельца(СпрВидовСвойств.ТекущийЭлемент()); Если СпрЗначСвойств.НайтиПоНаименованию(ЗначениеСвойства,1,1) = 0 Тогда СпрЗначСвойств.Новый(); СпрЗначСвойств.Наименование = ЗначениеСвойства; СпрЗначСвойств.Владелец = СпрВидовСвойств.ТекущийЭлемент(); СпрЗначСвойств.Записать(); КонецЕсли; СпрСвойств = СоздатьОбъект("Справочник.СвойстваНоменклатуры"); СпрСвойств.ИспользоватьВладельца(Спр.ТекущийЭлемент()); Если СпрСвойств.НайтиПоРеквизиту("ЗначениеСвойства",СпрЗначСвойств.ТекущийЭлемент(),0) = 0 Тогда СпрСвойств.Новый(); СпрСвойств.ВидСвойства = СпрВидовСвойств.ТекущийЭлемент(); СпрСвойств.ЗначениеСвойства = СпрЗначСвойств.ТекущийЭлемент(); СпрСвойств.Владелец = Спр.ТекущийЭлемент(); СпрСвойств.Записать(); КонецЕсли; КонецПроцедуры | |||
| 32
    
        monsterZE 09.02.13✎ 10:59 | 
        (31) а зачем
  СпрЗначСвойств.Владелец = СпрВидовСвойств.ТекущийЭлемент(); СпрСвойств.Владелец = Спр.ТекущийЭлемент(); это же и так подчиненные справочники?.. | |||
| 33
    
        kupec 11.02.13✎ 13:09 | 
        Если ВвестиСтроку(СтрокаПоиска,"Введите Строку Поиска",50,0)=1 Тогда
  Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = "//{{ЗАПРОС(Товары) |Обрабатывать НеПомеченныеНаУдаление; |Товар=Справочник.Товары.ТекущийЭлемент; |Название=Справочник.Товары.Наименование; |Группировка Товар Без Групп; |Условие(Найти(Строка(Нрег(Название)),Нрег(СтрокаПоиска))<>0); |"//}}ЗАПРОС ; Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Предупреждение("Ошибка запроса"); Возврат; КонецЕсли; Таб=СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("ПохожиеТовары"); Таб.ВывестиСекцию("Шапка"); Итог=0; Пока Запрос.Группировка("Товар")=1 Цикл Итог=Итог+1; Состояние("Обработано "+Итог+" Товаров"); Таб.ВывестиСекцию("Строка"); КонецЦикла; Если Итог=0 Тогда Предупреждение("Ничего Не Найдено !!!"); Возврат; КонецЕсли; Таб.Опции(0,0,4,0); Таб.ТолькоПросмотр(1); Таб.Показать("Список_товаров",""); КонецЕсли; | |||
| 34
    
        kupec 11.02.13✎ 13:10 | 
        или я что то не понял?     | |||
| 35
    
        1Сергей 11.02.13✎ 13:43 | 
        (34) да, не понял это:
  >>Надо: Перебрать список Номенклатуры и удалить из Полного наименования название цвета. | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |