|
Как правильно описать работу с Таблицей значений? | ☑ | ||
---|---|---|---|---|
0
new1snik
21.10.13
✎
08:48
|
День добрый.
Работаю с таблицей значений. В цикле перебираю элементы таблицы, нахожу строки с совпадениям по нескольким колонкам, на их основании формирую табличную часть документа, после этого удаляю из таблицы значений найденные строки. Для Каждого Товар Из ТаблицаПеремещения Цикл Структура = Новый Структура; Структура.Вставить("СкладОтправитель", Товар.СкладОтправитель); Массив = ТаблицаПеремещения.НайтиСтроки(Структура); Если Массив.Количество()>0 Тогда Для Каждого ТоварПеремещения Из Массив ЦИкл ..... ТаблицаПеремещения.Удалить(ТоварПеремещения); КонецЦикла; КонецЕсли; КонецЦикла; Но такой код обрабатывает не все строки из Таблицы значений. Например, когда после удаления в ТЗ остается только 1 строка, то она уже не будет обработана. Как сделать так, чтобы были обработаны все строки ТЗ? |
|||
1
Cube
21.10.13
✎
08:50
|
(0) Учись пользоваться поиском, для начала, а потом уже конфигуратор открывай...
https://www.google.ru/search?as_sitesearch=forum.mista.ru&q=v8+%D2%E0%E1%EB%E8%F6%E0+%E7%ED%E0%F7%E5%ED%E8%E9+%F3%E4%E0%EB%E8%F2%FC |
|||
2
Галахад
гуру
21.10.13
✎
08:52
|
(0) Может проще не удалять, а помечать как обработанные.
|
|||
3
Sammo
21.10.13
✎
08:53
|
Например, обработанную строку пишешь с массив строк.
Потом этот массив грузишь в документ и удаляешь из исходной таблицы. А так - откуда такая таблица появилась? Если запросом - сразу и обрабатывать. Если ТЗ нужна далее - добавить признак - грузить в документ. По отбору скопировать, по отбору удалить |
|||
4
1Сергей
21.10.13
✎
08:54
|
При обходе ТЗ нельзя удалять из неё строки.
Собирай строки в отдельный массив, и после Обхода ТЗ очищай |
|||
5
1Сергей
21.10.13
✎
08:54
|
Ну, или через ж - обходи строки с конца
|
|||
6
Cube
21.10.13
✎
08:55
|
(4) "При обходе ТЗ нельзя удалять из неё строки."
О как. А я удаляю... |
|||
7
1Сергей
21.10.13
✎
08:59
|
(6) как в (5)?
|
|||
8
1Сергей
21.10.13
✎
08:59
|
хотя, есть ещё спосо, да
|
|||
9
1Сергей
21.10.13
✎
08:59
|
*способ
|
|||
10
Borteg
21.10.13
✎
09:02
|
Индекс = ТаблицаЗначений.Количество() - 1;
Пока Индекс >= 0 Цикл ТаблицаЗначений.Удалить(Индекс); Индекс = Индекс -1; КонецЦикла; |
|||
11
1Сергей
21.10.13
✎
09:04
|
Индекс = 0;
Пока Индекс < ТаблицаЗначений.Количество() Цикл Если <условие> Тогда ТаблицаЗначений.Удалить(Индекс); Иначе Индекс = Индекс + 1; КонецЕсли; КонецЦикла; |
|||
12
drjc
21.10.13
✎
09:06
|
(10) такой код возможно не будет работать, а вот такой 100% будет
Для сч = 1-ТаблицаПеремещения .Количество() По 0 Цикл ТаблицаПеремещения.Удалить(-сч); КонецЦикла; |
|||
13
Borteg
21.10.13
✎
09:08
|
(12) весь НДС на таком коде)пока работает)
|
|||
14
drjc
21.10.13
✎
09:13
|
(13) согласен, это то же самое, это в (11) возможно не будет работать )
|
|||
15
drjc
21.10.13
✎
09:14
|
т.е. будет, но не оптимально, там метод в цикле вызывается
|
|||
16
new1snik
21.10.13
✎
09:40
|
(12) Спасибо, вроде работает. Но так как я иногда за раз удаляю несколько строк из таблицы, то после каждого удаления вставил обновление счетчика
Для сч = 1-ТаблицаПеремещения.Количество() По 0 Цикл Структура = Новый Структура; Структура.Вставить("СкладОтправитель", ТаблицаПеремещения.Получить(-сч).СкладОтправитель); Структура.Вставить("СкладПолучатель", ТаблицаПеремещения.Получить(-сч).СкладПолучатель); Структура.Вставить("Организация", ТаблицаПеремещения.Получить(-сч).Организация); Массив = ТаблицаПеремещения.НайтиСтроки(Структура); Если Массив.Количество()>0 Тогда Для Каждого ТоварПеремещения Из Массив ЦИкл ТаблицаПеремещения.Удалить(ТоварПеремещения); сч = -ТаблицаПеремещения.Количество(); КонецЦикла; КонецЕсли; КонецЦикла; |
|||
17
1dvd
21.10.13
✎
09:45
|
(16) быстрее отрабатывало бы (4)
|
|||
18
drjc
21.10.13
✎
09:53
|
вообще странный код какой-то, для чего это все? может проще методом Свернуть воспользоваться? ТаблицаПеремещения.Свернуть("СкладОтправитель,СкладПолучатель,Организация");
|
|||
19
new1snik
21.10.13
✎
10:02
|
(18) Я на основании этой таблицы создаю несколько документов перемещения, а в таблице находятся номенклатуры + кол-во перемещения + склады отправители/получатели + организация для перемещения и т.п информация.
|
|||
20
Sammo
21.10.13
✎
10:08
|
(19) Синтаксис:
Скопировать(<Параметры отбора>, <Колонки>) |
|||
21
drjc
21.10.13
✎
10:20
|
проще всего отсортировать по ключевым полям таблицу "СкладОтправитель,СкладПолучатель,Организация" и простым перебором при изменении любого из этих полей создавать новый документ,или поместить ее в виртуальную таблицу и запросом выбрать.
|
|||
22
drjc
21.10.13
✎
10:36
|
ТаблицаПеремещения=Новый ТаблицаЗначений;
МенеджерВременныхТаблиц=Новый МенеджерВременныхТаблиц; Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц=МенеджерВременныхТаблиц; Запрос.Текст = "ВЫБРАТЬ * |ПОМЕСТИТЬ ТаблицаПеремещения |ИЗ | &тз Как тз"; Запрос.УстановитьПараметр("тз",ТаблицаПеремещения); Запрос.Выполнить(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | тзПеремещения.СкладОтправитель КАК СкладОтправитель, | тзПеремещения.СкладПолучатель КАК СкладПолучатель, | тзПеремещения.Организация КАК Организация, | тзПеремещения.Номенклатура, | тзПеремещения.Количество |ИЗ | тзПеремещения КАК тзПеремещения |ИТОГИ ПО | Организация, | СкладОтправитель, | СкладПолучатель"; Результат = Запрос.Выполнить(); ВыборкаОрганизация = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаОрганизация.Следующий() Цикл ВыборкаСкладОтправитель = ВыборкаОрганизация.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаСкладОтправитель.Следующий() Цикл ВыборкаСкладПолучатель = ВыборкаСкладОтправитель.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаСкладПолучатель.Следующий() Цикл // создать новый док. ВыборкаДетальныеЗаписи = ВыборкаСкладПолучатель.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл // заполнить строки дока КонецЦикла; //записать док КонецЦикла; КонецЦикла; КонецЦикла; |
|||
23
new1snik
21.10.13
✎
10:38
|
(22) Спасибо, буду разбираться. С временными таблицами пока не работал.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |