Имя: Пароль:
1C
 
Создать объект документа и открыть его форму 8.2
,
0 riv40rus
 
04.03.10
12:33
Создан объект документа, документ не записан. Как открыть его форму ?
1 Stepa86
 
04.03.10
12:42
Как создать документ и открыть его форму?

В 1С Предприятии 8.2  для этих целей существует два возможных сценария работы:

открыть форму нового документа и предоставить пользователю самому интерактивно записать данные объекта в базу данных.
создать новый документ программно, программно заполнить его данными и программно записать. Затем, если нужно, показать его пользователю.
В первом сценарии проще всего использовать метод глобального контекста ОткрытьФорму(). Это можно сделать на клиенте.

ОткрытьФорму("Документ.ПриходнаяНакладная.ФормаОбъекта");
При этом создается новый документ и открывается для редактирования основная форма этого документа.

Если нужно какое-то предварительное заполнение документа начальными данными, то это можно сделать либо с помощью свойств реквизитов документа ЗначениеЗаполнения, ЗаполнятьИзДанныхЗаполнения либо в обработчике события документа ОбработкаЗаполнения. Подробнее об этом событии можно посмотреть в вопросе Как при открытии формы определить, что создается новый элемент?.

Во втором случае можно программно создать документ на сервере, заполнить данными, если это нужно в обработчике события ОбработкаЗаполнения, записать, и передать ссылку на новый документ в метод глобального контекста ОткрытьЗначение(), который откроет форму этого документа. Например:

&НаКлиенте
Процедура ПриходнаяНакладная(Команда)
   СсылкаНаДокумент = СоздатьНовыйДокумент();
   ОткрытьЗначение(СсылкаНаДокумент);
КонецПроцедуры
&НаСервере
Функция СоздатьНовыйДокумент()
  НовыйДокумент = Документы.ПриходнаяНакладная.СоздатьДокумент();
  НовыйДокумент.Номер = "111";
  НовыйДокумент.Дата = ТекущаяДата();
  НовыйДокумент.Записать();
  Возврат НовыйДокумент.Ссылка;
КонецФункции
Подробнее об использовании методов ОткрытьЗначение() и ОткрытьФорму() можно прочитать в синтакс-помощнике: Глобальный контекст - Процедуры и функции для интерактивной работы.  

http://v8.1c.ru/metod/faq/answer.jsp?id=101
2 riv40rus
 
04.03.10
12:50
Stepa86 конечно все это хорошо. Но как без записи в базу, ссылки на документ нет, а имеется только созданный объект на сервере. Это нужно для того чтобы реализовать нестандартный ввод на основании.
3 Stepa86
 
04.03.10
12:52
>> Если нужно какое-то предварительное заполнение документа начальными данными, то это можно сделать либо с помощью свойств реквизитов документа ЗначениеЗаполнения, ЗаполнятьИзДанныхЗаполнения либо в обработчике события документа ОбработкаЗаполнения. Подробнее об этом событии можно посмотреть в вопросе Как при открытии формы определить, что создается новый элемент?.
4 Ненавижу 1С
 
гуру
04.03.10
12:57
Складывается впечатление, что программировать станет несколько сложнее
5 Stepa86
 
04.03.10
12:59
(4) программировать придется правильнее... мы не создаем объект и наполняем его свойствами, а вызываем конструктор
6 Ненавижу 1С
 
гуру
04.03.10
13:07
(5) у тебя в "конструкторе" документ записывается уже
7 riv40rus
 
04.03.10
13:09
Тогда как вызвать обработку заполнения другого документа и передать параметр ДанныеЗаполнения?
8 Stepa86
 
04.03.10
13:13
(6) я про обработку заполнения, документ не записывается
9 riv40rus
 
04.03.10
13:13
&НаСервере
Процедура СоздатьДокументПеремещениеТоваров(ОбъектФормы, ДанныеЗаполнения)
   
   Объект = ДанныеФормыВЗначение(ОбъектФормы, Тип("ДокументОбъект.ПеремещениеТоваров");
   ЗаполнитьЗначенияСвойств(Объект, ДанныеЗаполнения);
   Объект.Ответственный = ПараметрыСеанса.ТекущийПользователь;
   Объект.ПодразделениеОтправитель = ДанныеЗаполнения.Подразделение;
   Для Каждого ТекПродукт Из ДанныеЗаполнения.Товары Цикл
       НоваяСтрока = Объект.Товары.Добавить();
       ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекПродукт,,"Цена, Сумма");
       НоваяСтрока.Цена = ТекПродукт.ЦенаСНаценкой;
       НоваяСтрока.Сумма = ТекПродукт.СуммаСНаценкой;
   КонецЦикла;
   
   ЗначениеВДанныеФормы(Объект, ОбъектФормы);
   
КонецПроцедуры

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

Алгоритм не прокатил. Вылетает ошибка "Нельзя изменять поле, содержащее объект данных формы".
10 riv40rus
 
04.03.10
13:16
Какие мысли еще будут?
11 Stepa86
 
04.03.10
13:24
Пример из УТ11:
12 Stepa86
 
04.03.10
13:24
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
   
   ОткрытьФорму("Документ.УстановкаЦенНоменклатурыПартнера.Форма.ФормаДокумента",
       Новый Структура("Основание",ПараметрКоманды),
       ,
       ,
       );

КонецПроцедуры
13 Stepa86
 
04.03.10
13:26
http://screencast.com/t/YjdhNmEyY2Q

// Процедура - обработчик события "ОбработкаЗаполнения".
//
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
   
   ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);

   Если ТипДанныхЗаполнения = Тип("Структура") Тогда
       ЗаполнитьДокументПоОтбору(ДанныеЗаполнения);
   ИначеЕсли ТипДанныхЗаполнения = Тип("СправочникСсылка.Партнеры") Тогда
       ЗаполнитьДокументНаОснованииПартнера(ДанныеЗаполнения);
   КонецЕсли;

   ИнициализироватьДокумент();    
   
КонецПроцедуры // ОбработкаЗаполнения()
14 Mort
 
04.03.10
13:35
Автор предполагает порядок действий неприемлемый для клиент-серверного сценария.
15 Mort
 
04.03.10
13:36
Объект создается на сервере. Зачем ему там форма?
16 Mort
 
04.03.10
13:37
А если предполагалось получать форму на клиенте, зачем создавать объект на сервере?
17 riv40rus
 
04.03.10
13:41
Stepa86 спасибо.
18 riv40rus
 
04.03.10
13:51
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
   
   ОткрытьФорму("Документ.УстановкаЦенНоменклатурыПартнера.Форма.ФормаДокумента",
       Новый Структура("Основание",ПараметрКоманды),
       ,
       ,
       );

КонецПроцедуры
Не прокатывает. В документе вызывается ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка), а данные заполнения пустые.
19 Mort
 
04.03.10
13:54
(18) А ты в ПараметрКоманды что пихаешь?
20 riv40rus
 
04.03.10
13:55
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
       
   ОткрытьФорму("Документ.ПеремещениеТоваров.Форма.ФормаДокумента",
       Новый Структура("Основание, ВидОперацииЗаполнения",ПараметрКоманды, "Продукция"));
   
КонецПроцедуры
21 riv40rus
 
04.03.10
13:55
ПараметрКоманды имеет тип ДокументСсылка
22 Asmody
 
04.03.10
14:00
&НаКлиенте
Процедура Команда1(Команда)
   Форма=ПолучитьФорму("Справочник.Справочник1.ФормаОбъекта");    
   Форма.Объект.Наименование="Создано обработкой";
   Форма.Объект.Реквизит1="Реквизит1";
   Форма.Объект.Реквизит2="Реквизит2";
   НоваяСтрока=Форма.Объект.ТабличнаяЧасть1.Добавить();
   НоваяСтрока.Реквизит1=10;
   НоваяСтрока.Реквизит2=20;
   ОткрытьФорму(Форма);
КонецПроцедуры
23 riv40rus
 
04.03.10
14:06
Asmody читай выше, форма создается по данным объекта. На клиенте данные объекта не доступны.
24 riv40rus
 
04.03.10
14:06
ОткрытьФорму("Документ.ПеремещениеТоваров.Форма.ФормаДокумента",
       Новый Структура("Основание", Новый Структура("Основание, ВидОперацииЗаполнения", ПараметрКоманды, "Продукция")));
25 riv40rus
 
04.03.10
14:07
Всем спасибо! Разобрался.