Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > 1С: Проблемы и решения > договор контрагента


Автор: ^D^ima 01.03.17, 12:37
Бух 3.0, не вытаскивается договор контрагента.
делаю так:
ФормаКонтрагент - справочник.ссылка.контрагент
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    &НаКлиенте
    Процедура Сформировать(Команда)
            
        НайтиДоговорКонтрАгента(ФормаКонтрагент);
    КонецПроцедуры
     
    &НаСервере
    Процедура НайтиДоговорКонтрАгента(ФормаКонтрагент)
        КАгент = Новый Структура;
        КАгент.Вставить("Контрагент",ФормаКонтрагент);
        ФормаДоговор = РегистрыСведений.ОсновныеДоговорыКонтрагента.Получить(ТекущаяДата(),КАгент)[0];
        
    КонецПроцедуры


Пишет "несоответствие типов"

Автор: evGenius 01.03.17, 13:26
Откуда взялась ФормаКонтрагент? Кусок кода можно?

Автор: ^D^ima 01.03.17, 13:44
evGenius
Это реквизит на форме, не более того.
____________.zip (, : 122)

Автор: kosten 01.03.17, 13:47
Цитата ^D^ima @
Это реквизит на форме, не более того.

И какой тип попадает в твою функцию?

Автор: ^D^ima 01.03.17, 13:50
справочник.ссылка.контрагент, я написал.

Или для регистров сведений нужны все реквизиты? Там их 3

Автор: kosten 01.03.17, 13:51
Цитата ^D^ima @
Это реквизит на форме, не более того.

Это строка. Ты уверен, что по строке сработает поиск договора? Раз ругается на несоответствие типов, то скорее всего надо ссылку на контрагента передавать.

Добавлено
Цитата ^D^ima @
ФормаКонтрагент - справочник.ссылка.контрагент

У меня открылось, как строка.

Автор: ^D^ima 01.03.17, 13:58
Нет, как ссылка
1.png (, : 555)

Автор: evGenius 01.03.17, 14:06
Ты в ФормаДоговор пытаешься запись регистра запихнуть. Надо дописать что-то типа".Договор".

Автор: ^D^ima 01.03.17, 14:12
evGenius
Я делаю вообще сообщить, то-же самое

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    &НаСервере
    Процедура НайтиДоговорКонтрАгента(ФормаОрганизация,ФормаКонтрагент)
        
        Сообщить(ФормаКонтрагент);
     
        КАгент = Новый Структура;
        КАгент.Вставить("Организация",ФормаОрганизация);
        КАгент.Вставить("Контрагент",ФормаКонтрагент);
        КАгент.Вставить("ВидДоговора",Перечисления.ВидыДоговоровКонтрагентов.СПокупателем);
     
        Сообщить(РегистрыСведений.ОсновныеДоговорыКонтрагента.Получить(ТекущаяДата(),КАгент)[0]);
     
     
    КонецПроцедуры

Автор: evGenius 01.03.17, 14:15
Так а как программа будет сообщать запись регистра?

Автор: ^D^ima 01.03.17, 14:41
Я думаю что должна сообщить, так-же как и ссылку на контрагента.

Ошибка все-равно в чем-то другом, через отладчик не вычислить сообщение
____________________.png (, : 586)

Автор: evGenius 01.03.17, 15:14
Проблема в том, что регистр сведений непериодический, у метода Получить() не должно быть параметра-даты, только отбор.

Добавлено
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    &НаСервере
    Процедура НайтиДоговорКонтрАгента(ФормаОрганизация,ФормаКонтрагент)
     
        КАгент = Новый Структура;
        КАгент.Вставить("Организация",ФормаОрганизация);
        КАгент.Вставить("Контрагент",ФормаКонтрагент);
        КАгент.Вставить("ВидДоговора",Перечисления.ВидыДоговоровКонтрагентов.СПокупателем);
     
        ФормаДоговор = РегистрыСведений.ОсновныеДоговорыКонтрагента.Получить(КАгент)[0].Договор;
     
    КонецПроцедуры

Автор: ^D^ima 02.03.17, 06:09
Цитата evGenius @
не должно быть параметра-даты, только отбор.

:crazy: :crazy: :crazy:
А это тогда о чем?
____________________.png (, : 580)

Автор: ^D^ima 02.03.17, 06:47
ошибка все-равно остается:
Error.png (, : 578)

Автор: ^D^ima 02.03.17, 10:27
В итоге сделал так: Ид другого справочника взял данные.
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
        ДоговорКонтрАгента = новый Запрос;
        ДоговорКонтрАгента.Текст = "ВЫБРАТЬ
                                   |    ДоговорыКонтрагентов.Ссылка
                                   |ИЗ
                                   |    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
                                   |ГДЕ
                                   |    ДоговорыКонтрагентов.Владелец = &Владелец
                                   |    И ДоговорыКонтрагентов.Организация = &Организация";
        ДоговорКонтрАгента.УстановитьПараметр("Организация",ФормаОрганизация);
        ДоговорКонтрАгента.УстановитьПараметр("Владелец",ФормаКонтрагент);
        
        Выборка = ДоговорКонтрАгента.Выполнить().Выбрать();
        
        Выборка.Следующий();
        
        ФормаДоговор=Выборка.ссылка;


Вместо запроса пытался сделать структуру, не получилось.
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    КАгент = Новый Структура;
    КАгент.Вставить("Организация",ФормаОрганизация);
    КАгент.Вставить("Владелец",ФормаКонтрагент);
    ФормаДоговор = Справочники.ДоговорыКонтрагентов.ПолучитьДанныеВыбора(КАгент);


Ещё одно непонятное:
В справочнике ДоговорКонтрАгента нет реквизита Владелец.
- Я не наблюдаю его визуально. проверил все реквизиты, нигде нет ни названия "Владелец" ни ссылки на контрагента у других реквизитов.
- Этот код
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ФормаДоговор = Справочники.ДоговорыКонтрагентов.НайтиПоРеквизиту("Владелец",ФормаКонтрагент);
ругается на Неверно указан реквизит. При этом такой код:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ФормаДоговор = Справочники.ДоговорыКонтрагентов.НайтиПоРеквизиту("Организация",ФормаОрганизация);
    Сообщить(ФормаДоговор.Владелец);

Отрабатывает на ура. Т.е в запросе можно указать это реквизит, сообщить его можно, но найти по нему нельзя(его и нет в справочнике в принципе). Откуда вашу **** взялся этот Владелец??????? :wall:

Автор: evGenius 02.03.17, 10:42
Владелец - это хитрый реквизит, не совсем реквизит, как и Родитель. По нему нельзя так искать. Он появляется, когда справочник подчиняется другому.

Добавлено
Попозже вечером напишу как правильно сделать процедуру поиска договора, сейчас под рукой БП3 нет.

Автор: ^D^ima 02.03.17, 11:32
Как же 1-ка меня нервирует...
Почему в конфигураторе нет документа "Оказание производственных услуг", а в 1-ке он откуда-то берется. Вопрос откуда и как его тогда программно создавать?
Docs.jpg (, : 558)

Автор: evGenius 02.03.17, 12:06
Это синоним. Встаем в конфигураторе на корень "Документы", Ctrl+F - ищем по синониму.

Автор: evGenius 03.03.17, 05:34
Я бы сделал так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Функция ПолучитьДоговорКонтрагента(Контрагент, Организация, ВидДоговора)
            // сначала ищем основной
        ЗапросПоиска = Новый Запрос(
        "ВЫБРАТЬ РАЗРЕШЕННЫЕ
        |    ОсновныеДоговорыКонтрагента.Договор
        |ИЗ
        |    РегистрСведений.ОсновныеДоговорыКонтрагента КАК ОсновныеДоговорыКонтрагента
        |ГДЕ
        |    ОсновныеДоговорыКонтрагента.Контрагент = &Владелец
        |    ОсновныеДоговорыКонтрагента.ВидДоговора = &ВидДоговора
        |    И ОсновныеДоговорыКонтрагента.Организация = &Организация");
        ЗапросПоиска.УстановитьПараметр("Организация", Организация);
        ЗапросПоиска.УстановитьПараметр("Владелец", Контрагент);
        ЗапросПоиска.УстановитьПараметр("ВидДоговора", ВидДоговора);
        ВыборкаПоиска = ЗапросПоиска.Выполнить().Выбрать();
        Если ВыборкаПоиска.Следующий() Тогда
            Возврат ВыборкаПоиска.Договор;
        КонецЕсли;
        
            // ну раз нет основного, то первый попавшийся
        ЗапросПоиска = Новый Запрос(
        "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
        |    ДоговорыКонтрагентов.Ссылка
        |ИЗ
        |    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
        |ГДЕ
        |    ДоговорыКонтрагентов.Владелец = &Владелец
        |    И ДоговорыКонтрагентов.Организация = &Организация
        |    И ДоговорыКонтрагентов.ВидДоговора = &ВидДоговора
        |    И НЕ ДоговорыКонтрагентов.ПометкаУдаления");
        ЗапросПоиска.УстановитьПараметр("Организация", Организация);
        ЗапросПоиска.УстановитьПараметр("Владелец", Контрагент);
        ЗапросПоиска.УстановитьПараметр("ВидДоговора", ВидДоговора);
        ВыборкаПоиска = ЗапросПоиска.Выполнить().Выбрать();
        Если ВыборкаПоиска.Следующий() Тогда
            Возврат ВыборкаПоиска.Ссылка;
        КонецЕсли;
        
            // ну нету раз
        Возврат Справочники.ДоговорыКонтрагентов.ПустаяСсылка();
    КонецФункции

Автор: ^D^ima 03.03.17, 07:06
evGenius
Спасибо, я примерно так и сделал.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)