Имя: Пароль:
1C
1С v8
Найти все реквизиты документа с ссылкой на объект.
0 xipypg2012
 
23.09.20
13:06
Подскажите у меня есть документ в нем в табличной части есть столбец "документ".

и в этом документе есть поле контрагент. Подскажите как реализовать теперь чтоб при смене контрагента в документе, Программа пробегала все реквизиты этих документов и если находила реквизит с таким же контрагентом меняла его.

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

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

&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
    Режим = РежимДиалогаВопрос.ДаНет;
    
    Ответ = Вопрос("Вы хотите изменить контрагента?", Режим, 0);
    Если Ответ =КодВозвратаДиалога.Да Тогда
        КонтрагентПриИзмененииНаСервере();
    Иначе
        Объект.Контрагент = ПолучитьСтарогоКонтрагента("Контрагент");
    КонецЕсли;
КонецПроцедуры

Интересует как - перебрать все реквизиты Стр.Документ  , может кто-то чтото подскажет. Дальше будут идти изменения по аналогии с этим.
1 Ёпрст
 
гуру
23.09.20
13:09
(0)
   Документ = РеквизитФормыВЗначение("Объект");    

это выкинуть из кода в первую очередь
2 xipypg2012
 
23.09.20
13:10
//////////ВОТ тут перебрать все реквизиты Док надо
Если Док.Рекв = ПолучитьСтарогоКонтрагента("Контрагент")

Для умников сразу скажу в цикле запроса не будет, это на скорую руку накидан код в блокноте чтоб можно было объяснить что именно хочется сделать.
3 xipypg2012
 
23.09.20
13:10
(1) с этим согласен тут это не актуально, можно и выкинуть.
4 Ёпрст
 
гуру
23.09.20
13:32
вот это переписать:

&НаСервере
Функция ПолучитьСтарогоКонтрагента(РеквизитВозврата)


посмотреть хотя бы , как в типовой глЗначениеРеквизитаОбъекта слеплено
5 Ёпрст
 
гуру
23.09.20
13:32
получать ссылку, чтоб с неё потом клиентоса тянуть, таща весь объект ?
6 Ёпрст
 
гуру
23.09.20
13:34
И... всю замену во всех доках, которые торчат в таб части нужно делать хотя бы приЗаписи этого документа, а не в ПриИзменении.
А то. клиентоса поменяешь, а документ не сохраншь
7 xipypg2012
 
23.09.20
13:43
(6) Документ записывается при изменение