8.х Чтение данных из текст.файла

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

  1. TopicStarter Overlay
    cobra77777
    Offline

    cobra77777 Опытный в 1С

    Регистрация:
    20 апр 2012
    Сообщения:
    154
    Симпатии:
    0
    Баллы:
    26
    Здравствуйте!

    Есть процедура чтение данных из текст.файла:


    Процедура ОсновныеДействияФормыПрочитать(Кнопка)
    Текст = Новый ТекстовыйДокумент;
    Текст.Прочитать("c://1.txt");
    Для НомерСтроки=1 по Текст.КоличествоСтрок() Цикл
    Стр=Текст.ПолучитьСтроку(НомерСтроки);
    Позиция=Найти (Стр, ";");
    Спр=Справочники.Клиенты.СоздатьЭлемент();
    Спр.Код = Сред (Стр,1,Позиция-1);
    Спр.Наименование = Сред(Стр,Позиция+1);
    Спр.Записать();
    КонецЦикла;
    КонецПроцедуры

    При вызове процедуры выходит такая ошибка:
    "Ошибка при вызове метода контекста (Записать)
    Спр.Записать();
    по причине:
    Значение поля "Код" не уникально"

    Где копать?
  2. 1cUserAndrew
    Online

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.948
    Симпатии:
    149
    Баллы:
    104
    Вы присваиваете код элементу справочника. Очевидно, такой код уже есть в справочнике.
    Попробуйте не присваивать код.
    Т.е. убрать эту строку:
    Код:
    Спр.Код = Сред (Стр,1,Позиция-1);
    Система будет это делать сама.
  3. TopicStarter Overlay
    cobra77777
    Offline

    cobra77777 Опытный в 1С

    Регистрация:
    20 апр 2012
    Сообщения:
    154
    Симпатии:
    0
    Баллы:
    26
    Я хотел более плотно изучить разбор строки в txt формате на каком нибудь примере (да и другим было бы интересно думаю). Могли бы рассказать ? Я понимаю, что сейчас txt не котируется больше XML, но для себя бы очень хотел бы понять принцип разбора строки. И если не сложно прямо построчно с комментариями разобрать каждую строчку.
  4. 1cUserAndrew
    Online

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.948
    Симпатии:
    149
    Баллы:
    104
    С текстовыми файлами я не работал. Как-то не приходилось.))
    Я просто указал, в чем ошибка. Эта ошибка никак не связана с работой с файлом.
    Она возникла по причине того, что Вы пытаетесь записать элемент с кодом, который уже существует в справочнике, а коды в справочнике, очевидно, должны быть уникальны.

    В принципе в приведенном коде, вроде, ничего сложного.

    Создается объект "ТекстовыйДокумент". И "запоминается" в переменной "Текст".
    Код:
    Текст = Новый ТекстовыйДокумент;
    Пока этот текст пустой (не содержит ни одной строки).

    На диске "С" имеется текстовый файл с именем "1.txt".
    "Прочитываем" файл:
    Код:
    Текст.Прочитать("c://1.txt");
    Теперь наш текст содержит текст из того файла. С этим текстом можно дальше работать.

    Организуем цикл по строкам текста (с первой по последнюю):
    Код:
    Для НомерСтроки=1 по Текст.КоличествоСтрок() Цикл
    На каждом витке цикла:

    Получаем строку:
    Код:
    Стр=Текст.ПолучитьСтроку(НомерСтроки);
    Ищем в строке "точку с запятой"
    Код:
    Позиция=Найти (Стр, ";");
    Создаем элемент справочника "Клиенты".
    Код:
    Спр=Справочники.Клиенты.СоздатьЭлемент();
    Устанавливаем код и наименование (видимо, код - это то, что идет в строке до точки с запятой, а наименование - все, что после).
    Код:
    Спр.Код = Сред (Стр,1,Позиция-1);
    Спр.Наименование = Сред(Стр,Позиция+1);
    Записываем элемент справочника
    Код:
    Спр.Записать();
  5. 1cUserAndrew
    Online

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.948
    Симпатии:
    149
    Баллы:
    104
    Все эти методы работы с текстовым документом можно посмотреть в Синтакс-помощнике (Общие объекты - Текстовый документ). Функции работы со строками (Найти, Сред) - Общее описание встроенного языка - Встроенные функции - Функции работы со значениями типа Строка.
  6. TopicStarter Overlay
    cobra77777
    Offline

    cobra77777 Опытный в 1С

    Регистрация:
    20 апр 2012
    Сообщения:
    154
    Симпатии:
    0
    Баллы:
    26
    Устанавливаем код и наименование (видимо, код - это то, что идет в строке до точки с запятой, а наименование - все, что после).
    Код:
    Спр.Код = Сред (Стр,1,Позиция-1);
    Спр.Наименование = Сред(Стр,Позиция+1);
    Еще один дурацкий вопрос Позиция-1, что означает ?
  7. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Позиция - это положение разделителя (;), в коде справочника он вам не нужен, поэтому и нужно уменьшать количество выбираемых символов из строки.
  8. 1cUserAndrew
    Online

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.948
    Симпатии:
    149
    Баллы:
    104
    Вы посмотрели в СП то, что я Вам предложил посмотреть? :)
    В данном случае интересует функция "Найти".

    "Позицию" получаем так (чуть выше по коду):
    Код:
    Позиция = Найти (Стр, ";");
    Т.е. в строке (переменная "Стр") мы ищем ";" (точку с запятой).
    В переменную "Позиция" попадает порядковый номер найденной подстроки. В данном случае порядковый номер символа ";".

    Далее смотрим в СП функцию "Сред".
    Код:
    Сред (Стр,1,Позиция-1);
    Это означает, что в строке ("Стр") мы выбираем символы, начиная с первого по "Позиция-1".
    Иными словами, начиная с начала строки до символа ";" (не включая саму точку с запятой).

    А тут
    Код:
    Сред(Стр,Позиция+1);
    выбираем все, начиная с символа, следующего за ";" (Позиция+1), и до конца строки.
  9. TopicStarter Overlay
    cobra77777
    Offline

    cobra77777 Опытный в 1С

    Регистрация:
    20 апр 2012
    Сообщения:
    154
    Симпатии:
    0
    Баллы:
    26
    1;Иванов Иван Петрович;2343;
    А как разобрать такую строчку чтобы оставить только: Иванов Иван Петрович ?
    Какие функции при этом использовать ?
  10. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Да всё те же: Найти и Сред. Только вызывать их надо несколько раз: либо в цикле, либо, если точно известно количество иттераций и их относительно немного, линейно несколько раз.

    Типа как-то так:[CODE1C]
    Стр = "1;Иванов Иван Петрович;2343;";
    Позиция = Найти(Стр, ";");
    Знач1 = Сред(Стр, 1, Позиция - 1);

    Стр = Сред(Стр, Позиция + 1);
    Позиция = Найти(Стр, ";");
    Знач2 = Сред(Стр, 1, Позиция - 1);

    Стр = Сред(Стр, Позиция + 1);
    Позиция = Найти(Стр, ";");
    Знач3 = Сред(Стр, 1, Позиция - 1);
    [/CODE1C]

    В Знач2 должно быть ваше Иванов Иван Петрович.
  11. TopicStarter Overlay
    cobra77777
    Offline

    cobra77777 Опытный в 1С

    Регистрация:
    20 апр 2012
    Сообщения:
    154
    Симпатии:
    0
    Баллы:
    26
    а в цикле как будет ?
  12. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    [CODE1C]Стр = "1;Иванов Иван Петрович;2343;";

    Позиция = Найти(Стр, ";");
    Пока Позиция > 0 Цикл
    Значение = Сред(Стр, 1, Позиция - 1);
    Сообщить(Значение);

    Стр = Сред(Стр, Позиция + 1);
    Позиция = Найти(Стр, ";");
    КонецЦикла;[/CODE1C]
Похожие темы
  1. ximera
    Ответов:
    5
    Просмотров:
    2.057
  2. wary
    Ответов:
    7
    Просмотров:
    12.009
  3. CSCO12103692
    Ответов:
    4
    Просмотров:
    486
Загрузка...

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