7.7 Не редактируется документ!

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

  1. TopicStarter Overlay
    SandMan_ch
    Offline

    SandMan_ch

    Регистрация:
    11 янв 2008
    Сообщения:
    36
    Симпатии:
    0
    Баллы:
    1
    Имеем такой фрагмент кода (грузит из файла контрагентов и пытается их прописать в накладных):
    Выдается ошибка при попытке записать документ - не выбран документ! Попытка при этом считать реквизит документа успешен. В чем причина???

    ............................

    Код:
    Док=СоздатьОбъект("Документ");
    ДокП=СоздатьОбъект("Документ.ПриходныйОрдер");     
    ДокР=СоздатьОбъект("Документ.РасходныйОрдер");             
    Спр=СоздатьОбъект("Справочник");
    
    Для i=1 по ДБФ.КоличествоЗаписей() Цикл
    
    Док.НайтиПоНомеру(СокрЛП(ДБФ.NOMER), СокрЛП(ДБФ.DATA), СокрЛП(ДБФ.PREFIX));
    Если Док.Выбран()=1 Тогда            
    
    Спр.Вид(СокрЛП(ДБФ.VID));
    Спр.НайтиПоКоду(СокрЛП(ДБФ.COD));
    
    Если Спр.Выбран()>0 Тогда
    Если СокрЛП(ДБФ.PREFIX)="ПриходныйОрдер" Тогда
    ДокП=Док.ТекущийДокумент();
    Сообщить(ДокП.ПринятоОт);
    ДокП.ПринятоОт=Спр.ТекущийЭлемент();
    ДокП.Записать();
    ИначеЕсли СокрЛП(ДБФ.PREFIX)="РасходныйОрдер" Тогда  
    ДокР=Док.ТекущийДокумент();                 
    ДокР.Выдать=Спр.ТекущийЭлемент();
    ДокР.Записать();
    Иначе
    Сообщить("Неизвестная ошибка!");
    Break;
    КонецЕсли;            
    КонецЕсли;
    
    ДБФ.Следующая();
    Иначе     
    Сообщить("Ошибка! Документ не найден!");
    Break;
    КонецЕсли;
    
    КонецЦикла;
    КонецЕсли;
    
    ............................

    V. Общие правила оформления сообщений
    1. Оформляйте код программы с помощью тега
    Код:
     Подробно ознакомиться с тэгами и их использованием можно [url="http://www.1c-pro.ru/index.php?s=&act=legends&CODE=bbcode"]тут[/url]. В редакторе сообщения можно выделить необходимый участок текста и нажать кнопку "#" для автоматического добавления тега [CODE][/color]
  2. Stado_adama
    Offline

    Stado_adama Модераторы Модератор

    Регистрация:
    27 ноя 2007
    Сообщения:
    1.086
    Симпатии:
    0
    Баллы:
    26
    спозиционируйся на документе... ты позиционируешся последний раз на справонике...

    примерно так:

    Код:
    Спр.Вид(СокрЛП(ДБФ.VID));
    Спр.НайтиПоКоду(СокрЛП(ДБФ.COD));
    XX = Спр.ТекущийДокумент();
    
    Если Спр.Выбран()>0 Тогда
    Если СокрЛП(ДБФ.PREFIX)="ПриходныйОрдер" Тогда
    ДокП=Док.ТекущийДокумент();
    Сообщить(ДокП.ПринятоОт);
    ДокП.ПринятоОт=XX;
    ДокП.Записать();
    
    
  3. TopicStarter Overlay
    SandMan_ch
    Offline

    SandMan_ch

    Регистрация:
    11 янв 2008
    Сообщения:
    36
    Симпатии:
    0
    Баллы:
    1
    Честно говоря, очень странно. Я пишу обычно Си. Но по концепциям ООП должно быть без разницы, на чем последнем произошло позиционирование. По идее - Док и Спр - экземпляры разных объектов. И методы каждого экземпляра объекта изменяют позицию конкретно того, по отношению к которому был вызван метод. Разве не так? В любом случае в понедельник попробую предложенный Вами вариант.
  4. TopicStarter Overlay
    SandMan_ch
    Offline

    SandMan_ch

    Регистрация:
    11 янв 2008
    Сообщения:
    36
    Симпатии:
    0
    Баллы:
    1
  5. TopicStarter Overlay
    SandMan_ch
    Offline

    SandMan_ch

    Регистрация:
    11 янв 2008
    Сообщения:
    36
    Симпатии:
    0
    Баллы:
    1
    Ничего не помогло. Та же самая ошибка. Еще идеи есть?
  6. ЧКДзержинский
    Offline

    ЧКДзержинский Опытный в 1С

    Регистрация:
    7 дек 2006
    Сообщения:
    487
    Симпатии:
    3
    Баллы:
    29
    Сначала ты пишешь: ДокП=СоздатьОбъект("Документ.ПриходныйОрдер");, а потом: ДокП=Док.ТекущийДокумент();. Спрашивается: зачем было объявлять переменную типа "Документ.ПриходныйОрдер"? Возможно ты пишешь на С#, так вот: 1С не является строго типизированным. Ты можешь присвоить переменной некое значение без предварительного объявления. Потом ты можешь той же переменной присвоить значение другого типа и т.д.
    Вместо ДокП=Док.ТекущийДокумент(); нужно писать: ДокП.НайтиДокумент(Док.ТекущийДокумент());
    а потом уже редактируй и записывай.
  7. TopicStarter Overlay
    SandMan_ch
    Offline

    SandMan_ch

    Регистрация:
    11 янв 2008
    Сообщения:
    36
    Симпатии:
    0
    Баллы:
    1
    Да дело не в этом. Ввод новой переменной тут вообще не нужен. Это я просто экспериментировал уже. На самом деле ошибка была вот в чем:

    Код:
    ДокП=Док.ТекущийДокумент();
    
    А ведь Док - это ссылка на документ, а не на выборку документов!

    Должно было выглядеть так:

    Код:
            Док=СоздатьОбъект("Документ");
    Спр=СоздатьОбъект("Справочник");
    
    Для i=1 по ДБФ.КоличествоЗаписей() Цикл
    
    Док.НайтиПоНомеру(СокрЛП(ДБФ.NOMER), СокрЛП(ДБФ.DATA), СокрЛП(ДБФ.PREFIX));
    Если Док.Выбран()=1 Тогда            
    Спр.Вид(СокрЛП(ДБФ.VID));
    Спр.НайтиПоКоду(СокрЛП(ДБФ.COD));
    Если Спр.Выбран()>0 Тогда
    Если СокрЛП(ДБФ.PREFIX)="ПриходныйОрдер" Тогда
    Сообщить(Док.ТекущийДокумент().ПринятоОт);
    Док.ПринятоОт=Спр.ТекущийЭлемент();
    Док.Записать();
    ИначеЕсли СокрЛП(ДБФ.PREFIX)="РасходныйОрдер" Тогда  
    Сообщить(Док.ТекущийДокумент().Выдать);
    Док.Выдать=Спр.ТекущийЭлемент();
    Док.Записать();
    Иначе
    Сообщить("Неизвестная ошибка!");
    Break;
    КонецЕсли;            
    КонецЕсли;
    

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