Имя: Пароль:
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) в данный момент процедура находит документы с определенной даты и по нужной номенклатуре и препроводит  по ним партии по УУ,
но нужно не по всей номенклатуре в документе ,а только по определенной соответственно необходимо вернуть старые движения по тем номенклатуре по которой изменения не нужны.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn