Версия для печати темы (https://pro1c.org.ua/index.php?s=ad7d5e9dec3880f8c20dd0ac36656bfe&showtopic=32255)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ Выбор Договора согласно выбранной фирмы

Автор: inna.innainna84 06.10.16, 12:21

// ===============================
Процедура ИзмКонтрагент()
    Если Заказ.Выбран()=1 Тогда
        глКомментарий("Контрагента нужно изменять в заказе!",1,,"!");
        Контрагент = Заказ.Контрагент;
        Возврат;
    КонецЕсли;    
    Если Контрагент.Выбран() = 1 Тогда
        ВидТорговли = Контрагент.ВидТорговли;
        Если Контрагент.ВидВзаиморасчетов = Перечисление.ВидыВзаиморасчетов.ПоДоговорам Тогда
            Заказ = Контрагент.БазДоговор;
        КонецЕсли;
        УстСуммаО();
    Иначе
        ВидТорговли = Перечисление.ВидыТорговли.Предоплата;
        Заказ = 0;
    КонецЕсли;
    ИзмВидТорговли();
КонецПроцедуры

// ===============================
Процедура ИзмЗаказ()
    глВыбратьЗаказ(Заказ,Контрагент,СчетКонтрагента,Контекст);
    Если Заказ.Выбран() = 1 Тогда
        Попытка
            Валюта = Заказ.Валюта;
        Исключение
            Валюта = Гривня;
        КонецПопытки;
    КонецЕсли;
    ИзмВалюта();
    УстСуммаО();
КонецПроцедуры
        
// ===============================



При создании нового документа - после выбора контрагента должен подтянуться нужный Договор (заказ) нужной фирмой.
Пример у контрагента есть 4 договора от разных фирм
1 -от фирмы ПП Пупкин
2 -от фирмы ПП Васечкин
3 -от фирмы ПП Иванова
4 -от фирмы ПП Филимонова
Создаю документ от фирмы ПП Иванова , а в справочнике контрагента по умолчании стоит базДоговор ПП Пункин, то подтягивается договор тот который по умолчаниию
Помогите пожалуйста дописать проверку договора по выбранной фирме.

Автор: nik389 06.10.16, 15:06

inna.innainna84 @ Сегодня, 13:21 * ,
ну а что тут сложного? очевидно, нужно проверять фирму в документе, и в зависимости от фирмы искать договор, и, если нашли, проставлять его

Автор: inna.innainna84 06.10.16, 15:11

nik389 @ Сегодня, 16:06 * ,
Ну я не программист, и для меня это сложно

Автор: nik389 06.10.16, 15:22

inna.innainna84 @ Сегодня, 16:11 * ,

ну если вообще не программист, лучше позвать программиста
навскидку можно так:

лпДоговор  =Контрагент.Договор;
Если лпДоговор.Фирма = Фирма Тогда
Договор = лпДоговор;
Иначе
ДокДоговор = СоздатьОбъект("Документ.Договор");
ДокДоговор.ВыбратьДокументы(Дата1,Дата2);
Пока ДокДоговор.ПолучитьДокумент() = 1 Цикл
//тут должны быть проверки на актуальность договора
Если ДокДоговор.Фирма = Фирма Тогда
Договор = ДокДоговор.ТекущийДокумент();
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;


или запросом

Автор: inna.innainna84 06.10.16, 15:30

nik389 @ Сегодня, 16:22 * ,
а как это мне применить в моем примере кода. Куда нужно добавить ваш код?

Автор: nik389 06.10.16, 15:36

inna.innainna84 @ Сегодня, 16:30 * ,
в форму документа, куда нужно подставлять договор
код был дан для образца. Его нужно не бездумно вставить, а с учетом нюансов вашей конфигурации

Автор: inna.innainna84 06.10.16, 15:59

Извените пожалуйста
посмотрите верно ли я поняла

// ===============================
Процедура ИзмКонтрагент()
    Если Заказ.Выбран()=1 Тогда
        глКомментарий("Контрагента нужно изменять в заказе!",1,,"!");
        Контрагент = Заказ.Контрагент;
        Возврат;
    КонецЕсли;    
    Если Контрагент.Выбран() = 1 Тогда
        ВидТорговли = Контрагент.ВидТорговли;
        Если Контрагент.ВидВзаиморасчетов = Перечисление.ВидыВзаиморасчетов.ПоДоговорам Тогда

лпЗаказ  =Контрагент.БазДоговор;
Если лпЗаказ .Фирма = Фирма Тогда
Заказ =лпЗаказ;
Иначе
ДокЗаказ  = СоздатьОбъект("Документ.Договор");
ДокЗаказ .ВыбратьДокументы(НачалоПериодаБИ(),ДатаДок);
Пока ДокЗаказ .ПолучитьДокумент() = 1 Цикл
//тут должны быть проверки на актуальность договора
Если ДокЗаказ .Фирма = Фирма Тогда
Договор = ДокЗаказ .ТекущийДокумент();
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
                    
        КонецЕсли;
        УстСуммаО();
    Иначе
        ВидТорговли = Перечисление.ВидыТорговли.Предоплата;
        Заказ = 0;
    КонецЕсли;
    ИзмВидТорговли();
КонецПроцедуры

// ==============================


Что-то не так не каждый раз срабатывает Выбирает только в том случае если договор закреплен в справочнике

лпЗаказ =Контрагент.БазДоговор;
Нужно как-то по другому У контрагента может быть 10 договоров от разных фирм , которые не закреплены в справочнике

Автор: Мичман Харитонов 06.10.16, 17:15

Перем Запрос, ТекстЗапроса;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Выборка)
    
    |Обрабатывать НеПомеченныеНаУдаление;
    |Без итогов;
    |Контрагент = Документ.Договор.Контрагент;
    |ДатаНачала = Документ.Договор.ДатаНачала;
    |ДатаОкончания = Документ.Договор.ДатаОкончания;
    |НомерДоговора = Документ.Договор.НомерДоговора;
    |ВидДоговора = Документ.Договор.ВидДоговора;
    |ДатаДок = Документ.Договор.ДатаДок;
    |НомерДок = Документ.Договор.НомерДок;
    |Группировка Контрагент упорядочить по Контрагент.Наименование;
|Условие(лпФирма = Фирма);    
|Условие(Контрагент = Контрагент);
    |Условие(ДатаНачала <= Дата1);
    |Условие(ДатаОкончания >= Дата2);
    |"//}}ЗАПРОС
;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

Вот так, как вариант

Автор: inna.innainna84 06.10.16, 19:51

// ===============================
Процедура ИзмКонтрагент()
    Если Заказ.Выбран()=1 Тогда
        глКомментарий("Контрагента нужно изменять в заказе!",1,,"!");
        Контрагент = Заказ.Контрагент;
        Возврат;
    КонецЕсли;    


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



// ===============================

Что то делаю не то, если не трудно можете исправить мои каляки

Автор: oleksandr.homyak 09.10.16, 8:30


 ! 

http://pro1c.org.ua/index.php?act=announce&id=2: 16
 

Автор: Serg_XX 13.10.16, 13:12

inna.innainna84 @ 06.10.16, 19:51 * ,
Девушка, сами Вы это не сделаете.

Автор: Cthulhu 14.10.16, 16:33

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

В итоге самый короткий и самый правильный совет в данном конкретном случае - вот такой: "пригласите специалиста".

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua