Имя: Пароль:
1C
1С v8
БП 3.0 При выборе Контрагента, нужно автоматически заполнить поле ввода Договор
0 Валентиновый
 
naïve
20.05.24
14:59
БП 3.0
Необходимо автоматически проставить договор в поле ввода Договор, при выборе Контрагента.

Есть пустое поле ввода "Контрагент", и если выбрать контрагента, то в Поле ввода "Договор" происходит Отбор.Владелец(Объект.Контрагент), потому что это указано в свойствах поля СвязиПараметровВыбора. Но, договор не проставляется автоматически в поле ввода. Потому что, как я понимаю отбор происходит на форме Договоры. Получается нужно провалиться в поле ввода Договор и там будет отображаться уже отобранный нужный Договор с выбранным контрагентом. А что нужно сделать, чтобы при выборе контрагента, Договор отобразился в поле ввода Договоры сразу?
1 Лирик
 
20.05.24
15:02
А если договоров пять, какой должен "отобразиться сразу"?
2 Волшебник
 
20.05.24
15:02
Назначьте его основным
3 Лирик
 
20.05.24
15:08
(2) А если назначенный основным не подходит по виду операции? Ну нужно же человека подвести к логическому финалу, что бы ТС понял свою задачу. )
4 Волшебник
 
20.05.24
15:09
(3) Человека ли?
5 Лирик
 
20.05.24
15:19
(4) Есть подозрения, что GPT на нас учится?
6 Kigo_Kigo
 
20.05.24
15:19
Вообще в БП 3 ЕМНИП Основной договор сам подставляется при выборе контрагента
7 Волшебник
 
20.05.24
15:21
(5) Ну вот смотрите, у него мерцает сущность:

поле ввода Договор
поле ввода Договоры
Поле ввода "Договор"
8 Валентиновый
 
naïve
20.05.24
19:49
Есть два поля ввода: Контрагент, Договор.
Как я понял, договоры хранятся вот тут - Регистры сведений - ОсновныеДоговорыКонтрагента - там в измерениях стоит Организация, Контрагент, Вид договора, а в ресурсах - Договор. Мне нужно, Выбрать в поле ввода Контрагента, и после выбора автоматически должен подставиться договор. Как сейчас работает. Я выбираю Контрагента, затем проваливаюсь в поле выбора Договор и там вручную нажимаю на Договор - Он уже там отобран, потому что в свойствах поля стоит Отбор.Владелец(Объект.Контрагент)

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

(1) Лирик, я просмотрел список, везде один договор. Просто какието не помечены как основные, а какие-то помечены.

(2) Волшебник, Как я понял этот пункт игнорируется , в базе будут неосновные договоры.

(3) Лирик, все договоры на оказание услуг. Они подходят по Виду операции.

(6) Kigo_Kigo, ну вот не подставляется. В поле ввода Договора выставлено СвязиПараметровВыбора - Отбор.Владелец(Объект.Контрагент)

Я решил начать вот с чего, для поля ввода создать событие - ПриИзменении на Клиенте и на Сервере. Теперь хочу в Процедуре &НаСервере вытащить Договор, который уже отобран по Контрагенту. В поле ввода Договор, стоит же отбор. Подскажите, как реализовать?
9 Волшебник
 
20.05.24
20:18
(8) Напишите такой алгоритм:

ДокОбъект.Договор = НайтиПодходящийДоговор(ДокОбъект);


и где-то ниже/выше:

Функция НайтиПодходящийДоговор(ДокОбъект) Экспорт
   //здесь учтите все условия, хотелки и пожелания...
   Договор = ... ;
   Возврат Договор;
КонецФункции;
10 Валентиновый
 
naïve
20.05.24
21:24
(9) Волшебник, вот исходя из моего кода (он пока не работает), осталось определить переменную ДокОбъект там, где на клиенте.
Код:


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

Договор = Справочники.ДоговорыКонтрагентов.ПустаяСсылка();

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



&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
ДокОбъект.Договор = НайтиПодходящийДоговор(ДокОбъект);
//тут я отображаю ДокОбъект в поле ввода Элеенты.Договор
Элементы.Договор = ДокОбъект.Договор;    
КонецПроцедуры
11 Валентиновый
 
naïve
20.05.24
21:26
(9) Волшебник, а как определить переменную ДокОбъект?
12 Волшебник
 
20.05.24
21:32
В Вашем коде перепутаны ДокОбъект и Контрагент (владелец договора)
13 Волшебник
 
20.05.24
21:33
ГДЕ
| ОсновныеДоговорыКонтрагента.Контрагент = &ДокОбъект";    
    
Запрос.УстановитьПараметр("ДокОбъект", ДокОбъект


Вот здесь смешение сущностей
14 Валентиновый
 
naïve
20.05.24
21:40
(13) Волшебник, так:

|ГДЕ        |    ОсновныеДоговорыКонтрагента.Контрагент = &ДокОбъект";    

Запрос.УстановитьПараметр("Контрагент", ДокОбъект);
15 Валентиновый
 
naïve
20.05.24
21:41
(13) Волшебник, к форматированию поста нужно приноровиться конечно. Так:

| ГДЕ
| ОсновныеДоговорыКонтрагента.Контрагент = &ДокОбъект";    

Запрос.УстановитьПараметр("Контрагент", ДокОбъект);
16 Волшебник
 
20.05.24
21:43
(15) ДокОбъект — это тип ДокументОбъект,
Контрагент - это СправочникСсылка.Контрагенты

Они никак не могут быть равны.

Если ищите по контрагенту, то передайте контрагента в запрос.

ГДЕ ОсновныеДоговорыКонтрагента.Контрагент = &Контрагент

Запрос.УстановитьПараметр("Контрагент", ДокОбъект.Контрагент);
17 Валентиновый
 
naïve
20.05.24
22:16
(16) Волшебник, вот здесь ругается, на все три ДокОбьект

&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)    
ДокОбъект.Договор = НайтиПодходящийДоговор(ДокОбъект);
//тут я отображаю ДокОбъект в поле ввода Элементы.Договор
Элементы.Договор = ДокОбъект.Договор;  
КонецПроцедуры

Пишет: Переменная не определена (ДокОбъект)
18 Волшебник
 
20.05.24
22:51
(17) Если переменная не определена, значит её не определили. Все сущности имеют свои причины возникновения и существования.
19 Валентиновый
 
naïve
21.05.24
12:57
(18) Волшебник, вот я внес правки. При выполнении программы появляется ошибка: Значение не является значением объектного типа (Контрагент)
Вот здесь - Запрос.УстановитьПараметр("Контрагент", ДокументОбъект.Контрагент);

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

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

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

//&НаСервере
//Процедура КонтрагентПриИзмененииНаСервере()

    //Объект.Договор = НайтиПодходящийДоговор(ЭтотОбъект.ДокументОбъект);
    //тут я отображаю ДокОбъект в поле ввода Элементы.Договор
    //Элементы.Договор = Объект.Договор;
    
//КонецПроцедуры


&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
Объект.Договор = НайтиПодходящийДоговор("ДокументОбъект");
//тут я отображаю ДокОбъект в поле ввода Элементы.Договор
Элементы.Договор = Объект.Договор;    
КонецПроцедуры
20 Волшебник
 
21.05.24
13:07
(19) Значит внутри "ДокументОбъект" нет поля "Контрагент".
Не надо обращаться к полям, которых нет. Это достаточно нагло. Существование полей надо предполагать на 100% или оформлять код в Попытка...Исключение.
21 Волшебник
 
21.05.24
13:08
(19) Здесь вы передали в функцию строку, а не объект:
НайтиПодходящийДоговор("ДокументОбъект");


Следите за типами!
22 skafandr
 
21.05.24
13:56
Вы пытаетесь автоматизировать бардак

Вариант 1 - сделать распоряжение менеджерам назначить основной договор и делать это при внесении нового клиента

Вариант 2 - сделать обработку назначения основного договора у существующих и при создании первого договора у клиента
23 АгентБезопасной Нацио
 
21.05.24
15:57
(22) неправда. Он не автоматизирует бардак - он его приумнножает!
24 Лирик
 
21.05.24
16:51
(22) (23) Не согласен, абсолютно внятная задача ускоряющая работу пользователя. Другой вопрос, что разработчики не додумали вопрос и сделали "основной договор". Например, если основным установлен договор с покупателем, естественно при выборе контрагента в документе поступления он не подойдет.
Алгоритм по заполнению договора при выборе контрагента должен быть следующим:
-при выборе контрагента формируются параметры выбора договоров,
-формируется запрос с фильтром по параметрам,
-если выборка включает только один договор - он подставляется в реквизит "Договора".
Просто, понятно, применимо в большинстве случаев. ИМХО.
25 Лирик
 
21.05.24
16:56
+(24) Можно даже "поженить" этот алгоритм со стандартным:
-если выборка включает только один договор или в выборку попал Основной - он подставляется в реквизит "Договора".
26 Волшебник
 
21.05.24
17:00
(24) Будет много ложных срабатываний, когда контрагент идёт на вторую сделку.
27 Гена
 
гуру
21.05.24
17:11
(23) Не так. Автор подставляет операционистку. Если за неё подставлять автоматом договор, то она будет проскакивать это поле быстрее лани. В результате все доки лягут на один договор.
28 Лирик
 
21.05.24
17:13
(26) Снова не согласен, зависит от параметров фильтра. Можно сделать, как вариант, параметр "ОдинДоговорОднаСделка" и при установке этого параметра в истину выбирать договоры по которым нет заказов (условно).
От задач зависит.
У меня была задача, когда договор подставлялся исходя из доп. реквизита заказа. Причем мало того подставлялся, еще и автоматом создавался. Ну нужно было взаиморасчеты делить по этому признаку. Там вообще было менеджерам запрещено выбирать договор.
29 Волшебник
 
21.05.24
17:13
(27) Кстати, это приводит к сложным ошибкам в дальнейшем.
Потому что договор из заказа идёт дальше в реализацию, потом в акт... Короче, ошибка в начале пути приводит к снежному кому и лавине ошибок позже.
30 Лирик
 
21.05.24
17:16
(27) Или не дает операционистке ошибиться и ускоряет ее работу.
31 Гена
 
гуру
21.05.24
17:18
(29) Да. Автор, похоже, не знает женской психологии. Не будет никогда женщина менять заполненное поле при пулемётном наборе. А вот незаполненное поле воленс-ноленс заставит её выбирать )
32 ДержиКод
 
21.05.24
17:22
А если Договора нет?)
А что гласит регламент заведения договоров?)
33 Лирик
 
21.05.24
17:25
(31) Следуя такой логике нужно убирать регистр "СчетаУчетаНоменклатуры", а то повадились, ручками, ручками. 10, 41, 43 и думаем, перед тем как сделать )
34 lEvGl
 
гуру
21.05.24
17:25
Скорее всего на этом этапе эта информация уже есть в базе, надо только ее достать. Если нет, то дайте просто форму выбора договора автоматом после выбора контрагента. Сокращение затрат умопомрачительное, как и начальная задача
35 lEvGl
 
гуру
21.05.24
17:27
(33) все с этим хорошо, не надо умничать и переназначить счета, указанные глав. бухом, если на то не было указаний. А если были, то идите, глав. бух, укажите счета и забудем об этом.
36 Гена
 
гуру
21.05.24
17:29
(33) Операционистка как правило не разбирается в счетах, поэтому пусть замГБ настраивает учёт.
(34) Хорошая мысль, мне нравится.
37 Гена
 
гуру
21.05.24
17:36
(34) Причём сразу снимается проблема однодоговорного контрика: просто в форме выбора он будет сфокусирован один.
38 Лирик
 
21.05.24
17:36
(35) (36) Хорошо прописанный и автоматизированный алгоритм выбора договора точно так же имеет право на существование. Сказано при заказе с этого региона выбирать этот договор и не надо думать.
Ладно, каждый при своем.
39 lEvGl
 
гуру
21.05.24
17:40
(36)(37) :)
(38) это лирика, конкретика у ТСа, в знании конкретно этой ситуации, есть там алгоритм или нет, хрен знает
40 ДержиКод
 
21.05.24
17:45
А может нужно чтоб последний используемый договор подставлялся?)
41 Bell
 
21.05.24
22:05
(0) А бухгалтер у Вас есть?  Не та автоматизация...
42 Валентиновый
 
naïve
24.05.24
13:09
Вот рабочий код:
Задача: При выборе контрагента автоматически заполнить поле договор. Договор может быть основным или не основным. Договоров может быть несколько, договор может быть помечен на удаление.
Напомню есть два поля ввода: Контрагент (Путь к данным Объект.Контрагент), Договор (Путь к данным Объект.Договор).
У поля ввода Договор, в свойствах стоит - СвязиПараметровВывода - Отбор.Владелец(Объект.Контрагент).
Далее на поле ввода Контрагент стоит События - КонтрагентПриИзменении.

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

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


&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
Контрагент = Объект.Контрагент;
Объект.Договор = ПолучитьОсновнойДоговор(Контрагент);
КонецПроцедуры
43 Волшебник
 
24.05.24
13:09
(42) Соблюдайте лесенку программного кода (отступы)
44 DJ Anthon
 
24.05.24
13:13
(42) а СрокДействия кто будет учитывать? а почему ты подставляешь первый попавшийся? а если единственный договор помечен на удаление? переделывай
45 Мультук
 
гуру
24.05.24
13:14
(42)

И где отбор по "Организация" ?
И где отбор по "ВидДоговора" ?
И есть еще такой момент как "Валюта"



|Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
|ГДЕ
|ДоговорыКонтрагентов.Владелец = &Контрагент
|И НЕ ДоговорыКонтрагентов.ПометкаУдаления";



|РегистрСведений.ОсновныеДоговорыКонтрагента КАК ОсновныеДоговорыКонтрагента
|ГДЕ
|ОсновныеДоговорыКонтрагента.Контрагент = &Контрагент";
46 Dmitrii
 
гуру
24.05.24
13:54
(38) >> Хорошо прописанный и автоматизированный алгоритм выбора договора точно так же имеет право на существование

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

В таком вопросе как автоматическое заполнение (по умолчанию) каких-то полей в документа, справочниках и т.п. мест для автоматизации уйма. Проблема в том, что все они (эти места для автоматизации) имеют довольно узкую специфику применения. То, что, по вашему, будет удобно одному может оказаться вредным для другого. В нашем случае (заполнение поля Договор в документе) предлагаемый алгоритм  подойдёт тем, у кого с каждым контрагентом в один момент времени есть только один действующий договор соответствующего вида (с поставщиком/с покупателем/комиссии и т.п.). Как только у контрагента появляется несколько договоров, схема накрывается и получаем кучу ошибок в учёте, которые потом могут породить ошибки в оплатах/отгрузках по этим документам и т.д.

Поэтому 1С в своих типовых конфигурациях и не идёт слишком далеко в такого рода автоматизации.

В типовой БП 3.0 всё давно сделано в документе ПоступлениеТоваровУслуг всё давно сделано. При выборе контрагента заполняется договор, если есть основной договор с подходящими параметрами (вид/валюта/организация и пр.) или такой договор единственный.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн