Имя: Пароль:
1C
1С v8
Обработка строк в запросе
0 1С-ница
 
05.02.13
17:21
УТ 11 ред (11.0.4.5)

Необходимо в запросе искать номенклатуру с подобным артикулом (из 2-ух таблиц)

Вот фрагмент кода:

ВЫБОР
   КОГДА ПоложительныеОстатки.НоменклатураАртикул = ОтрицательныеОстатки.НоменклатураАртикул
       ТОГДА ОтрицательныеОстатки.НоменклатураАртикул
   ИНАЧЕ ВЫБОР
           КОГДА ПОДСТРОКА(ОтрицательныеОстатки.НоменклатураАртикул, 1, ПоложительныеОстатки.ДлинаАртикулаПоложит - 1) ПОДОБНО ПОДСТРОКА(ПоложительныеОстатки.НоменклатураАртикул, 1, ПоложительныеОстатки.ДлинаАртикулаПоложит - 1)
               ТОГДА ПОДСТРОКА(ОтрицательныеОстатки.НоменклатураАртикул, 1, ПоложительныеОстатки.ДлинаАртикулаПоложит - 1)
       КОНЕЦ
КОНЕЦ
1 1С-ница
 
05.02.13
17:23
В строке

ПОДСТРОКА(ОтрицательныеОстатки.НоменклатураАртикул, 1, ПоложительныеОстатки.ДлинаАртикулаПоложит - 1)

нужно в качестве длины строки задавать число от ПоложительныеОстатки.ДлинаАртикулаПоложит до &МинДлинаАртикула с шагом 1

как сделать?
2 GANR
 
05.02.13
17:25
Функция языка запросов ПОДОБНО. Не?
3 1С-ница
 
05.02.13
17:53
(2) ПОДОБНО я и так использую в запросе
4 Reset
 
05.02.13
17:56
(3) Опиши задачу лучше.
По твоему запросу сложно догадаться, что тебе нужно
5 GANR
 
05.02.13
18:04
(3) Может здесь v8: Запрос сможете идеи почерпнуть? Особенно сообшение №14, там есть дробление строки на символы и есть алгоритм генерации числовой последовательности.
6 1С-ница
 
05.02.13
18:28
(4)
Необходимо в запросе найти дубли номенклатуры у которых незначительно отличаются артикулы?
Например: Номенклатура 1 арт Х-1234
Номенклатура 2 арт Х-1233
Номенклатура 3 арт Х-1243
Задается минимальная длина артикула, которая должна совпадать
7 1С-ница
 
05.02.13
18:31
Максимальная длина артикула, заданного в типовой УТ = 25 (думаю наврят ли кому то будет необходимо увеличивать это число)
8 1С-ница
 
05.02.13
18:36
(5) в приведенном коде как я поняла считается количество символов в строке, я считала символы таким образом:
ВЫБОР
   КОГДА СвободныеОстаткиОстатки.Номенклатура.Артикул = ПОДСТРОКА(СвободныеОстаткиОстатки.Номенклатура.Артикул, 1, 1)
       ТОГДА 1
   ИНАЧЕ ВЫБОР
           КОГДА СвободныеОстаткиОстатки.Номенклатура.Артикул = ПОДСТРОКА(СвободныеОстаткиОстатки.Номенклатура.Артикул, 1, 2)
               ТОГДА 2


и т д до 25
9 Михаил Козлов
 
05.02.13
18:37
(6) Посмотрите, как реализовано в ПоискИЗаменаДублирующихсяЭлементов при частичном совпадении.
10 GANR
 
05.02.13
18:39
(8) Ну да. Символы должны начиная с первого?
11 1С-ница
 
05.02.13
18:41
(10) этот код у меня получился, я для примера привела
(9) Посмотрю, спасибо за совет!!
12 МихаилМ
 
05.02.13
18:42
зачем это пытаться решить в рамках запроса?
спокойно обработайте после получения.
13 GANR
 
05.02.13
18:42
(11) Символы должны  с о в п а д а т ь  начиная с первого? Или внутри артикула тоже надо искать повторяющиеся последовательности?
14 1С-ница
 
05.02.13
18:43
(13) Символы должны совпадать начиная с первого
15 1С-ница
 
05.02.13
18:46
(12)сначала я и пыталась это обработать после запроса, но не нашла простого способа
Метод Найти для таблицы значений ищет точную копию искомой строки
Тем более получается очень громоздко
16 GANR
 
05.02.13
18:49
(14) Вот теперь задача ясна. А так?
ВЫБОР
   КОГДА СвободныеОстаткиОстатки.Номенклатура.Артикул = ПОДСТРОКА(СвободныеОстаткиОстатки.Номенклатура.Артикул, 1, 1)
       ТОГДА
       ВЫБОР
                   КОГДА СвободныеОстаткиОстатки.Номенклатура.Артикул = ПОДСТРОКА(СвободныеОстаткиОстатки.Номенклатура.Артикул, 2, 1)
                   ТОГДА ВЫБОР ... КОНЕЦ
           ИНАЧЕ 2
       КОНЕЦ
   ИНАЧЕ 0
КОНЕЦ
17 GANR
 
05.02.13
18:51
(16) Только если нужно проверять очень много первых символов - надо копать в сторону (5).
18 GANR
 
05.02.13
18:56
(15) В (16) поле запроса, в котором содержится количество совпавших первых символов. А уже на него можно накладывать отбор.
19 GANR
 
05.02.13
19:01
(16) Ой ёёёёё. Это совершенно не рабочее - запутался второпях.
20 1С-ница
 
05.02.13
19:03
(16) Попробую объяснить на пальцах
Есть Номенклатура 1 с артикулом Х-1234
    Номенклатура 11 с артикулом Х-1243
    Номенклатура 12 с артикулом Х-1233

Для Номенклатуры 1 надо найти дубли
Ищем так:
1. ищем полное совпадение по артикулу
2. от артикула Х-1234 снимаем справа 1 символ, остается Х-123
3. ищем среди остальной номенклатуры, есть ли подобные артикулы (в нашем случае Номенклатура 11 и Номенклатура 12 подходят)
4. если не нашли, снимаем еще 1 символ у артикула Номенклатуры 1 (остается Х-12) (остаток символов не может быть меньше заданного Минимального числа символов)
21 YuPetr
 
05.02.13
19:26
Можно сформировать текст запроса в цикле:
Текст="";    
Для й=минДлинаАртикула по МаксДлиннаАртикула Цикл
   Текст=Текст+"Когда ПОДСТРОКА(ОтрицательныеОстатки.НоменклатураАртикул, 1, "+й+"+) =    ПОДСТРОКА(ПоложительныеОстатки.НоменклатураАртикул, 1, "+й+"+)
               |тогда ПОДСТРОКА(ОтрицательныеОстатки.НоменклатураАртикул, 1, "+й+"+) "
КонецЦикла

потом вставить в текст запроса:
   
ВЫБОР
   КОГДА ПоложительныеОстатки.НоменклатураАртикул = ОтрицательныеОстатки.НоменклатураАртикул
       ТОГДА ОтрицательныеОстатки.НоменклатураАртикул
   ИНАЧЕ ВЫБОР "+Текст+"
         КОНЕЦ
КОНЕЦ
22 1С-ница
 
05.02.13
19:43
(22) спасибо, думала над таким вариантом
Методологически это не будет плохим решением?
23 Reset
 
05.02.13
19:56
В качестве изврата перед уходом домой:

Выбрать "АБВГД" Как Артикул,0 Как Ссылка Поместить Данные Объединить Выбрать "АБВГЕ",1 Объединить Выбрать "АБВГФ",2 Объединить Выбрать "АБВЦЦ",3 Объединить Выбрать "АБЦЦЦ",4;
Выбрать 0 как Ц Поместить Ч Объединить Выбрать 1 Объединить Выбрать 2 Объединить Выбрать 3 Объединить Выбрать 4;
Выбрать Ч1.Ц*25+Ч2.Ц*5+Ч3.Ц Как Значение Поместить Числа из Ч Как Ч1,Ч Как Ч2,Ч Как Ч3 Где Ч1.Ц*25+Ч2.Ц*5+Ч3.Ц>=&МинДлина;

Выбрать Д1.Артикул Как А1,Сумма(1) Как Количество
из (Выбрать Д1.Артикул,Д1.Ссылка,Числа.Значение Как Длина
       Из Данные Как Д1,
       полное соединение Числа Как Числа по Истина) Как Д1
Левое Соединение Данные Как Д2
по ПодСтрока(Д1.Артикул,1,Д1.Длина) Подобно ПодСтрока(Д2.Артикул,1,Д1.Длина)
И Д1.Ссылка<>Д2.Ссылка
Где Не Д2.Артикул есть null
Сгруппировать По Д1.Артикул

Вроде должен искать и считать совпадения с &МинДлина и более, при условии что длина артикулов одинаковая.
24 1С-ница
 
06.02.13
08:52
(21) Как бы мне организовать такой цикл:
Для й = - ПоложительныеОстатки.ДлинаАртикулаПоложит + 1 по МинДлинаАртикула ?
25 1С-ница
 
06.02.13
09:50
Хочу организовать обратный цикл, брать максимально возможное кол-во символов в артикуле (25) наверное не хорошо, т к в реале используются от 6 до 12 символов
26 Reset
 
06.02.13
10:00
(25) делать (12) существенно проще чем то, что ты пыташься
27 mikecool
 
06.02.13
10:02
динамически собрать текст запроса?
28 1С-ница
 
06.02.13
10:03
Придумала так:

Для й = 1 По МинДлинаАртикула Цикл
   Текст = Текст+"Когда ПОДСТРОКА(ОтрицательныеОстатки.НоменклатураАртикул, 1, ПоложительныеОстатки.ДлинаАртикулаПоложит -"+й+"+) = ПОДСТРОКА(ПоложительныеОстатки.НоменклатураАртикул, 1, "+й+"+)
   |тогда ПОДСТРОКА(ОтрицательныеОстатки.НоменклатураАртикул, 1, ПоложительныеОстатки.ДлинаАртикулаПоложит -"+й+"+) ";
КонецЦикла;
29 1С-ница
 
06.02.13
10:06
(27) это как?
30 МихаилМ
 
06.02.13
10:08
(0)
и не забывайте об ограничении вложенных case (Выбор)
31 1С-ница
 
06.02.13
10:12
(30) напомните ограничение?
32 МихаилМ
 
06.02.13
10:31
33 Бубр
 
06.02.13
10:37
(0) Полнотекстовый поиск не подойдет ?
34 mikecool
 
06.02.13
10:38
(29) текстзапроса = текстзапроса + " какой то кусок "
35 1С-ница
 
06.02.13
10:40
(34) я примерно так и делаю в (28)
Только с итераторами цикла просчиталась
36 1С-ница
 
06.02.13
10:56
(33) Полнотекстовым поиском не пользовалась
37 1С-ница
 
06.02.13
12:03
Для й = 1 По МинДлинаАртикула Цикл
       Текст = Текст+"ВЫБОР Когда ПОДСТРОКА(ОтрицательныеОстатки.НоменклатураАртикул, 1,
       |ПоложительныеОстатки.ДлинаАртикулаПоложит -"+й+") ПОДОБНО ПОДСТРОКА(ПоложительныеОстатки.НоменклатураАртикул, 1,ПоложительныеОстатки.ДлинаАртикулаПоложит -"+й+")
       |тогда ПОДСТРОКА(ОтрицательныеОстатки.НоменклатураАртикул, 1, ПоложительныеОстатки.ДлинаАртикулаПоложит -"+й+") ИНАЧЕ ";
       
       ТекстКонец = ТекстКонец + " Конец ";
   КонецЦикла;
38 1С-ница
 
06.02.13
12:05
Если взять минимальную длину артикула = 4, то получается цикл с 1 по 4
При длине артикула 6 должен быть цикл с 1 по 2
Как найти длина артикула - минимальная длина артикула, если длина артикула получается в запросе? (ПоложительныеОстатки.ДлинаАртикулаПоложит)
39 1С-ница
 
06.02.13
12:07
(33)
МенеджерПолнотекстовогоПоиска (FullTextSearchManager)
Методы:

ДатаАктуальности (UpdateDate)
ИндексАктуален (IndexTrue)
ОбновитьИндекс (UpdateIndex)
ОбновлениеИндексаЗавершено (IndexUpdateComplete)
ОчиститьИндекс (ClearIndex)
ПолучитьРежимПолнотекстовогоПоиска (GetFullTextSearchMode)
СоздатьСписок (CreateList)
УстановитьРежимПолнотекстовогоПоиска (SetFullTextSearchMode)

Описание:

Менеджер полнотекстового поиска. С его помощью осуществляется обновление индексов и получается информация об актуальности индекса.

Доступность:

Сервер, толстый клиент, внешнее соединение.


Чем Полнотекстовый поиск можешь помочь решению моей задачи?
40 1С-ница
 
06.02.13
12:51
Ни у кого мыслей нету?