8.х Заполнение документа данными из текстового файла

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем New1CCoder8, 8 май 2008.

  1. TopicStarter Overlay
    New1CCoder8
    Offline

    New1CCoder8

    Регистрация:
    19 мар 2008
    Сообщения:
    39
    Симпатии:
    0
    Баллы:
    1
    Hello, all!
    Дан текстовый файл с набитыми построчно данными (строка - одно поле с данными).
    требуется написать обработку (данных много, поэтому обработка), которая построчно считывает данные и заполняет
    ими документ ПКО.

    Например, в файле:
    000001
    11.05.2008
    АванПост
    Иванов
    Оптовый
    2345
    Сидорова В.И.
    Основание_договор
    Приложение_на 3х листах
    СтатьяДДС_
    4534324
    18%


    Соответственно, после выполнения подобной обработки этими должны заполниться поля документа ПКО:
    Номер 000001 от 11.05.2008
    Контрагент АванПост - справочник
    Ответственный Иванов - строка
    и т.д.

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

    Если делать так:
    Код:
    Текст = Новый ТекстовыйДокумент;
    Текст.Прочитать("..\ПКО.txt");
    
    для номерстроки=1 по Текст.КоличествоСтрок() цикл
    стр=Текст.ПолучитьСтроку(номерстроки);
    Позиция=найти(стр,Символ(34));
    данные=сред(стр,6,позиция-1);
    Выборка=Документы.ПриходныйКассовыйОрдер.Выбрать();	
    Выборка.Ответственный=данные;
    КонецЦикла;	         	
    
    
    То "ругается" на Выборка.Ответственный=данные; говоря, что "Поле объекта недоступно для записи".
    Галку Только для просмотра я убрал.
  2. lazy
    Offline

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

    Регистрация:
    1 сен 2007
    Сообщения:
    2.127
    Симпатии:
    4
    Баллы:
    29
    Во первых - не забываем про тег code, сейчас модераторы придут, будут ругаться.
    Во вторых - насколько я понимаю, тебе нужно новые документы делать из данных файла выгрузки, вот и делай что то вроде
    Код:
    Док = Документы.ПриходныйКассовыйОрдер.СоздатьДокумент();
    Док.Ответственный = Данные;
    // и прочие атрибуты
    Док.Записать();
    
    Но если всеж охота работать с выборкой(ой, как сомнительно), то нужно получить объект документа и уже ему присвоить необходимые реквизиты.
    Код:
    Док = Выборка.Ссылка.ПолучитьОбъект();
    
  3. TopicStarter Overlay
    New1CCoder8
    Offline

    New1CCoder8

    Регистрация:
    19 мар 2008
    Сообщения:
    39
    Симпатии:
    0
    Баллы:
    1
    Так ведь не за многим и дело, что ошибка: "Поле объекта недоступно для записи " возникает при выполнении строки Док.Ответственный = Данные; которая, как Вы сами видите идет раньше Док.Записать(); !!!!!!!!!!
    Мне нужно, чтобы записывалось!!!!
    Я уже "играл" и со свойством Доступность и со свойством Только просмотр ничего!!!
    Сама форма документа вроде как НЕ только для чтения.
  4. LordKim
    Offline

    LordKim Опытный в 1С

    Регистрация:
    11 мар 2008
    Сообщения:
    118
    Симпатии:
    0
    Баллы:
    26
    А при чем тут Только просмотр?

    Тебе ж сказали получить объект, и заполнять объект, а в выборке ты получаешь не объект а ссылку...
  5. TopicStarter Overlay
    New1CCoder8
    Offline

    New1CCoder8

    Регистрация:
    19 мар 2008
    Сообщения:
    39
    Симпатии:
    0
    Баллы:
    1
    Да я понял, только в том и штука, что не катит. Через объект и делаю
    Вот код:
    Код:
    Текст = Новый ТекстовыйДокумент;
    Текст.Прочитать("ПКО.txt");	
    для номерстроки=3 по Текст.КоличествоСтрок() цикл
    стр=Текст.ПолучитьСтроку(номерстроки);
    Позиция=найти(стр,Символ(34));
    данные=сред(стр,6,позиция-1);
    ПКО=Документы.ПриходныйКассовыйОрдер.СоздатьДокумент();
    ПКО.Дата='20081112122343'; //'ГГГГММДДччммсс
    
    пко.Контрагент=данные;
    ПКО.Записать();
    КонецЦикла;	         		   
    
    
    переменная данные получает нужные данные из файла, а затем, в поле Контрагент кассового ордера получает знает значение этой переменной.
    Вот я и понять не могу, Контрагент пустой?
    И вообще компиллятор "кричит" на Ошибка при вызове метода контекста (Записать): Не задана дата документа, хотя дата документа - ПКО.Дата='20081112122343';
    Или не так?
  6. coder1cv8
    Offline

    coder1cv8 Опытный в 1С

    Регистрация:
    30 авг 2007
    Сообщения:
    101
    Симпатии:
    0
    Баллы:
    26
    Вам бы, батенька, книжек каких почитать... Или у вас Контрагент это строка? )
  7. lazy
    Offline

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

    Регистрация:
    1 сен 2007
    Сообщения:
    2.127
    Симпатии:
    4
    Баллы:
    29
    Ты контрагента ищи в справочнике, и только элемент справочника присваивай реквизиту:

    Код:
    пко.Контрагент=Справочники.Контрагенты.НайтиПоНаименованию(данные);
    

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