Имя: Пароль:
1C
1С v8
V8: Заполнение новой формы НаКлиенте
0 790th
 
12.06.12
22:20
Задача: из формы А создать документ, добавить и заполнить ему первую строку ТЧ, показать эту форму Б пользователю, предоставив возможность менять новый незаписанный документ.

&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
   НоваяФорма        = ПолучитьФорму("Документ.Операция.ФормаОбъекта");
   РеквизитыДок    = Новый СписокЗначений;
   СоздатьОперацию(РеквизитыДок);
   НоваяФорма.Объект.ВидУчета    = РеквизитыДок[0];
   НоваяФорма.Открыть();
КонецПроцедуры

&НаСервере
Процедура СоздатьОперацию(РеквизитыДок) Экспорт
   РеквизитыДок.Добавить("ВидУчета",Перечисления.ВидыУчета.Фактический);
КонецПроцедуры

В этом примере меняю только реквизит документа (и он конечно не меняется)
Проблема еще в том что объект не доступен на клиенте, а форму нельзя передать насервер, т.к. мутабельный тип, при этом Процедура ЗначениеВРеквизитФормы работает только НаСервере.
Похоже у меня неправильный подход к управляемому приложению, подскажите как это реализовать правильно, как надо ?
1 790th
 
13.06.12
10:03
ап
2 hhhh
 
13.06.12
10:23
мутабельный - это в 8.1 вы наверно прочитали. Всё там можно передать.
3 hhhh
 
13.06.12
10:25
(1) у формы есть событие ПриСозданииНаСервере
4 Азазелло
 
13.06.12
11:30
В 8.2 подход по работе с формами больше похож на 7.7.
Вызываешь метод ОткрытьФорму, ему во втором параметре передаешь Структуру, которую отрабатываешь либо в ОбработкеЗаполнения документа, либо в ПриСозданииНаСервере
5 790th
 
13.06.12
11:45
Можно ли в этой структуре описать заполнение строки табличной части документа ?
6 790th
 
13.06.12
11:47
(5) понял что можно ) вечером буду пробовать
7 790th
 
13.06.12
22:01
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
ПараметрыЗаполнения    = Новый Структура("ВидУчета",РеквизитыДок[0]);
НоваяФорма = ПолучитьФорму("Документ.Операция.ФормаОбъекта",ПараметрыЗаполнения);
НоваяФорма.Открыть();
КонецПроцедуры

Форма:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   Сообщить(Параметры.ВидУчета);
КонецПроцедуры

При условии например, Если РеквизитыДок[0]=4 то все работает великолепно.
Но Если РеквизитыДок[0]=Перечисления.ВидыУчета.Фактический тогда ругается:

{Отчет.ПланФактныйАнализ.Форма.ФормаОтчета.Форма(17)}: Ошибка при вызове метода контекста (ПолучитьФорму)
       НоваяФорма = ПолучитьФорму("Документ.Операция.ФормаОбъекта",ПараметрыЗаполнения);
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'val':
   форма: Элемент
   имя: {http://v8.1c.ru/8.2/mngsrv/ws}val
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ЭлементСпискаЗначений'

Можно конечно передать строковое имя элемента, или его код, но это же будет убожество ))
Как передать ссылку в параметре на сервер ? через хранилище значений (попробую) ?
8 790th
 
13.06.12
22:13
Сработало !
Криво конечно, но хоть так...

Форма А:

&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
   СтандартнаяОбработка    = Ложь;
   КоллекцияРасшифровки = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
   КоллекцияПолей         = КоллекцияРасшифровки.Элементы.Получить(Расшифровка).ПолучитьПоля();
   Если КоллекцияПолей.Найти("Сумма")<>Неопределено И КоллекцияПолей.Найти("Период")<>Неопределено И КоллекцияПолей.Найти("Субконто")<>Неопределено Тогда
       РеквизитыДок    = Новый СписокЗначений;
       СоздатьОперацию(КоллекцияПолей[0].Значение,КоллекцияПолей[1].Значение,КоллекцияПолей[2].Значение,РеквизитыДок);
       ХЗ = Новый ХранилищеЗначения(РеквизитыДок[0]);
       ПараметрыЗаполнения    = Новый Структура("ВидУчета",ХЗ);
       НоваяФорма = ПолучитьФорму("Документ.Операция.ФормаОбъекта",ПараметрыЗаполнения);
       НоваяФорма.Открыть();
   ИначеЕсли КоллекцияПолей.Найти("Период")<>Неопределено Тогда
       НоваяФорма    = ПолучитьФорму("Отчет.ПланФактныйАнализ.Форма.ФормаФактическихТранзакций");
       НоваяФорма.ПериодОтчета = КоллекцияПолей[0].Значение;
       НоваяФорма.Открыть();
   КонецЕсли;
КонецПроцедуры

Форма Б:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   Сообщить(Параметры.ВидУчета.Получить());
КонецПроцедуры

Всем спасибо !