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