БП 3.0 Необходимо автоматически проставить договор в поле ввода Договор, при выборе Контрагента.

1. user2048125 20.05.24 20:12 Сейчас в теме
Есть пустое поле ввода Контрагент, и если в нем выбрать контрагента, то в поле ввода договор происходит Отбор.Владелец(Объект.Контрагент), потому что это указано в свойствах поля СвязиПараметровВыбора. Но, договор не проставляется автоматически в поле ввода. Получается нужно провалиться в поле ввода Договор и там будет отображаться уже отобранный нужный Договор по контрагенту. А что нужно сделать, чтобы при выборе контрагента, Договор отобразился в поле ввода Договоры сразу?

Как я понял, договоры хранятся вот тут - Регистры сведений - ОсновныеДоговорыКонтрагента - там в измерениях стоит Организация, Контрагент, Вид договора, а в ресурсах - Договор.

Как сейчас работает. Я выбираю Контрагента, затем проваливаюсь в поле выбора Договор и там вручную нажимаю на Договор - он уже там отобран по контрагенту, потому что в свойствах поля стоит Отбор.Владелец(Объект.Контрагент).

Я посмотрел справочник Контрагенты и обнаружил, что там не все договоры помечены как основные. Поэтому, если нет Основного Договора, тогда есть ли возможность выводить не основной договор? Так же везде фигурирует только один договор. Просто он с пометкой основной или без пометки.

Прошу помощи реализовать автоматическое подставление Договора при выборе контрагента.
По теме из базы знаний
Найденные решения
4. user2048125 24.05.24 12:41 Сейчас в теме
Вот рабочий код:
Задача: При выборе контрагента автоматически заполнить поле договор. Договор может быть основным или не основным. Договоров может быть несколько, договор может быть помечен на удаление.
Напомню есть два поля ввода: Контрагент (Путь к данным Объект.Контрагент), Договор (Путь к данным Объект.Договор).
У поля ввода Договор, в свойствах стоит - СвязиПараметровВывода - Отбор.Владелец(Объект.Контрагент).
Далее на поле ввода Контрагент стоит События - КонтрагентПриИзменении.

Сам код в модуле формы:

&НаСервере
Функция ПолучитьОсновнойДоговор(Контрагент)
    
Результат = Справочники.ДоговорыКонтрагентов.ПустаяСсылка();
    
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
|ОсновныеДоговорыКонтрагента.Договор КАК Договор
|ИЗ
|РегистрСведений.ОсновныеДоговорыКонтрагента КАК ОсновныеДоговорыКонтрагента
|ГДЕ
|ОсновныеДоговорыКонтрагента.Контрагент = &Контрагент";    
    
Запрос.УстановитьПараметр("Контрагент", Контрагент);
    
РезультатЗапроса = Запрос.Выполнить();
    
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Результат = ВыборкаДетальныеЗаписи.Договор;
КонецЕсли;
    
//если основной договор не отмечен, то поищем среди всех договоров и если по данному виду он один и непомеченный на удаление, то возьмем его
    
Если Результат.Пустая() Тогда
Запрос.Текст =
"ВЫБРАТЬ
|МАКСИМУМ(ДоговорыКонтрагентов.Ссылка) КАК Договор,
|КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДоговорыКонтрагентов.Ссылка) КАК КоличествоДоговоров
|ИЗ
|Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
|ГДЕ
|ДоговорыКонтрагентов.Владелец = &Контрагент
|И НЕ ДоговорыКонтрагентов.ПометкаУдаления";
        
Запрос.УстановитьПараметр("Контрагент", Контрагент);
        
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Если ВыборкаДетальныеЗаписи.КоличествоДоговоров=1 Тогда
Результат = ВыборкаДетальныеЗаписи.Договор;
            ИначеЕсли ВыборкаДетальныеЗаписи.КоличествоДоговоров=0 Тогда
Сообщить("Договоров нет");
ИначеЕсли ВыборкаДетальныеЗаписи.КоличествоДоговоров>1 Тогда
Результат = ВыборкаДетальныеЗаписи.Договор;
ТекстОшибки = СтрШаблон("Для контрагента %1 подставлен первый договор из нескольких", Контрагент);
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);
КонецЕсли;
КонецЕсли;
КонецЕсли;
    
Возврат Результат;

КонецФункции


&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
Контрагент = Объект.Контрагент;
Объект.Договор = ПолучитьОсновнойДоговор(Контрагент);
КонецПроцедуры
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. lefthander 20.05.24 20:38 Сейчас в теме
(1)Вам надо понять как определять договор если он не один и нет основного...;)
Остальное просто - через расширение дописываете код.
user2048125; +1 Ответить
3. user2048125 21.05.24 13:02 Сейчас в теме
(2) Вот такой код я написал (он пока не работает). При выполнении программы появляется ошибка: Значение не является значением объектного типа (Контрагент)
Вот здесь - Запрос.УстановитьПараметр("Контрагент", ДокументОбъект.Контрагент);

Вот мой код целиком:

&НаСервереБезКонтекста
Функция НайтиПодходящийДоговор(ДокументОбъект) Экспорт

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|ОсновныеДоговорыКонтрагента.Договор КАК Договор
|ИЗ
|РегистрСведений.ОсновныеДоговорыКонтрагента КАК ОсновныеДоговорыКонтрагента
|ГДЕ
|ОсновныеДоговорыКонтрагента.Контрагент = &Контрагент";    
    
Запрос.УстановитьПараметр("Контрагент", ДокументОбъект.Контрагент);
    
РезультатЗапроса = Запрос.Выполнить();
    
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Договор = ВыборкаДетальныеЗаписи.Договор;
КонецЕсли;
    
Возврат Договор;    
        
КонецФункции


&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
Объект.Договор = НайтиПодходящийДоговор("ДокументОбъект");
//тут я отображаю Объект.Договор;  в поле ввода Элементы.Договор
Элементы.Договор = Объект.Договор;    
КонецПроцедуры
Показать
4. user2048125 24.05.24 12:41 Сейчас в теме
Вот рабочий код:
Задача: При выборе контрагента автоматически заполнить поле договор. Договор может быть основным или не основным. Договоров может быть несколько, договор может быть помечен на удаление.
Напомню есть два поля ввода: Контрагент (Путь к данным Объект.Контрагент), Договор (Путь к данным Объект.Договор).
У поля ввода Договор, в свойствах стоит - СвязиПараметровВывода - Отбор.Владелец(Объект.Контрагент).
Далее на поле ввода Контрагент стоит События - КонтрагентПриИзменении.

Сам код в модуле формы:

&НаСервере
Функция ПолучитьОсновнойДоговор(Контрагент)
    
Результат = Справочники.ДоговорыКонтрагентов.ПустаяСсылка();
    
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
|ОсновныеДоговорыКонтрагента.Договор КАК Договор
|ИЗ
|РегистрСведений.ОсновныеДоговорыКонтрагента КАК ОсновныеДоговорыКонтрагента
|ГДЕ
|ОсновныеДоговорыКонтрагента.Контрагент = &Контрагент";    
    
Запрос.УстановитьПараметр("Контрагент", Контрагент);
    
РезультатЗапроса = Запрос.Выполнить();
    
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Результат = ВыборкаДетальныеЗаписи.Договор;
КонецЕсли;
    
//если основной договор не отмечен, то поищем среди всех договоров и если по данному виду он один и непомеченный на удаление, то возьмем его
    
Если Результат.Пустая() Тогда
Запрос.Текст =
"ВЫБРАТЬ
|МАКСИМУМ(ДоговорыКонтрагентов.Ссылка) КАК Договор,
|КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДоговорыКонтрагентов.Ссылка) КАК КоличествоДоговоров
|ИЗ
|Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
|ГДЕ
|ДоговорыКонтрагентов.Владелец = &Контрагент
|И НЕ ДоговорыКонтрагентов.ПометкаУдаления";
        
Запрос.УстановитьПараметр("Контрагент", Контрагент);
        
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Если ВыборкаДетальныеЗаписи.КоличествоДоговоров=1 Тогда
Результат = ВыборкаДетальныеЗаписи.Договор;
            ИначеЕсли ВыборкаДетальныеЗаписи.КоличествоДоговоров=0 Тогда
Сообщить("Договоров нет");
ИначеЕсли ВыборкаДетальныеЗаписи.КоличествоДоговоров>1 Тогда
Результат = ВыборкаДетальныеЗаписи.Договор;
ТекстОшибки = СтрШаблон("Для контрагента %1 подставлен первый договор из нескольких", Контрагент);
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);
КонецЕсли;
КонецЕсли;
КонецЕсли;
    
Возврат Результат;

КонецФункции


&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
Контрагент = Объект.Контрагент;
Объект.Договор = ПолучитьОсновнойДоговор(Контрагент);
КонецПроцедуры
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот