Имя: Пароль:
1C
1С v8
Как можно без перебора ТЗ найти строки где текст содержит нужную подстроку
0 SeiOkami
 
05.02.13
19:46
Не знаю как верно выразиться... Это в продолжение темы v8: Разбить ТаблицуЗначений на две: одна с положительными числами, а другая с отриц.

Как можно найти строки ТЗ, в которых текстовое значение содержит указанную подстроку?

К примеру у меня такие строки в ТЗ

Хлеб, "акфы", 900
Молоко, "выкф", 100
Мед, "ссвы", 845

Мне нужно найти строки, содержащие "акф".

В результате должна быть первая строка

Можно ли это реализовать без переборов? (а то приходится цикл в цикле цикла делать :) ). Как будет наиболее красиво и верно.

Задача вообще такая: нужно для каждой номенклатуры из ТЗ "откусывать" по символу из артикула и искать подходящую номенлатуру из другой ТЗ...
27 SeiOkami
 
05.02.13
20:30
(25), то бишь все же верный вариант - перебор в переборе?
28 H A D G E H O G s
 
05.02.13
20:33
(27) Нет.
29 vicof
 
05.02.13
20:33
(26) ПОДОБНО "ак%"
30 H A D G E H O G s
 
05.02.13
20:33
(27) Функция Найти() в переборе.
31 H A D G E H O G s
 
05.02.13
20:33
А Сервер -не трогайте.
Ему и без вас дохрена чем заняться есть.
32 Живой Ископаемый
 
05.02.13
20:34
2(26) ты пробовал какую-то хрень
33 vicof
 
05.02.13
20:35
(0) А какая вообще изначально задача была?
34 SeiOkami
 
05.02.13
20:36
так сложно разобраться в 1с, когда одни говорят, мол, "всё делать через запросы!", другие же утверждают обратное...
35 SeiOkami
 
05.02.13
20:36
и кому в этом мире можно верить ? =)
36 Живой Ископаемый
 
05.02.13
20:36
2(34) бе-е-е--дненький... лучи добра тебе и ласки.
37 SeiOkami
 
05.02.13
20:38
(36), бедненькие клиенты программистов, которые и вопросы не задают и не пытаются сделать "как лучше", а пишут "как выйдет"
38 DrShad
 
05.02.13
20:43
(37) не слушай Ежика - сервак в большинстве случаев простаивает так что лишний запрос ему не повредит
39 H A D G E H O G s
 
05.02.13
20:48
Гражданин Никулин видно не встречал пользователей, у которых забито по 24 гига оперативки и постоянной загрузкой 70-80 % 8 ядерного процессора под УТ11.
Надо показать его высказывание их начальнику ИТ, пусть порадуется.
40 SeiOkami
 
05.02.13
20:50
Сейчас пытаюсь с имитировать ситуацию в (0) и решить её при помощи НайтиСтроки() или Найти()... просто  я так и не понял как мне выдадут строки не по полному совпадению, а по нахождению подстроки...
41 Живой Ископаемый
 
05.02.13
20:51
благодаря тому что ты скормишь в качестве аргумента не весь артикул, а часть...
42 DrShad
 
05.02.13
20:51
(39) да ты упоротый! конечно встречал но узкое место любой машины не оперативка
43 vicof
 
05.02.13
20:51
В цикле строчку перебираешь и ищешь.
А вообще ответь на (33)
44 DrShad
 
05.02.13
20:52
(40) никак, ибо в найтиСтроки() или Найти() сравнение идет исключительно на равенство!
45 H A D G E H O G s
 
05.02.13
20:53
Для Каждого СтрокаТЗ Из ТЗ Цикл
Если Найти(СтрокаТЗ.КолонкаСДанными,ИскомаяСтрока)<>0 Тогда
46 DrShad
 
05.02.13
20:58
(45) бросай бухать! это будет адски долго, тем более на больших объемах
47 SeiOkami
 
05.02.13
21:00
не выходит... все же в (44) верно написано(
48 DrShad
 
05.02.13
21:02
(47) это и не только в (44) написано
49 DrShad
 
05.02.13
21:03
но ты же веришь всяким ушлепкам, а запрос упорно не хочешь юзать
50 МихаилМ
 
05.02.13
21:04
(0)
скд - отличный итератор . к тому же имет метод найти()
51 SeiOkami
 
05.02.13
21:07
Задача такова:

Есть склад. На нем номенклатура с минусом и плюсом. Нужно для номенклатуры с положительными остатками найти подходящую номенклатуру с отрицательными и поместить в док. пересортица, чтобы схлопнуть. "Поиск" производить по артикулу. Если точного совпадения нет, то откусываем от артикула символ и снова ищем. так пока не найдется нужное количество. если с одним артикулом найдены несколько строк, то выбирать по наиболее подходящей цене закупки, которую берем из последних доков поступления.

Задача поставлена точно. Изменять ее нельзя. Нужно реализовать... Перебором я б уже давно сделал... Хотел при помощи Найти(), однако не выходит. А запросом я так и не понял как это замутить. Пример в (14) выдает только по ПОЛНОМУ совпадению, а не по подстроке.

Туплю я. В этом не спорю. Но так хочу разобраться уже!
52 H A D G E H O G s
 
05.02.13
21:07
(46) ТададамТадам

перем ТЗ;
Процедура КнопкаВыполнитьНажатие(Кнопка)
   ТЗ=Новый ТаблицаЗначений;
   Тз.Колонки.Добавить("Данное");
   Для i=1 по 100000 цикл
       ТЗ.Добавить().Данное="Абырвалг";
   КонецЦикла;
   ТЗ.Добавить().Данное="Главрыба";
КонецПроцедуры

Процедура ОсновныеДействияФормыНайти(Кнопка)
   Для Каждого СтрокаТЗ ИЗ ТЗ Цикл
       Если Найти(СтрокаТЗ.Данное,"Главрыб")<>0 Тогда
           Сообщить(ТЗ.Индекс(СтрокаТЗ));
       КонецЕсли;
   КонецЦикла;
КонецПроцедуры

Время выполнения: 0,482776
53 DrShad
 
05.02.13
21:08
(52) Ежик, а ты всю ветку читал?
54 DrShad
 
05.02.13
21:10
+(53) ты в курсе что ТЗ формируется запросом, т.е. она уже на серваке, или ты считаешь что передача ТЗ в 30000 строк на клиента отработает быстрее че запрос к той же таблице на месте?

ТададамТадам
55 H A D G E H O G s
 
05.02.13
21:10
(53) Не читал, но осуждаю.
56 H A D G E H O G s
 
05.02.13
21:11
57 DrShad
 
05.02.13
21:11
(55) поздравляю тебя, но ты .....
58 NcSteel
 
05.02.13
21:12
(46) Ежов прав. Темболее надо найти первое совпадение.
60 NcSteel
 
05.02.13
21:12
(57) Не ворчи. тз в оперативке обычно быстрее работает, чем передовать на сервер и назад.
61 DrShad
 
05.02.13
21:13
(56) где нужно найти первое!
62 DrShad
 
05.02.13
21:13
(60) пилять, оно и так на серваке!
63 DrShad
 
05.02.13
21:14
тут походу дофига чукчей-пейсателей развелось и никто не читает
64 NcSteel
 
05.02.13
21:14
(61) "В результате должна быть первая строка"  из (0).
65 NcSteel
 
05.02.13
21:15
(62) Кто тебе сказал , что ТЗ уже на серваке?
66 DrShad
 
05.02.13
21:16
(64) это исходя из краткого примера в (0) а вообще в ТЗ порядка 30 000 строк
67 DrShad
 
05.02.13
21:17
(65) я тебе говорю - ибо она формируется серверной процедурой из запроса
68 NcSteel
 
05.02.13
21:19
(67) В упор не вижу данной инфы в теме. Ну да ладно.
69 DrShad
 
05.02.13
21:19
(68) а потому что это уже вторичная тема :)))
70 NcSteel
 
05.02.13
21:20
(69) В нулевом посте есть ссылка на другую тему. И судя по содержанию, не являются продолжением одна другой. В общем есть решение при ТЗ на клиенте предпочтительно использовать перебор. Если ТЗ на сервере, то тут надо анализировать.
71 vicof
 
05.02.13
21:20
(51) А нельзя просто отсортировать первоначальную таблицу по артикулам и сгруппировать?
72 NcSteel
 
05.02.13
21:21
(71) Глупость пишешь.
73 vicof
 
05.02.13
21:23
(72) Возможно.
74 vicof
 
05.02.13
21:25
Или в порядке бреда: соединять таблицу с самой собой, а в условии соединения пихать ПОДОБНО
75 DrShad
 
05.02.13
21:25
(70) уже 148 000 раз анализировали - запрос быстрее
76 DrShad
 
05.02.13
21:26
(74) ловите наркомана!
77 vicof
 
05.02.13
21:26
(76) тсс...хошь отсыплю?
78 DrShad
 
05.02.13
21:28
(77) неа
79 SeiOkami
 
05.02.13
21:29
пытаюсь запросом... надеюсь, выйдет нормальное чегось

Пока на полное совпадение такой запрос:

ВЫБРАТЬ
   ТоварыНаСкладахОстатки.Номенклатура,
   ТоварыНаСкладахОстатки.Номенклатура.Артикул КАК Артикул,
   ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) - ЕСТЬNULL(ТоварыНаСкладахОстатки.ВРезервеОстаток, 0) КАК Остаток
ПОМЕСТИТЬ ТоварыНаСкладе
ИЗ
   РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАК ТоварыНаСкладахОстатки
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТоварыНаСкладе.Номенклатура,
   ТоварыНаСкладе.Артикул,
   ТоварыНаСкладе.Остаток
ПОМЕСТИТЬ ИзлишкиНаСкладе
ИЗ
   ТоварыНаСкладе КАК ТоварыНаСкладе
ГДЕ
   ТоварыНаСкладе.Остаток > 0
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТоварыНаСкладе.Номенклатура,
   ТоварыНаСкладе.Артикул,
   ТоварыНаСкладе.Остаток
ПОМЕСТИТЬ НедостаткиНаСкладе
ИЗ
   ТоварыНаСкладе КАК ТоварыНаСкладе
ГДЕ
   ТоварыНаСкладе.Остаток < 0
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ИзлишкиНаСкладе.Номенклатура КАК НоменклатураИзлишки,
   ИзлишкиНаСкладе.Артикул КАК АртикулИзлишки,
   ИзлишкиНаСкладе.Остаток + НедостаткиНаСкладе.Остаток КАК ОсталосьСвернуть,
   НедостаткиНаСкладе.Номенклатура КАК НоменклатураНедостатки,
   НедостаткиНаСкладе.Артикул КАК АртикулНедостатки
ИЗ
   ИзлишкиНаСкладе КАК ИзлишкиНаСкладе
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ НедостаткиНаСкладе КАК НедостаткиНаСкладе
       ПО ИзлишкиНаСкладе.Артикул = НедостаткиНаСкладе.Артикул



Теперь же буду думать как организовать с не полным совпадением артикула
80 acsent
 
05.02.13
21:30
поиск на сиквеле не будет быстрее, ибо индекса то нет.
единственно  что может омрачить поиск на клиенте, так это хреновая работа 1с со строками
81 vicof
 
05.02.13
21:31
ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) - ЕСТЬNULL(ТоварыНаСкладахОстатки.ВРезервеОстаток, 0) КАК Остаток

Мило, учитывая, что нет соединений
82 SeiOkami
 
05.02.13
21:31
Это  так. На вскидку
83 SeiOkami
 
05.02.13
21:32
(81), зачем?
84 DrShad
 
05.02.13
21:32
(79) куда ТЗ подевал!? сц_уко
85 DrShad
 
05.02.13
21:33
и где ПОДОБНО?
86 SeiOkami
 
05.02.13
21:33
ТЗ у меня была в результате запроса на остатки товаров на складах...
87 Нуф-Нуф
 
05.02.13
21:33
ЗАПРОС
88 Нуф-Нуф
 
05.02.13
21:34
угадал?
89 DrShad
 
05.02.13
21:34
(79) тебе вообще чего нужно?
90 DrShad
 
05.02.13
21:35
(86) да ты упопротый - сабж об одном, а в итоге нам из предущей ветки подсунул запрос!? ушлепок
91 SeiOkami
 
05.02.13
21:36
(90), какая разница каким образом мы получаем ТЗ? Вопрос был по манипуляции с ТЗ. Я могу так же вместо первых временных таблиц передать ТЗ как параметр. Ничего то не меняется

Поставил ПОДРОБНО. Работает только при полном совпадении
92 Нуф-Нуф
 
05.02.13
21:37
%%
93 Нуф-Нуф
 
05.02.13
21:37
слева и справа
94 SeiOkami
 
05.02.13
21:37
* т.е. ПОДОБНО
95 Нуф-Нуф
 
05.02.13
21:37
от слова
96 Нуф-Нуф
 
05.02.13
21:38
которое ищешь
97 Нуф-Нуф
 
05.02.13
21:38
йоу!
98 DrShad
 
05.02.13
21:38
да он упоротый, че ты ему объясняешь ведь уже сто раз написали
99 NcSteel
 
05.02.13
21:39
100 vicof
 
05.02.13
21:39
(100)
101 Нуф-Нуф
 
05.02.13
21:40
(100) красава, дай пять!
102 NcSteel
 
05.02.13
21:41
(101) Учись студент.
103 vicof
 
05.02.13
21:41
(101) vicof - властелин сотки)
104 Нуф-Нуф
 
05.02.13
21:42
(102) Магистр сотки выше этого
105 Нуф-Нуф
 
05.02.13
21:42
(103) ранова-то ты себе звания назначаешь :)
106 vicof
 
05.02.13
21:44
(105) что-то мы отошли от темы.
107 Нуф-Нуф
 
05.02.13
21:47
(106) а я понял автор уже давно отошел. так что можно раскрывать тему сисек
108 SeiOkami
 
05.02.13
21:48
автор размышляет как можно реализовать (51)...
109 DrShad
 
05.02.13
21:48
(107) ну раскрывай - седня эта тема для меня не раскрыта :((((
110 Нуф-Нуф
 
05.02.13
21:49
(109) бугага! малыш плохо себя вел?
111 DrShad
 
05.02.13
21:50
(108) в (51) дебильная задача - она не подлежит решению ибо даже не тестировалась в Экселе
112 DrShad
 
05.02.13
21:51
(110) ну почему же, просто у жены 2-й, думаю дальше сам поймешь :)))
113 SeiOkami
 
05.02.13
21:51
(111), ?
114 NcSteel
 
05.02.13
21:52
(112) А у любовницы?
115 DrShad
 
05.02.13
21:52
(113) пересорт не решается без удаления причин
116 DrShad
 
05.02.13
21:53
(114) попросенок вчера был введен в курс дела :)))
117 Нуф-Нуф
 
05.02.13
21:53
(112) так недавно говорил что 4й! в показаниях путаетесь, батенька :)))
118 SeiOkami
 
05.02.13
21:54
(115), тут главное не зачем, а как

все равно выходит либо куча циклов либо куча вызовов запроса
119 DrShad
 
05.02.13
21:55
(112) а я разве говорил кем мне является обладательница?
120 DrShad
 
05.02.13
21:56
(118) борьба со следствиями никогда не приводила к успеху
121 SeiOkami
 
05.02.13
21:57
(120), все понятно, но от этого решение задачи не появляется(
122 Нуф-Нуф
 
05.02.13
21:58
123 DrShad
 
05.02.13
21:59
(122) ну я же там говорил что 4F и ни слова о том что это жена :)))
124 DrShad
 
05.02.13
21:59
(122) все намного проще - я при жене мисту не читаю :)))
125 DrShad
 
05.02.13
22:00
должна у меня быть тайна!? :)))
126 Serginio1
 
06.02.13
12:06
Сделай универсальную функцию и используй её
Функция НайтиПоУсловию(Тз,Условие,Список="")
Массив новый массив;
Для каждого Стр из Тз Цикл
  Если Вычислить(Условие) Тогда
    массив.Добавить(стр)
  КонецЕсли
КонецЦикла;
возврат Тз.Скопировать(массив)
КонецФункции

Рез=НайтиПоУсловию(тз,"стр.ФизЛицо=""Иванов""
   или стр.ФизЛицо=""Сидоров""
   или стр.ФизЛицо=""Петров""");

или
Список=ОбщегоНазначение.РазложитьСтрокуВМассивПодстрок("Иванов,Сидоров,Петров");

Рез=НайтиПоУсловию(тз,"Список.Найти(стр.ФизЛицо)<>Неопределено");

Или

Рез=НайтиПоУсловию(тз,"Найти(Врег(стр.Значение),Врег(""акф""))>0");