8.х CSV

Тема в разделе "Общие вопросы "1С:Предприятие 8"", создана пользователем rerewe, 28 ноя 2012.

  1. TopicStarter Overlay
    rerewe
    Offline

    rerewe

    Регистрация:
    23 ноя 2012
    Сообщения:
    49
    Симпатии:
    0
    Баллы:
    1
    Привет!

    Имеется процедура чтения csv, которая выбирает строку, а далее режет ее на разделители и записывает значения в переменные. естественно всё это в цикле. В самом файле инфа о заказах.

    Проблема вот в чем, если в csv-файле имеются две одинаковые строки, отличием лишь является например товар. Получается два товара, две строки, один заказ, один контрагент. В общем процедура пропускает первую строку и начинает читать последнюю данного номера заказа.

    Код:
    Пока Стр <> Неопределено Цикл
    
    Стр = Текст.ПрочитатьСтроку();
    
    Пока СтрДлина(Стр) > 0 Цикл
    
    Именно в этом месте ошибка. Т.е. здесь пока еще нужное значение:
    Код:
    Пока Стр <> Неопределено Цикл
    Далее вот тут тоже все верно:
    Код:
    Стр = Текст.ПрочитатьСтроку();
    А вот тут уже выбирается почему-то последняя строка по данному заказу:
    Код:
    ока СтрДлина(Стр) > 0 Цикл
    Соответственно все некорректно считывается и проводки те что нужны не выходят
  2. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    представьте весь код цикла, так не скажешь...
  3. TopicStarter Overlay
    rerewe
    Offline

    rerewe

    Регистрация:
    23 ноя 2012
    Сообщения:
    49
    Симпатии:
    0
    Баллы:
    1
    Не могу секретная тайна)

    Вообщем исправил следующим образом. Хотя по-моему не верным.
    Было:
    Код:
    Пока Стр <> Неопределено Цикл
    
    Стр = Текст.ПрочитатьСтроку();
    
    Пока СтрДлина(Стр) > 0 Цикл
    Стало:
    Код:
    Пока Стр <> Неопределено Цикл
    
    Стр = Текст.ПрочитатьСтроку();
    
    Если СтрДлина(Стр) > 0 Тогда
    Т.е. зачем мне делать цикл внутри одной строки, я же знаю где у меня какое значение. Но это не все. Не читается именно первая строка. После добавления пустой строки сверзху все нормально отрабатывает.
    Сдается мне это не верно :dry:
  4. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    по тому кусочку кода, что вы привели, ответить вам в состоянии пожалуй только телепат. Мне же весь ваш код не нужен, нужны ключевые конструкции. А так - читайте описание методов в СП, разбирайтесь с вашим кодом

    есил вы до своего цикла уже использовали конструкцию
    Код:
     Стр = Текст.ПрочитатьСтроку();
    то получается, что внутри цикла вы считываете уже вторую строку. Это единственное предположение, дальше гадать не буду, либо конкретно представляйте код с просьбой помочь найти ошибку, либо читайте справку по методам
  5. TopicStarter Overlay
    rerewe
    Offline

    rerewe

    Регистрация:
    23 ноя 2012
    Сообщения:
    49
    Симпатии:
    0
    Баллы:
    1
    Да, до цикла имеется следующий алгоритм:
    Код:
    МассивДаты = новый Массив;
    Стр = Текст.ПрочитатьСтроку();
    ПозицияРазделителя = Найти(Стр, ";");
    МассивДаты.Добавить(Лев(Стр, ПозицияРазделителя - 1));
    ДатаДокумента = МассивДаты[0];
    ДатаДокумента = Сред(ДатаДокумента, 1, 10);
    ДеньА = Сред(ДатаДокумента, 1, 2);
    МесяцА = Сред(ДатаДокумента, 4, 2);
    ГодА = Сред(ДатаДокумента, 7, 4);
    ДеньБ = Сред(ДатаДокумента, 9, 2);
    МесяцБ = Сред(ДатаДокумента, 6, 2);
    ГодБ = Сред(ДатаДокумента, 1, 4);
    ДатаДокументаА = (ДеньА+"."+МесяцА+"."+ГодА);
    ДатаДокументаБ = (ГодБ+"."+МесяцБ+"."+ДеньБ);
    Если ДатаДокумента = ДатаДокументаА Тогда
    ДатаДокумента = (ГодА+"."+МесяцА+"."+ДеньА);
    ДатаДокумента = Дата(Число(Сред(ДатаДокумента, 1,4)), Число(Сред(ДатаДокумента, 6,2)), Число(Сред(ДатаДокумента, 9,4)));
    ИначеЕсли ДатаДокумента = ДатаДокументаБ Тогда
    ДатаДокумента = Дата(Число(Сред(ДатаДокумента, 1,4)), Число(Сред(ДатаДокумента, 6,2)), Число(Сред(ДатаДокумента, 9,4)))
    КонецЕсли;
    
    Т.е. получается чтение уже было и он начинает считывание второй строки? Интересно...
  6. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    вы откройте в СП описание функции ПрочитатьСтроку() там пример есть, ваш цикл, как мне кажется должен примерно так и выглядеть как в примере...

    кстати если не указывать разделитель в данной конструкции то считывать будет до символа ПС (перевод строки), посмотрите какой у вас разделитель...
  7. TopicStarter Overlay
    rerewe
    Offline

    rerewe

    Регистрация:
    23 ноя 2012
    Сообщения:
    49
    Симпатии:
    0
    Баллы:
    1
    Как заставить считать значения с уже прочитанной строки? Не повредив логику выполнения цикла, чтобы следующие строки цеплялись корректно друг за другом
  8. TopicStarter Overlay
    rerewe
    Offline

    rerewe

    Регистрация:
    23 ноя 2012
    Сообщения:
    49
    Симпатии:
    0
    Баллы:
    1
    В принципе ошибка понятна. Начинаю исправлять, спасибо)
  9. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    для спасиба есть кнопочка волшебная, а в цикле - поставьте Стр = Текст.ПрочитатьСтроку(); в конец тела цикла, тогда он сначала обработает считанную уже строку, а потом только считает новую (как в СП)
  10. TopicStarter Overlay
    rerewe
    Offline

    rerewe

    Регистрация:
    23 ноя 2012
    Сообщения:
    49
    Симпатии:
    0
    Баллы:
    1
    Так нельзя, т.к. логика повредится

    Нашел более изощренный способ:
    В начале цикла делаю условие. Т.к. я знаю что в процессе чтение значения строки у меня удаляются, соответственно в конце остается Стр="". И я вполне могу знать что данное условие отработает 100%
    Код:
    Если Стр = "" Тогда
    Стр = Текст.ПрочитатьСтроку();
    Иначе
    Перейти ~Дальше;
    КонецЕсли;
    ~Дальше:
    
    Получается что в начале до цикла в Стр имеется значение и его я и выполню, затем сотру строку и выберу следующую
  11. Dmitriy_76
    Offline

    Dmitriy_76 Опытный в 1С Команда форума

    Регистрация:
    26 мар 2011
    Сообщения:
    2.174
    Симпатии:
    13
    Баллы:
    29
    Только обязательно коммент к такому куску кода сделай, с указанием телефона и адреса, чтоб тот кто будет после тебя разбираться знал кого застрелить :)
  12. TopicStarter Overlay
    rerewe
    Offline

    rerewe

    Регистрация:
    23 ноя 2012
    Сообщения:
    49
    Симпатии:
    0
    Баллы:
    1
    Уже)
  13. Dmitriy_76
    Offline

    Dmitriy_76 Опытный в 1С Команда форума

    Регистрация:
    26 мар 2011
    Сообщения:
    2.174
    Симпатии:
    13
    Баллы:
    29
    как минимум ... :

    Код:
    Стр = Текст.ПрочитатьСтроку();
    Пока НЕ Стр = "" Цикл
    //обрабатываем СТР
    Стр = Текст.ПрочитатьСтроку();
    КонецЦикла;

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