Имя: Пароль:
1C
1C 7.7
v7: В цикле по ТЗ быстрее определить соответствие условию и проще выгрузить строку.
0 raykom
 
02.11.14
08:23
Здравствуйте.
Собственно продолжение порно-сериала "Дворник и 1С"

Иду по ТЗ циклом. В цикле надо быстро и красиво определить некоторую строку по условию
(одинаковая номенклатура в ТЗ и в переменной)
и надо как то простенько, но опять же быстро выгрузить данную строку в другую ТЗ.

Есть вот такой вот исходный код.
Поправьте алгоритм ?

       ТабДок = СоздатьОбъект("ТаблицаЗначений");
       ДокУдаляемСтроки = СоздатьОбъект("Документ."+СтрВидДокументаУдал);
              Пока Запрос.Группировка(1) = 1 Цикл
        ТабДок.Очистить();
        ТабДокНов.Очистить();
        ДокУдаляемСтроки.НайтиДокумент(Запрос.ВозвратОтПокупателя);
        ДокУдаляемСтроки.ВыгрузитьтабличнуюЧасть(ТабДок);
        Для Индекс = -ТабДок.КоличествоСтрок() По -1 Цикл
            ТабДок.ПолучитьСтрокуПоНомеру(-Индекс);
            Если ТабДок.Номенклатура = ВыбНоменклатура Тогда // ВОТ ЭТО ВОТ УСЛОВИЕ
                ТабДок.Выгрузить(ТабДокНов,-Индекс,-Индекс,"2,3"); //ВОТ ТУТ ВОТ ВЫГРУЖАЮ, НО ВЫГРУЖАЕТСЯ ОДНА СТРОКА ПЕРВАЯ СВЕРХУ ПО УСЛОВИЮ
            КонецЕсли;
        КонецЦикла;
1 raykom
 
02.11.14
08:27
Ну ... Все норм люди отдыхают, остальные на мисте сидят )))
2 Chai Nic
 
02.11.14
08:29
При наличии 1с++ и индексированной таблицы вопрос можно считать пятничным.
3 raykom
 
02.11.14
08:30
Да не. Про Спп уже тут говорили. Средствами платформы.
4 raykom
 
02.11.14
08:30
+(3)Вдругой ветке
5 Chai Nic
 
02.11.14
08:34
(3) Помню, я как-то один алгоритм распределения затрат в производственном учете (самописка) переделывал.. заменял использование таблицы значений на объект xbase во временном каталоге. Потому что тот имел возможность индексированного поиска, и получалось намного быстрее, чем искать в многотысячестрочной таблице, даже с учетом того, что xbase работает с файлами на диске. Вот на такие извращения приходилось идти.. хорошо, что 1с++ появился..)
6 raykom
 
02.11.14
08:36
(5)Понимаю, но так надо ))
Средствами платформы.
7 Фокусник
 
02.11.14
08:40
(0)
Не обязательно "находить объект" (в терминах 8ки):

ДокУдаляемСтроки.НайтиДокумент(Запрос.ВозвратОтПокупателя);
        ДокУдаляемСтроки.ВыгрузитьтабличнуюЧасть(ТабДок);


Можно ТЧ выгрузить из "Ссылки":

Запрос.ВозвратОтПокупателя.ВыгрузитьтабличнуюЧасть(ТабДок)
8 welwel
 
02.11.14
08:41
В тз есть вроде метод Найтизначение. Выгружать по условию надо одну строку или несколько?
9 raykom
 
02.11.14
08:42
(7)Да, но мне еще потом надо удалить строку из Документа записать его. Так что его надо все равно получать как объект.
10 raykom
 
02.11.14
08:42
(8)Ну совпадений может быть и несколько. И все надо будет выгрузить.
11 welwel
 
02.11.14
08:43
А если нужен перебор, то Выбратьстроки быстрее может быть
12 raykom
 
02.11.14
08:44
Быстрее чем ЦИКЛ ?
А что на счет саого сравнения ?
13 Фокусник
 
02.11.14
08:44
//ВОТ ТУТ ВОТ ВЫГРУЖАЮ, НО ВЫГРУЖАЕТСЯ ОДНА СТРОКА ПЕРВАЯ СВЕРХУ ПО УСЛОВИЮ

Потому что перебор ТЗ идет с конца, значит:
- выгрузил последнюю строку по условию
- предпоследнюю
...
- первую.

Каждая выгрузка ЗАТИРАЕТ предыдущие данные, поэтому остается в ТабДокНов только "первая по условию строка"

ИМХО, нужно делать ТабДокНов.НоваяСтрока()
и далее заполнять её через
ТабДокНов.Колонка1 = ТабДок.Колонка1
и т.д.
14 welwel
 
02.11.14
08:45
(10) тогда тз сортировать по номенклатура, можно в режиме *
Потом искать все совпадения - будут подряд идти, и выгружать
15 Фокусник
 
02.11.14
08:46
(9) А если НЕ будут найдены строки для удаления?

ИМХО, лучше сначала найти строки для удаления и только если они есть, ПОЛУЧАТЬ ОБЪЕКТ, удалять, записывать. А не каждый раз получать объект... ;)
16 welwel
 
02.11.14
08:47
(12) выбратьстроки и цикл по получитьстроку
17 welwel
 
02.11.14
08:49
(16) +
Но если из тз нужно удалять строки, тогда через ПолучитьСтрокуПоНомеру
18 welwel
 
02.11.14
08:51
Наверно лучше (14) и нахождение диапазона совпадения через ПолучитьСтрокуПоНомеру
19 welwel
 
02.11.14
08:54
+ может быстрее будет через тз.получитьзначение(тз.номерстроки, "номенклатура")
Т.к. без позиционирования на строке
20 welwel
 
02.11.14
08:55
(19) + это без ПолучитьСтрокуПоНомеру
21 raykom
 
02.11.14
08:56
(13)>Потому что перебор ТЗ идет с конца, значит:
- выгрузил последнюю строку по условию
- предпоследнюю
...
- первую.

Вот это не пойму как.


>Каждая выгрузка ЗАТИРАЕТ предыдущие данные, поэтому остается в ТабДокНов

Это понимаю, но думал может как то можно с добавлением.
Типа ЗаполнитьСтроку(ВыгрузитьСтроку()) или как то еще. С добавлением.

НоваяСТрока() - тут все понятно

(14)Сортировать в режиме* - Это что такое ?
(15)Логично. А с друго стороны - чем он мешает ? Получили и пуст висит, до вызова, а ?

(16)Не понял, что тут к чему - где выбирать и по чему циклом бежать ...

(17) Да, нужно удалять

(19)Так вот быстрее или нет ? Уж клюшки то старая тема, методы вроде уже на ощупь все должны знать ))
22 welwel
 
02.11.14
08:57
(14) тз.найтизначение должен искать первое вхождение, если не ошибаюсь
23 raykom
 
02.11.14
08:57
Отойду на 15 мин
24 welwel
 
02.11.14
08:59
(21) примеры по сортировать и получитьстроку в сп есть
25 Фокусник
 
02.11.14
09:00
(21) "А с друго стороны - чем он мешает ? Получили и пуст висит, до вызова, а ?"

А если из миллиона документов удалить строки нужно будет только в десяти документах? Просто лишнее расходование ресурсов :)

"Вот это не пойму как. "
Только через .НоваяСтрока(), т.к. ТЗ_источник.Выгрузить(ТЗ_приемник) ЗАТИРАЕТ всю ТЗ_приемник
26 Мимохожий Однако
 
02.11.14
09:01
(0)Если по сабжу:
1.Включил цикл перебора
2.Проверил условие
3.Добавил и заполнил новую строку в другой ТЗ.
А вот код и остальное к сабжу имеет не большое отношение.
27 raykom
 
02.11.14
09:03
(25)НЕ пойму как
Это я про
- выгрузил последнюю строку по условию
- предпоследнюю
...
- первую.
28 Фокусник
 
02.11.14
09:04
(27) Всё так же как у тебя, только вместо:
ТабДок.Выгрузить(ТабДокНов,-Индекс,-Индекс,"2,3")

делать
ТабДокНов.НоваяСтрока()
ТабДокНов.Номенклатура = ...
ТабДокНов.Колонка1 = ...
и т.д.
29 raykom
 
02.11.14
09:10
Понял. Но надо таки отойти )))
30 raykom
 
02.11.14
10:23
Вот так вот пока решилось ))

       ТабДок = СоздатьОбъект("ТаблицаЗначений");
       ТабДок2 = СоздатьОбъект("ТаблицаЗначений");
       ДокУдаляемСтроки = СоздатьОбъект("Документ."+СтрВидДокументаУдал);
              Пока Запрос.Группировка(1) = 1 Цикл
        ТабДок.Очистить();
        ТабДок2.Очистить();
        Док = Запрос.ВозвратОтПокупателя;
        Док.ВыгрузитьтабличнуюЧасть(ТабДок);
        Док.ВыгрузитьтабличнуюЧасть(ТабДок2);
        Для Индекс = -ТабДок.КоличествоСтрок() По -1 Цикл
            Если ТабДок.ПолучитьЗначение(-Индекс,"Номенклатура") = ВыбНоменклатура Тогда
                ТабДок.УдалитьСтроку(-Индекс);
            Иначе
                ТабДок2.УдалитьСтроку(-Индекс);
            КонецЕсли;
        КонецЦикла;


В итоге в одной ТЗ имею Удаленные строки, а в другой - оставшиеся, для возврата в документ.

Вроде нормально ?
31 raykom
 
02.11.14
10:29
учтено (19) от welwel
и (7)и(15) от Фокусник
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой