Имя: Пароль:
1C
1C 7.7
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) да, не понял это:

>>Надо: Перебрать список Номенклатуры и удалить из Полного наименования название цвета.
Основная теорема систематики: Новые системы плодят новые проблемы.