|
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
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |