Имя: Пароль:
1C
1С v8
Программный вызов обработчика формы
0 самолет
 
25.02.15
13:23
Есть типовая Бухгалтерия 3.0(запрещено редактирование)
Нужно загрузить приходные накладные из Эсель.
Я создать Внешнюю обработку и загрузил данные. Все бы хорошо но есть одно НО.. При установке контрагента не происходит выполнение стандартной процедуры "ПриИзменииКонтрагента". Посмотрел в конфигурации есть модуль  ПоступлениеТоваровУслугФормы.КонтрагентПриИзменении(ЭтаФорма) причем эспортный.
Но не понимаю как с клиента на сервер передать форму созданного документа, вызвать этот обработчик и результат вернуть назад на клиент.

Делаю так.

&НаСервере
Процедура КонтрагентПриИзмененииНаСервере(Док)
    ПоступлениеТоваровУслугФормы.КонтрагентПриИзменении(Док);
КонецПроцедуры

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

Получаю ошибку
{Форма.Основная.Форма(2947)}: Ошибка при вызове метода контекста (КонтрагентПриИзмененииНаСервере)
     КонтрагентПриИзмененииНаСервере(Док);
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'param':
    форма: Элемент
    имя: {http://v8.1c.ru/8.2/managed-application/modules}param
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'УправляемаяФорма'

Как правильно можно вызвать этот обработчик?
1 AntonH851
 
25.02.15
13:41
Ты не форму на сервер передавай, а документ объект используя функции реквизитформывзначение
2 самолет
 
25.02.15
13:51
Сделал так

На клиенте

     ОснРеквизит                   = Док.Объект;    
     КонтрагентПриИзмененииНаСервере(ОснРеквизит);
     КопироватьДанныеФормы(ОснРеквизит,Док.Объект);  


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

Вылетает ошибка в модуле
ПоступлениеТоваровУслугФормы
Процедура КонтрагентОбработатьИзменение(Форма, ПричиныИзмененияСчетовУчета)

    Объект = Форма.Объект; // ВОТ ЗДЕСЬ ГОВОРИТ ЧТО НЕ НАЙДЕН ОБЪЕКТ

    ПричиныИзмененияСчетовУчета.Добавить("Контрагент");
    
    МассивВидовДоговоров = Форма.ПолучитьМассивВидовДоговоров();

    БухгалтерскийУчетПереопределяемый.УстановитьДоговорКонтрагента(Объект.ДоговорКонтрагента,
        Объект.Контрагент, Объект.Организация, МассивВидовДоговоров);

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

КонецПроцедуры
3 самолет
 
25.02.15
14:06
Так тоже не работает

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

&НаСервере
Процедура КонтрагентПриИзмененииНаСервере(ОснРеквизит)
    
       //ОбъектЗначение = ДанныеФормыВЗначение(ОснРеквизит, Тип("ДокументОбъект.ПоступлениеТоваровУслуг"));
       //ПоступлениеТоваровУслугФормы.КонтрагентПриИзменении(ОбъектЗначение);
       //ЗначениеВДанныеФормы(ОбъектЗначение, ОснРеквизит);
      
       НаборФорма = РеквизитФормыВЗначение("Объект");
       ПоступлениеТоваровУслугФормы.КонтрагентПриИзменении(НаборФорма);
       ЗначениеВРеквизитФормы(НаборФорма, "Объект");
      
КонецПроцедуры
4 самолет
 
25.02.15
14:13
ругается что не может Получить Объект.
А в теории мне чтобы использовать форму на серваке ее обязательно нужно записать в реквизит формы? т.е. если у меня внешняя обработка и мне нужно с клиента на сервер передать форму документа "ПоступленияТоварУслуг" созданную на клиенте, я должен создать реквизит у внешней обработки в него положить на клиенте форму "ПоступленияТоварУслуг" и считать этот параметр на сервере и  его преобразовать в значение и только после этого вызывать обработчик? В теории ТАК?