Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
18 апр 2024, 05:07

как бы вы переписали этот код?

Автор John_Connor, 02 сен 2015, 08:02

0 Пользователей и 1 гость просматривают эту тему.

John_Connor

                //*_*  в цикле перебирает ТЗ и по условию удаляет строки из ТЗ               

      УслугиГПМ=Справочники.СтатьиЗатрат.НайтиПоКоду("000000092") ;
      ТекущеееСодержаниеПодъездныхПутей =Справочники.СтатьиЗатрат.НайтиПоКоду("000011422") ;
      УслугиАвтотранспорта=Справочники.СтатьиЗатрат.НайтиПоКоду("000000088") ;
      ОперациНаЖД= Справочники.СтатьиЗатрат.НайтиПоКоду("000011409") ;
      ПРР=Справочники.СтатьиЗатрат.НайтиПоКоду("000011411") ;   
      ИндексЭлемента=0;
      числоСтрок=  ДанныеНаборовЗаписей.Хозрасчетный.количество();
      Пока ИндексЭлемента<числоСтрок Цикл
         Если  ДанныеНаборовЗаписей.Хозрасчетный[ИндексЭлемента].СчетКт= ПланыСчетов.Хозрасчетный.НайтиПоКоду("44.08")    ИЛИ
            ДанныеНаборовЗаписей.Хозрасчетный[ИндексЭлемента].СубконтоКт1= УслугиГПМ ИЛИ
            ДанныеНаборовЗаписей.Хозрасчетный[ИндексЭлемента].СубконтоКт1=ТекущеееСодержаниеПодъездныхПутей  ИЛИ
            ДанныеНаборовЗаписей.Хозрасчетный[ИндексЭлемента].СубконтоКт1= УслугиАвтотранспорта ИЛИ
            ДанныеНаборовЗаписей.Хозрасчетный[ИндексЭлемента].СубконтоКт1=ОперациНаЖД   ИЛИ
            ДанныеНаборовЗаписей.Хозрасчетный[ИндексЭлемента].СубконтоКт1=ПРР      // А вот это - самая фееричная строка
            Тогда
            ДанныеНаборовЗаписей.Хозрасчетный.Удалить(ИндексЭлемента);
            Если  ИндексЭлемента = 0 Тогда
               числоСтрок=числоСтрок-1;
               Продолжить
            иначе
               числоСтрок=числоСтрок-1;
               ИндексЭлемента=ИндексЭлемента-1;
            КонецЕсли;
            Продолжить;
         КонецЕсли;   
         ИндексЭлемента=ИндексЭлемента+1;
      КонецЦикла;
   

KrivosheevEV

[О] Красный
[1] Жёлтый
[2] Жёлтый
[3] Зелёный

Задача: Удалить строки, где "Жёлтый".
Метод: Перебор по индексу "сверху".

1.
[О] Красный
[1] Жёлтый  <- Индекс = 1, строка совпала - удаляем.
[2] Жёлтый
[3] Зелёный

2.
[О] Красный
[1] Жёлтый
[2] Зелёный <- Индекс = 2, Строка не совпала.





pavl_vs

John_Connor, проблема-то в чем?
Приведенный цикл работать не будет, или сработает неправильно, т.к. возврат по "продолжить" идет на строку "Если", как бы Вы не переопределяли параметр цикла числоСтрок в самом цикле.
Перепишите его на обход снизу.

vitasw

Интуитивно понимаю, что можно все решить в одном цикле. Я в таких ситуация просто нужные строки копирую в ТЗ, а затем результат загружаю в набор = очень упрощает логику.

John_Connor

Цитата: pavl_vs от 02 сен 2015, 11:03
John_Connor, проблема-то в чем?
Приведенный цикл работать не будет, или сработает неправильно, т.к. возврат по "продолжить" идет на строку "Если", как бы Вы не переопределяли параметр цикла числоСтрок в самом цикле.
Перепишите его на обход снизу.
проблема в том что код какой то не оптимизированный, да он  работает, но хочется оптимизации
Добавлено: 02 сен 2015, 11:42


Цитата: vitasw от 02 сен 2015, 11:05
Интуитивно понимаю, что можно все решить в одном цикле. Я в таких ситуация просто нужные строки копирую в ТЗ, а затем результат загружаю в набор = очень упрощает логику.
что за набор?

vitasw


Klyacksa

Перебирайте с конца набора, совпало - удаляем. В таком случае не нужно будет менять руками текущий индекс элемента.
Пока Счетчик = 1 по КолвоСтрок цикл
    Если ДанныеНаборовЗаписей.Хозрасчетный[КолвоСтрок - Счетчик].СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("44.08")    ИЛИ  ... тогда
        ДанныеНаборовЗаписей.Хозрасчетный.Удалить(КолвоСтрок - Счетчик);
    КонецЕсли;
КонецЦикла;
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Дмитрий@

Можно использовать метод "НайтиСтроки(Отбор)". Получаем массив строк, который нужно удалить.

vitasw

Цитата: Дмитрий@ от 02 сен 2015, 20:12Можно использовать метод "НайтиСтроки(Отбор)". Получаем массив строк, который нужно удалить.

Интересно как вы через отбор укажите условие "ИЛИ"?

TreeDogNight

Цитата: Klyacksa от 02 сен 2015, 11:50
Перебирайте с конца набора, совпало - удаляем. В таком случае не нужно будет менять руками текущий индекс элемента.
Пока Счетчик = 1 по КолвоСтрок цикл
    Если ДанныеНаборовЗаписей.Хозрасчетный[КолвоСтрок - Счетчик].СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("44.08")    ИЛИ  ... тогда
        ДанныеНаборовЗаписей.Хозрасчетный.Удалить(КолвоСтрок - Счетчик);
    КонецЕсли;
КонецЦикла;

Не Пока, а Для=)
Cегодня не все могут провести завтрашним числом. Вернее, не только лишь все - мало кто может это сделать.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск