7.7 Ошибка в цикле

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем salton, 30 апр 2015.

  1. TopicStarter Overlay
    salton
    Offline

    salton

    Регистрация:
    30 апр 2015
    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1
    Никак не могу достичь цели.
    Вкратце нужно из ТЗ в табличную часть нового документа или уже существующего загрузить информацию. При этом не исключена повторная загрузка с исключением ранее загруженной информации.
    В ТЗ грубо говоря есть строки, 1 колонка - Менеджер, 2 - Идентификатор. 3 - число.
    В колонке Менеджер данные могут быть разные, в колонке Идентифкатор - данные разные.
    Нужно Взять Менеджера, проверить есть ли документ для него, если нет - создать и дальше заполнить табличную часть идентифкатором из второй колонки и числом из третьей.
    И так для каждой строки ТЗ.

    Есть код:

    Код:
    таб.ВыбратьСтроки(); // таб - заполенная ТЗ с информацией
    Пока таб.ПолучитьСтроку() = 1 Цикл
        локОтчет= "";
        тмпОтчет = СоздатьОбъект("Документ.Отчет");
        тмпОтчет.ВыбратьДокументы(ДатаСоздания,ДатаСоздания);
        Пока тмпОтчет.ПолучитьДокумент() = 1 Цикл
            Если тмпОтчет.Менеджер = таб.Менеджер Тогда
                локОтчет= тмпОтчет;
                Прервать;
            КонецЕсли;
        КонецЦикла;
        Если локОтчет= "" Тогда //если не существует документа - создаем новый
            локОтчет= СоздатьОбъект("Документ.Отчет");
            локОтчет.Новый();
            локОтчет.НоваяСтрока();
    
            //дальше заполняем первую строку документа информацией
        Иначе
            //документ уже существует
            локОтчет.ВыбратьСтроки();
            Пока локОтчет.ПолучитьСтроку()=1 Цикл
                            Если Число(локОтчет.Идентификатор)=СокрЛП(таб.Идентификатор) Тогда
                    //проверяем нет ли в существующем документе строки с информацией которую загрузили ранее
                    Продолжить; //если есть возвращаемся в начало цикла и смотрим на следующую строку
                КонецЕсли;
                локОтчет.НоваяСтрока();
                //дальше заполняем строку документа информацией       
            КонецЦикла;
        КонецЕсли;
    КонецЦикла

    в итоге при первичной загрузке информации из ТЗ документы создаются и заполняются, а при повторной загрузке - вся информация задваивается.
    Как избежать задвоения?
    Заранее благодарен!
  2. Хряк
    Offline

    Хряк Профессионал в 1С

    Регистрация:
    26 сен 2007
    Сообщения:
    1.447
    Симпатии:
    37
    Баллы:
    54
    вот ето никогда не выполняется
    Если Число(локОтчет.Идентификатор)=СокрЛП(таб.Идентификатор)
  3. TopicStarter Overlay
    salton
    Offline

    salton

    Регистрация:
    30 апр 2015
    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1
    заменил на Число(локОтчет.Идентификатор)=Число(таб.Идентификатор)
    ситуация не поменялась..
    смотрю в отладчике - загвоздка в том, что в цикле
    Пока таб.ПолучитьСтроку() = 1 Цикл

    я получаю таб.Идентифкатор - "1000", и дальше в цикле
    Пока локОтчет.ПолучитьСтроку()=1 Цикл

    сравниваю его с локОтчет.Идентификатор "1000", в следующей строке с локОтчет.Идентификатор "1001", и тут и добавляется задвоенная строка!

    как вернуться к началу первого цикла Пока таб.ПолучитьСтроку() = 1 Цикл?

    Где влепить возврат?
  4. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    у вас тут ошибка
    Код:
        Иначе
            //документ уже существует
            локОтчет.ВыбратьСтроки();
            Пока локОтчет.ПолучитьСтроку()=1 Цикл
    
    надо
    Код:
        Иначе
            //документ уже существует
            тмпОтчет.ВыбратьСтроки();
            Пока тмпОтчет.ПолучитьСтроку()=1 Цикл
    
  5. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    403
    Симпатии:
    71
    Баллы:
    54
    Здравствуйте.
    Сделайте новую переменную (как, например, уже имеющийся локОтчет) признаком того, что нужная строка в документе уже есть, и на выходе из цикла по строкам документа добавляйте в него при необходимости новую строку. Это произойдет только один раз для текущей строки таблицы.
  6. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Не обязательно. Достаточно исправить ошибку
  7. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    403
    Симпатии:
    71
    Баллы:
    54
    Возможно. Но тогда нужно прерывать цикл, а не продолжать его. Так?
    То есть, если нашли нужный идентификатор в строках документа, то зачем смотреть дальше и тем более создавать новую строку с этим же идентификатором.
    Последнее редактирование: 5 май 2015
  8. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Тут я с вами согласен... Но вы читали описание в перво посте? Я не уверен что автору удалось до конца выразить мысль

Поделиться этой страницей