|
Оптимально удалить строки с отбором из ТаблицыЗначений | ☑ | ||
---|---|---|---|---|
0
Aradel3d
15.12.14
✎
08:48
|
Добрый день!
Подскажите как оптимально удалить строки с отбором из ТаблицыЗначений, таким образом чтоб в случае множественных значений отбора по одной колонке не запускать N отборов и N циклов удаления строк из ТЗ? Для НайтиСтроки() Отбор ведь структура, а там только одно значение на один ключ... в итоге получается не рационально. По идее мне нужен массив, строки которого пойдут как индекс для Удалить(), с типом значения и типом "Строка таблицы значений", полученный из ТЗ не методом НайтиСтроки(), а как? Запрос просто данные выдает. |
|||
1
DCKiller
15.12.14
✎
08:50
|
Выбери из таблицы запросом только те строки,которые нужно оставить, и выгрузи результат в ТЗ.
|
|||
2
Ник второй
15.12.14
✎
08:51
|
(1) + Но оптимальнее именно N отборов.
|
|||
3
Aradel3d
15.12.14
✎
08:52
|
Я пробовал запросом: Недопустимое значение параметра (параметр номер '1') (Строка не принадлежит коллекции)
|
|||
4
Zerg80
15.12.14
✎
08:52
|
Сделай удаление а-ля 7.7, то есть обратным обходом ТЗ. А внутри цикла сравнивай значения по Если..Тогда.
|
|||
5
DCKiller
15.12.14
✎
08:53
|
(3) щито?
|
|||
6
Aradel3d
15.12.14
✎
08:54
|
(5) Пишет, что строку которую я в данный момент подставил как индекс 1с не считает принадлежащей коллекции и выдает ошибку.
|
|||
7
Ник второй
15.12.14
✎
08:54
|
(6) Значит ты написал бредовый код.
|
|||
8
Aradel3d
15.12.14
✎
08:57
|
(7) там 3 строки, цикл и внутри удалить. А до этого два запроса выгруженных в ТЗ, при этом второй с условием сотрудник = &сотрудник. Не знаю где там можно написать бредовый код:)
|
|||
9
Ник второй
15.12.14
✎
08:57
|
(8) Если не работает, значит бредовый, так как 1С прекрасно работает с ТЗ в запросе.
|
|||
10
DCKiller
15.12.14
✎
08:59
|
(8) Ну покажи хоть, чего ты там понаписал, что ли...
|
|||
11
iamnub
15.12.14
✎
09:00
|
(0)
1C не работает нормально с коллекциями, да ей это и не нужно, так как этот язык заточен под другое, вот например план закупок под производство, тогда да, а отбор из коллекции, это ты что-то не то придумал, паря. |
|||
12
Aradel3d
15.12.14
✎
09:00
|
Ну не знаю...
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОплатаПраздничныхИВыходныхДнейОрганизацийНачисления.Сотрудник |ИЗ | Документ.ОплатаПраздничныхИВыходныхДнейОрганизаций.Начисления КАК ОплатаПраздничныхИВыходныхДнейОрганизацийНачисления |ГДЕ | ОплатаПраздничныхИВыходныхДнейОрганизацийНачисления.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка", Ссылка); РезультатЗапроса = Запрос.Выполнить().Выгрузить(); Запрос.Текст = "ВЫБРАТЬ | ОплатаПраздничныхИВыходныхДнейОрганизацийНачисления.Сотрудник |ИЗ | Документ.ОплатаПраздничныхИВыходныхДнейОрганизаций.Начисления КАК ОплатаПраздничныхИВыходныхДнейОрганизацийНачисления |ГДЕ | ОплатаПраздничныхИВыходныхДнейОрганизацийНачисления.Ссылка = &Ссылка | И ОплатаПраздничныхИВыходныхДнейОрганизацийНачисления.Сотрудник В(&Сотр)"; Сотр = Новый Массив(2); Сотр[0] = Справочники.СотрудникиОрганизаций.НайтиПоНаименованию("Уразов Николай Александрович"); Сотр[1] = Справочники.СотрудникиОрганизаций.НайтиПоНаименованию("Галиулина Ксения Сергеевна"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("Сотр", Сотр); РезультатЗапроса2 = Запрос.Выполнить().Выгрузить(); Для каждого стр из РезультатЗапроса2 Цикл РезультатЗапроса.Удалить(стр); КонецЦикла; |
|||
13
Aradel3d
15.12.14
✎
09:02
|
Документ тут не важен, хочется разобраться в удалении строк из ТЗ, оба запроса дают результат, массив заполняется.
|
|||
14
DCKiller
15.12.14
✎
09:04
|
(12) Даааааа...
|
|||
15
iamnub
15.12.14
✎
09:04
|
(12)
Жестишь. |
|||
16
Diman000
15.12.14
✎
09:06
|
(12) У тебя ТЗ разные, и ссылки на их строки к ссылкам на строки ТЧ док-та вообще никакого отношения не имеют.
|
|||
17
iamnub
15.12.14
✎
09:06
|
Для каждого стр из РезультатЗапроса2 Цикл
РезультатЗапроса.Удалить(стр); КонецЦикла; Это ересь, так как строка ТЗ принадлежит СВОЕЙ ТЗ, и соотвественно - в другой ТЗ её просто нет. |
|||
18
Diman000
15.12.14
✎
09:08
|
Чтобы удалять строки из ТЗ должен быть массив ссылок на строки именно этой ТЗ, а не какой-то там другой и не важно что они из одной ТЧ вытащены запросом.
Если у тебя сложные условия с коллекциями, то хороший вариант в (1). Если он по каким-то причинам не годится, то другой вариант это создать индекс в ТЗ. Тогда N отборов в цикле будут быстро пролетать. |
|||
19
13_Mult
15.12.14
✎
09:10
|
(13) твоё решение в (1)
|
|||
20
Aradel3d
15.12.14
✎
09:13
|
Ребята, вообще-то я в курсе, что строки из разных ТЗ, это просто ответ (1). Задачка не на результат, а на разобраться с удалением строк из ТЗ.
|
|||
21
Diman000
15.12.14
✎
09:16
|
(20)
В (1) совсем другое написано. Прочитай еще раз внимательнее. Там вообще не надо ничего удалять. |
|||
22
Aradel3d
15.12.14
✎
09:16
|
В общем решение такое: пишется функция, в которую передается исходная таблица, массив значений к отбору и название колонки отбора. В ней циклом подставляются отборы и полученное добавляется в массив. После получения таблички, удаление.
Таким образом не надо 100500 раз отбирать и удалять. Спасибо доброму дяде:) |
|||
23
piter3
15.12.14
✎
09:17
|
(22)и чем отличается от (1)
|
|||
24
Aradel3d
15.12.14
✎
09:18
|
Тем что меньше текста.
|
|||
25
DCKiller
15.12.14
✎
09:18
|
(20) Был бы в курсе, такое бы не написал:
Для каждого стр из РезультатЗапроса2 Цикл РезультатЗапроса.Удалить(стр); КонецЦикла; |
|||
26
Aradel3d
15.12.14
✎
09:19
|
Удаляю строки я сейчас таким же способом, только вместо РезультатЗапроса2 у меня массив найденных строк.
|
|||
27
Diman000
15.12.14
✎
09:21
|
Ясно дело, других способов и нет.
Только я не понял почему у тебя нет 100500 отборов, по-моему они остаются - "циклом подставляются отборы ". В (1) предложено решение вообще без удаления строк. |
|||
28
Aradel3d
15.12.14
✎
09:22
|
До этого я в ручную был вынужден их прописывать, было громоздко.
|
|||
29
Крошка Ру
15.12.14
✎
09:29
|
Честно говоря не пнял, чем обратный цикл не подошел...
|
|||
30
МихаилМ
15.12.14
✎
09:30
|
вот тема на 500 постов
http://forum.infostart.ru/forum86/topic118274/ тз.удалитьстроку очень медленный метод. |
|||
31
su_mai
15.12.14
✎
09:56
|
(0) А как такую же операцию выполняет SQL Server? Там многое зависит от количества строк в выборке, наличия индекса и т.п. Кроме того не ясно условие задается только на одну колонку или может задаваться на несколько, причем множественные?
|
|||
32
Aradel3d
15.12.14
✎
10:03
|
(31) По поводу SQL Server ничего не скажу. В моей задачке условие только по одной колонке. Одна колонка, много вариантов отбора. Чтоб не было нагромождений кода "Отбор N, Найти отбор N, удалить отбор N" я искал решение.
Может запросом к ТЗ по валидным параметрам и правильнее будет, с точки зрения сервера. Но это уже другой вопрос. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |