|
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) да, не понял это:
>>Надо: Перебрать список Номенклатуры и удалить из Полного наименования название цвета. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |