Имя: Пароль:
1C
 
Удаление строк в таблице значений по условию?
, ,
0 aramisov
 
27.11.14
11:56
Делаю цикл с конца как многие рекомендуют чтобы не было пропусков.
вопрос почему ошибка валиться
{Форма.Форма.Форма(301)}: Ошибка при вызове метода контекста (Получить)
            Стр = ПартииТоваровНаСкладахНовые.Получить(КоличествоСтрок - Счетчик);
по причине:
Значение индекса выходит за границы диапазона


вот кусок кода


    ДвиженияПартииТоваровНаСкладах.Прочитать();
        ПартииТоваровНаСкладахНовые = ДвиженияПартииТоваровНаСкладах.Выгрузить();
        
        КоличествоСтрок = ПартииТоваровНаСкладахНовые.Количество();
        
        Для Счетчик = 0 По КоличествоСтрок Цикл
            
            Стр = ПартииТоваровНаСкладахНовые.Получить(КоличествоСтрок - Счетчик);
            Номенклатура               =  Стр.Номенклатура;
            СерияНоменклатуры          =  Стр.СерияНоменклатуры;
            ХарактеристикаНоменклатуры =  Стр.ХарактеристикаНоменклатуры;
            Фильтр = Новый Структура();
            Фильтр.Вставить("Номенклатура,СерияНоменклатуры,ХарактеристикаНоменклатуры" , Номенклатура,СерияНоменклатуры,ХарактеристикаНоменклатуры);
            
            НайденыеСтроки = НужнаяНоменклатура.НайтиСтроки(Фильтр);
            Если НайденыеСтроки.Количество() > 0 Тогда
                ПартииТоваровНаСкладахНовые.Удалить(КоличествоСтрок - Счетчик);    
            КонецЕсли;    
            
        КонецЦикла;
1 mikecool
 
27.11.14
11:57
1) НайтиСтроки
2) удалить строки из первого массива
2 Wobland
 
27.11.14
11:57
с чего ты делаешь цикл?
3 Defender aka LINN
 
27.11.14
11:59
(0) Потому что кто-то даже не удосужился почитать, что делает метод "Получить"
4 Рэйв
 
27.11.14
12:02
(0)Двоечник.
КоличествоСтрок всегда на 1 больше максимального индекса.
5 Sammo
 
27.11.14
12:07
Помимо вышесказанного. Пример.
5 строк.
Счетчик будет от 0 до 5. Так. Т.е. 6 значений, а строк 5.
Это раз.
И два
Первый проход. 5-0. Будем удалять 5 строку. Какой у нее индекс?
6 Timon1405
 
27.11.14
12:12
(0)
1) выкинуть свой цикл
2) <расшифровка совета из (1)>Читать СП про методы НайтиСтроки и Удалить.
3) применить полученные от СП сокровенные знания
7 Крошка Ру
 
27.11.14
12:19
(0) У меня такое ощущение, что тебе советовали несколько человек и каждый свое, а ты решил все механически в одну кучу свалить, не разбирая, как же это работает. Тут и НайтиСтроки(), и цикл с конца, даже связь Счетчика и индекса строки не удосужился проверить.
8 DrZombi
 
гуру
27.11.14
12:26
(0) Зачем ты используешь "НайтиСтроки(Фильтр)"?
Когда все ровно ты удаляешь только одну запись. (вернее планируешь)
И при этом удаляешь черт знает что :)
9 DrZombi
 
гуру
27.11.14
12:29
(0) Что такое "ПартииТоваровНаСкладахНовые"?
Ты либо полный код выкладывай, либо сам пиши, что откуда берется :)

...
Код в топку, телепатия не работает :)
10 aramisov
 
27.11.14
12:33
(8) НайденыеСтроки = НужнаяНоменклатура.НайтиСтроки(Фильтр);
это таблица значений в которой проверяю есть ли данная номенклатура или нет если есть строчку в ПартииТоваровНаСкладахНовые удаляю

вот текст самой процедуры, пока не доделаный



Запрос = Новый Запрос;    
    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    Запрос.Текст =  "ВЫБРАТЬ
    |    Товары.Номенклатура,
    |    Товары.СерияНоменклатуры,
    |    Товары.ХарактеристикаНоменклатуры
    |ПОМЕСТИТЬ ТабТовары
    |ИЗ
    |    &Товары КАК Товары
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ТабТовары.Номенклатура,
    |    ТабТовары.СерияНоменклатуры,
    |    ТабТовары.ХарактеристикаНоменклатуры
    |ИЗ
    |    ТабТовары КАК ТабТовары";
    Запрос.УстановитьПараметр("Товары",Товары);
    НужнаяНоменклатура = Запрос.Выполнить().Выгрузить();
    
    
    
    
    
    Запрос.Текст = "ВЫБРАТЬ
    |    ПартииТоваровНаСкладахОбороты.Регистратор,
    |    ПартииТоваровНаСкладахОбороты.Регистратор.МоментВремени КАК РегистраторМоментВремени,
    |    СУММА(ПартииТоваровНаСкладахОбороты.КоличествоОборот) КАК КоличествоОборот
    |ИЗ
    |    РегистрНакопления.ПартииТоваровНаСкладах.Обороты(
    |            &НачПериод,
    |            &КонПериод,
    |            Запись,
    |            (Номенклатура, СерияНоменклатуры, ХарактеристикаНоменклатуры) В
    |                    (ВЫБРАТЬ
    |                        ТабТовары.Номенклатура,
    |                        ТабТовары.СерияНоменклатуры,
    |                        ТабТовары.ХарактеристикаНоменклатуры
    |                    ИЗ
    |                        ТабТовары КАК ТабТовары)
    |                И Организация = &Организация) КАК ПартииТоваровНаСкладахОбороты
    |ГДЕ
    |    НЕ ПартииТоваровНаСкладахОбороты.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
    |
    |СГРУППИРОВАТЬ ПО
    |    ПартииТоваровНаСкладахОбороты.Регистратор,
    |    ПартииТоваровНаСкладахОбороты.Регистратор.МоментВремени
    |
    |УПОРЯДОЧИТЬ ПО
    |    РегистраторМоментВремени";
    
    
    Запрос.УстановитьПараметр("Товары",Товары);
    Запрос.УстановитьПараметр("Организация",НачалоПроведения.Организация);
    Запрос.УстановитьПараметр("НачПериод",НачалоПроведения.МоментВремени());
    Запрос.УстановитьПараметр("КонПериод",ТекущаяДата());
    
    
    
    Результат = Запрос.Выполнить();
    
    ПартииТоваровНаСкладах  = Новый ТаблицаЗначений;
    ПродажиСебестоимость    = Новый ТаблицаЗначений;
    
    ОтражатьВУправленческомУчете = ИСТИНА;
    ОтражатьВБухгалтерскомУчете  = ЛОЖЬ;
    
    //Определим учетную политику
    СтруктраУчетов = Новый Структура();
    СтруктраУчетов.Вставить("Упр", ИСТИНА);
    СтруктраУчетов.Вставить("Бух", ЛОЖЬ);
    СтруктраУчетов.Вставить("Нал", ЛОЖЬ);
    
    
    Упр = ИСТИНА;
    Бух = ЛОЖЬ;
    Останавливаться = ЛОЖЬ;
    ПроведениеОстановлено = Ложь;
    ОбработаноСтрок = 0;
    ИспользуетсяРасширеннаяАналитикаУчета = ЛОЖЬ;    
    
    ТаблицаУчетныхПолитик = Новый ТаблицаЗначений();
    ТаблицаУчетныхПолитик.Колонки.Добавить("Организация", Новый ОписаниеТипов("СправочникСсылка.Организации"));
    ТаблицаУчетныхПолитик.Колонки.Добавить("ВидУчета", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(3)));
    ТаблицаУчетныхПолитик.Колонки.Добавить("УчетнаяПолитика");
    
    ДатаАктуальностиУчетнойПолитики = Дата("00010101");
    ФормироватьПроводки = ЛОЖЬ;
    
    Выборка = Результат.Выбрать();
    Пока Выборка.Следующий() Цикл
        Сообщить(Выборка.Регистратор);
        КоличествоСтрокВДокументе = 0;
        
        
        СтруктураНаборовЗаписей = Неопределено;
        # Если Сервер Тогда
            // При выполнении на сервере наборы записей создаем один раз
            СтруктураНаборовЗаписей = Новый Структура;
            СтруктураНаборовЗаписей.Вставить("ЕстьСтрокиОтражатьВУправленческомУчете" , ИСТИНА);
            СтруктураНаборовЗаписей.Вставить("ЕстьСтрокиОтражатьВБухгалтерскомУчете"  , ЛОЖЬ);
            СтруктураНаборовЗаписей.Вставить("ЕстьСтрокиОтражатьВНалоговомУчете"      , ЛОЖЬ);
            СтруктураНаборовЗаписей.Вставить("ЕстьСтрокиОтражатьВМеждународномУчете"  , ЛОЖЬ);
            
            УправлениеЗапасамиПартионныйУчет.СоздатьНаборыЗаписей(СтруктураНаборовЗаписей);
            
            СтруктураНаборовЗаписей.Удалить("ЕстьСтрокиОтражатьВУправленческомУчете");
            СтруктураНаборовЗаписей.Удалить("ЕстьСтрокиОтражатьВБухгалтерскомУчете");
            СтруктураНаборовЗаписей.Удалить("ЕстьСтрокиОтражатьВНалоговомУчете");
            СтруктураНаборовЗаписей.Удалить("ЕстьСтрокиОтражатьВМеждународномУчете");
        # КонецЕсли
        
        
        
        ОбъектДокумента = Выборка.Регистратор.ПолучитьОбъект();
        ДокументСсылка  =  Выборка.Регистратор;
        ДатаДокумента   =  ДокументСсылка.Дата;
        
        //Копируем Регистр ПартииТоваровНаСкладах
        ДвиженияПартииТоваровНаСкладах = ОбъектДокумента.Движения.ПартииТоваровНаСкладах;
        ДвиженияПартииТоваровНаСкладах.Прочитать();
        ПартииТоваровНаСкладах = ДвиженияПартииТоваровНаСкладах.Выгрузить();
        Попытка
            //Копируем Регистр ПродажиСебестоимость        
            ДвиженияПродажиСебестоимость = ОбъектДокумента.Движения.ПродажиСебестоимость;
            ДвиженияПродажиСебестоимость.Прочитать();
            ПродажиСебестоимость = ДвиженияПродажиСебестоимость.Выгрузить();
        Исключение
        КонецПопытки;
        
        
        
        
        УчетнаяПолитика = ПолучитьУчетнуюПолитикуИзКэша(ДатаДокумента, ДокументСсылка.Организация,    СтруктраУчетов,    ТаблицаУчетныхПолитик, ДатаАктуальностиУчетнойПолитики);
        
        Если (ТипЗнч(ДокументСсылка) = Тип("ДокументСсылка.КорректировкаСтоимостиСписанияТоваров"))
            ИЛИ (ТипЗнч(ДокументСсылка) = Тип("ДокументСсылка.РасчетСебестоимостиВыпуска"))  Тогда
            Период = КонецМесяца(ДокументСсылка.ПериодРегистрации);
            ДокументМоментВремени = Новый МоментВремени(Период, ДокументСсылка);
        Иначе
            ДокументМоментВремени = Новый МоментВремени(ДокументСсылка.Дата, ДокументСсылка);
        КонецЕсли;
        
        Если ТипЗнч(ДокументСсылка) = Тип("ДокументСсылка.ЗакрытиеЗаказовПокупателей") Тогда
            
            #Если Клиент Тогда
                Состояние("Проведение документа " + ДокументСсылка);
            #КонецЕсли
            
            ТаблицаСписания = ПолучитьТаблицуСтрокЗакрытиеЗаказовПокупателей(ДокументСсылка, ДокументСсылка.Организация, ОтражатьВУправленческомУчете, ОтражатьВБухгалтерскомУчете, ОтражатьВБухгалтерскомУчете);
            Если ТаблицаСписания.Количество() <> 0 Тогда                
                
                // Движение партий товаров по документу
                УправлениеЗапасамиПартионныйУчет.ДвижениеПартийТоваров (ДокументСсылка,
                ТаблицаСписания,
                КоличествоСтрокВДокументе,
                Упр,
                Бух,
                Бух,
                Останавливаться,
                ПроведениеОстановлено,
                ,
                Истина,
                СтруктураНаборовЗаписей,
                ФормироватьПроводки,
                Бух,
                УчетнаяПолитика);
                
                Если Останавливаться И ПроведениеОстановлено тогда
                    
                    ОтменитьТранзакцию();
                    Возврат;
                    
                КонецЕсли;
                
            КонецЕсли;
            
        ИначеЕсли ТипЗнч(ДокументСсылка) = Тип("ДокументСсылка.ПринятиеКУчетуОС") И (Бух ИЛИ Упр) Тогда
            // Принятие к учету ОС должно перепроводиться целиком по тем видам учета,
            // которые установлены и в документе и в обработке
            
            #Если Клиент Тогда
                Состояние("Проведение документа " + ДокументСсылка);
            #КонецЕсли
            
            Если ДокументСсылка.ВидОперации = Перечисления.ВидыОперацийПринятияКУчетуОсновныхСредств.Оборудование тогда
                ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
                #Если Клиент Тогда
                    Состояние("Обработано "+ОбработаноСтрок+". фиксация транзакции.");
                #КонецЕсли
                ЗафиксироватьТранзакцию();
                
                НачатьТранзакцию();
                
                ОбработаноСтрок = 0;
                
                Попытка
                    ДокументОбъект.Заблокировать();
                    ДокументОбъект.СтруктураВидовУчета = Новый Структура;
                    ДокументОбъект.СтруктураВидовУчета.Вставить("ОтражатьВУправленческомУчете",ОтражатьВУправленческомУчете);
                    ДокументОбъект.СтруктураВидовУчета.Вставить("ОтражатьВБухгалтерскомУчете",ОтражатьВБухгалтерскомУчете);
                    ДокументОбъект.СтруктураВидовУчета.Вставить("ОтражатьВНалоговомУчете",ОтражатьВБухгалтерскомУчете);
                    ДокументОбъект.СтруктураВидовУчета.Вставить("ОтражатьВНалоговомУчетеУСН",ОтражатьВБухгалтерскомУчете);
                    ДокументОбъект.СтруктураВидовУчета.Вставить("ФормироватьПроводки",ФормироватьПроводки);
                    ДокументОбъект.СтруктураВидовУчета.Вставить("СписыватьПартииНДС",ОтражатьВБухгалтерскомУчете);
                    ДокументОбъект.Останавливаться = Останавливаться;
                    ДокументОбъект.ПроведениеОстановлено = Ложь;
                    ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение,РежимПроведенияДокумента.Неоперативный);
                    ДокументОбъект.Разблокировать();
                    КоличествоСтрокВДокументе = ДокументОбъект.КоличествоСтрокВДокументе;
                    
                    Если Останавливаться И ДокументОбъект.ПроведениеОстановлено тогда
                        
                        ОтменитьТранзакцию();
                        Возврат;
                        
                    КонецЕсли;
                    
                    Сообщить("Перепроведен документ " + ДокументСсылка+ ". Возможно изменение стоимости ОС.");
                Исключение
                    ОтменитьТранзакцию();
                    Сообщить("Не удалось заблокировать документ " + ДокументСсылка);
                    НачатьТранзакцию();
                КонецПопытки;
            КонецЕсли;
            
        Иначе
            
            Если (Бух ИЛИ Упр) Тогда
                
                #Если Клиент Тогда
                    Состояние("Проведение документа " + ДокументСсылка);
                #КонецЕсли
                
                Если ИспользуетсяРасширеннаяАналитикаУчета Тогда
                    
                    // Движение партий товаров по документу
                    УправлениеЗапасамиПартионныйУчет.ДвижениеПартийТоваров (ДокументСсылка,
                    ,
                    КоличествоСтрокВДокументе,
                    Упр,
                    Бух,
                    Бух,
                    Останавливаться,//Движение по партиям можем не останавливать, даже если списались не все партии
                    ПроведениеОстановлено,
                    ДокументМоментВремени,
                    Истина,
                    СтруктураНаборовЗаписей,
                    ФормироватьПроводки,
                    Бух,
                    УчетнаяПолитика);
                Иначе                          
                    // Движение партий товаров по документу
                    УправлениеЗапасамиПартионныйУчет.ДвижениеПартийТоваров (ДокументСсылка,
                    ,
                    КоличествоСтрокВДокументе,
                    Упр,
                    Бух,
                    Бух,
                    Истина,
                    ПроведениеОстановлено,
                    ДокументМоментВремени,
                    Истина,
                    СтруктураНаборовЗаписей,
                    ФормироватьПроводки,
                    Бух,
                    УчетнаяПолитика);
                КонецЕсли;                      
                
                
                Если Останавливаться И ПроведениеОстановлено тогда
                    
                    ОтменитьТранзакцию();
                    Возврат;
                    
                КонецЕсли;
                
            КонецЕсли;
        КонецЕсли;
        
        
        
        
        
        //Возращаем старые Движения
        
        ДвиженияПартииТоваровНаСкладах.Прочитать();
        ПартииТоваровНаСкладахНовые = ДвиженияПартииТоваровНаСкладах.Выгрузить();
        
        КоличествоСтрок = ПартииТоваровНаСкладахНовые.Количество();
        
        Для Счетчик = 0 По КоличествоСтрок Цикл
            
            Стр = ПартииТоваровНаСкладахНовые.Получить(КоличествоСтрок - Счетчик);
            Номенклатура               =  Стр.Номенклатура;
            СерияНоменклатуры          =  Стр.СерияНоменклатуры;
            ХарактеристикаНоменклатуры =  Стр.ХарактеристикаНоменклатуры;
            Фильтр = Новый Структура();
            Фильтр.Вставить("Номенклатура,СерияНоменклатуры,ХарактеристикаНоменклатуры" , Номенклатура,СерияНоменклатуры,ХарактеристикаНоменклатуры);
            
            НайденыеСтроки = НужнаяНоменклатура.НайтиСтроки(Фильтр);
            Если НайденыеСтроки.Количество() > 0 Тогда
                ПартииТоваровНаСкладахНовые.Удалить(КоличествоСтрок - Счетчик);    
            КонецЕсли;    
            
        КонецЦикла;
        Для Каждого ИсхСтр  ИЗ    ПартииТоваровНаСкладах   Цикл
            Номенклатура               =  ИсхСтр.Номенклатура;
            СерияНоменклатуры          =  ИсхСтр.СерияНоменклатуры;
            ХарактеристикаНоменклатуры =  ИсхСтр.ХарактеристикаНоменклатуры;
            Фильтр = Новый Структура();
            Фильтр.Вставить("Номенклатура,СерияНоменклатуры,ХарактеристикаНоменклатуры" , Номенклатура,СерияНоменклатуры,ХарактеристикаНоменклатуры);
            НайденыеСтроки = НужнаяНоменклатура.НайтиСтроки(Фильтр);
            Если НайденыеСтроки.Количество() > 0 Тогда
                ТекСтр =  ПартииТоваровНаСкладахНовые.Добавить();
                ЗаполнитьЗначенияСвойств(ТекСтр,ИсхСтр);
            КонецЕсли;
        КонецЦикла;    
        ПартииТоваровНаСкладахНовые.Сортировать("НомерСтрокиСписанныхТоваров,НомерКорСтроки");
        ДвиженияПартииТоваровНаСкладах.Прочитать();
        ДвиженияПартииТоваровНаСкладах.Очистить();
        ДвиженияПартииТоваровНаСкладах.Загрузить(ПартииТоваровНаСкладахНовые);
        ДвиженияПартииТоваровНаСкладах.Записать();
    КонецЦикла
11 aramisov
 
27.11.14
12:39
(10) в данный момент процедура находит документы с определенной даты и по нужной номенклатуре и препроводит  по ним партии по УУ,
но нужно не по всей номенклатуре в документе ,а только по определенной соответственно необходимо вернуть старые движения по тем номенклатуре по которой изменения не нужны.