Имя: Пароль:
1C
1С v8
Оптимально удалить строки с отбором из ТаблицыЗначений
,
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" я искал решение.

Может запросом к ТЗ по валидным параметрам и правильнее будет, с точки зрения сервера. Но это уже другой вопрос.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший