gifts2017

Открытие формы еще незаписанного документа 1С 8.2 Управляемое приложение

Опубликовал Андрей Морозов (lobster) в раздел Программирование - Практика программирования

Недавно столкнулся с проблемой открытия формы еще не записанного в БД документа, много возился с этим. Решил обобщить все найденное, может кому-то сэкономит время.

Итак вопрос №1: Как открыть форму еще не записанного документа (не заполнить на основании) ?

Ответ: Чтобы открыть форму нам нужно связать ее с ссылкой объекта, но объект еще не записан. Многие пытаются использовать метод УстановитьСсылкуНового() но это не прокатывает. После долгих чтений я сделал вот так:

&НаКлиенте
Процедура Команда(Команда)

Форма = ПолучитьФорму("Документ.НашДокумент.ФормаОбъекта");
ДанныеФормы = Форма.Объект; // Получаем объект формы в переменную
ЗаполнитьДокументНаСервере(ДанныеФормы); // Заполняем документ на сервере
КопироватьДанныеФормы(ДанныеФормы, Форма.Объект); // копируем наш объект в объект формы и далее открываем ее
Форма.Открыть();

КонецПроцедуры

// Можно использовать безконтекстный вызов, оптимизируем передачу данных

&НаСервереБезКонтекста

Функция ЗаполнитьДокументНаСервере(ДанныеФормы);

Док = ДанныеФормыВЗначение(ДанныеФормы, Тип("ДокументОбъект.НашДокумент")); // Получаем объект из данных формы ИЛИ

Док = Документы.НашДокумент.СоздатьДокумент();

// Заполняем реквизиты объекта или другие действия ********

ЗначениеВДанныеФормы(Док,ДанныеФормы); // Кладем обратно в объект формы уже созданный документ

КонецФункции

2. Как открыть форму уже записанного документа?

Здесь есть два метода ОткрытьФорму() или ОткрытьЗначение(). В обоих случаях нужно передавать ссылку на записанный документ.

 

&НаКлиенте
Процедура Команда(Команда)

СсылкаОбъекта = СоздатьНаСервере();
//1.
ОткрытьФорму("Документ.НашДокумент.Егоформа", Новый Стурктура("Ключ", СсылкаОбъекта)); // Через параметры мы передаем ссылку документа

//2.

ОткрытьЗначение(СсылкаОбъекта);

КонецПроцедуры

&НаСервере
Функция ЗаполнитьДокументНаСервере()

// Используем метод создать

НовыйОбъект = Документы.НашДокумент.СоздатьДокумент();

 // Заполняем его 

НовыйОбъект.Записать(); // Обязательно записываем

Возврат НовыйОбъект.Ссылка; //Возвращаем ссылку

КонецФункции

На уникальность материла не претендую, сам только "начинающий" так что если что не так  - критикуйте!


См. также

Подписаться Добавить вознаграждение

Комментарии

1. bulpi bulpi (bulpi) 29.02.12 09:22
Для того, чтобы открыть форму нового документа, достаточно использовать метод ОткрытьФорму. Все , что Вы написали, не нужно. Другое дело, если нужно ЗАПОЛНИТЬ эту форму. Так заголовок публикации тогда нужно поменять.
3. Максим Рябов (M-Mark-76) 01.03.12 09:49
Спасибо, вся описаная методика работает
4. Сергей Начина (serg_gres) 01.03.12 22:55
А я сделал через временное хранилище.
5. Сергей Буланкин (bulas) 27.08.12 15:00
Заполняем документ программно, а затем:
ФормаДокумента = ДокументОбъект.ПолучитьФорму();
ФормаДокумента.ОткрытьМодально();
Оставили в открытом документе еще "следы" и записываем(проводим).
6. Igoryany4 Igoryany4 (Igoryany4) 26.10.12 14:14
При выполнении строки:
Форма = ПолучитьФорму("Документы.НашДокумент.ФормаОбъекта");


возникает ошибка, исправленный вариант:
Форма = ПолучитьФорму("Документ.НашДокумент.ФормаОбъекта");
7. Виталий Андрющенко (via64) 11.04.13 11:01
(5) bulas,
Это работает только в толстом клиенте.
8. Karambol (nick_krsk) 01.06.13 14:28
Статья помогла решить задачу, спасибо!
9. Никита Грызлов (nixel) 12.06.13 12:31
Печально... "Разработку управляемого интерфейса" проглядите. Там есть простой пример, как это сделать.
10. Шалимов Михаил (M.Shalimov) 25.06.13 15:27
Функция ЗаполнитьДокументНаСервере(ДанныеФормы);


В Вашем примере функция ничего не возвращает и ";" при определении излишни.
11. Тимур - (leemuar) 13.11.13 15:29
(9) nixel, на какой из 500 страниц?
12. Никита Грызлов (nixel) 13.11.13 18:25
(11) leemuar, из 600 :)
Извиняюсь, сейчас проглядел книгу, действительно там этого нет. Видимо идею брал из какого-то другого печатного источника.
В работе дабы не гонять большие массивы данных между клиентом и сервером использую такой подход:

Форма, с которой мы открываем незаписанную форму.
&НаКлиенте
Процедура ОткрытьЗаполненныйДокумент(Команда)
                Адрес = ПолучитьАдресНовогоДокумента(ЭтаФорма.УникальныйИдентификатор);
                Параметры = Новый Структура(“АдресХранилища”, Адрес);
                ОткрытьФорму(”Документ.Приказ.ФормаОбъекта”, Параметры, ЭтаФорма);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьАдресНовогоДокумента(УИД)
                ДокументОбъект = Документы.НашДокумент.СоздатьДокумент();
                ...
                code code code
                ...
                АдресХранилища  = ПоместитьВоВременноеХранилище(ДокументОбъект, УИД);

                Возврат АдресХранилища;
КонецФункции
...Показать Скрыть

Форма открываемого объекта
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
                Если Параметры.Свойство(”АдресХранилища”) И ЭтоАдресВременногоХранилища(Параметры.АдресХранилища) Тогда
                               ДокументОбъект = ПолучитьИзВременногоХранилища(Параметры.АдресХранилища);
                               ЗначениеВРеквизитФормы(ДокументОбъект, ”Объект”);
                КонецЕсли; 
КонецПроцедуры
...Показать Скрыть


Да, приходится незначительно залезать в форму объекта, но получается большой выигрыш по производительности и клиент-серверному взаимодействию.
unichkin; kuza_87; klinval; Sergafan10; Union37; Zero_nv; Elvisnya; +7 Ответить 1
13. Дядя Федор (dachnik) 13.12.13 13:03
Спасибо, хоть ваш пример у меня и не сработал, но навел на правильную мысль.
14. Элвис Игликов (Elvisnya) 28.07.14 12:51
(12) nixel, спасибо за совет. В 8.3 скорее всего не будет работать, т.к. в 8.3 при помещении несериализуемого значения во временное хранилище возникает модульная ошибка, а ДокументОбъект как раз несереализуемый. Как вариант можно использовать структуру, взамен ДокументОбъект.
SkyHunter; +1 Ответить
15. Олег Колотов (Kuklachel) 09.09.14 13:34
Спасибо lobster, очень помогли разобраться!
16. Vladimir Kuzmenko (t278) 23.09.14 03:20
в моём случае, нужно было открывать
мФорма= ПолучитьФорму("Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокументаТовары");
17. С К (kraynev-navi) 27.02.15 09:07
Подозреваю, что у последней функции в статье название должно быть все-таки СоздатьНаСервере()
18. Ольга Ковалева (volha-77) 11.03.15 21:26
Спасибо, очень нужная статья, все сработало и в 8.3
19. Александр exe (hiexe) 01.04.15 14:08
20. Serega Gusenkov (Sergus) 09.04.15 15:11
До недавнего времени все так и работало но вот сегодня все стало работать так как написал t278, нужно создавать конкретную форму.
21. program program (prodines) 10.04.15 14:49
ПолучитьФорму - доступность "Толстый клиент"! Минусую публикацию как нерабочую.
22. mirrr 23.04.15 15:22
Отсутствует отображение для типа 'ДанныеФормыЭлементКоллекции'
Эта ошибка на строку ЗаполнитьДокументНаСервере(ДанныеФормы);
Версия 8.3. В чем причина?
23. Vitaly . (sonGodv) 29.04.15 21:14
В моей ситуации не проходит не первый ни второй вариант.
В первом, документ Установки цен номенклатуры, не заполняется табличная часть, видимо надо вызывать еще процедуры из общих модулей
Во втором Документ можно записать, только если у пользователя есть полные права.
Мне нравиться больше второй вариант, но не нашел как обойти контроль прав пока.
Может кто сталкивался при записи программно с ограничениям по правам?
24. Дмитрий Воронов (korppinen) 10.06.15 12:49
(23) sonGodv,
УстановитьПривилегированныйРежим(Истина);
25. Александр Беспалько (alexa191) 19.07.15 18:23
Благодарю, помогла статья
26. SunnyGirl Summer (SunnyGirl) 13.10.15 09:37
Спасибо, статья помогла.
27. Вячеслав Никифоров (nikiforovvn) 15.02.16 10:36
28. Николай Фамилиев (KNM.Work) 30.05.16 01:30
29. Tindir Mindir (tindir) 21.08.16 18:54
&НаКлиенте
Процедура Команда(Команда)

Форма = ПолучитьФорму("Документ.НашДокумент.ФормаОбъекта");
ДанныеФормы = Форма.Объект; // Получаем объект формы в переменную
ЗаполнитьДокументНаСервере(ДанныеФормы); // Заполняем документ на сервере
КопироватьДанныеФормы(ДанныеФормы, Форма.Объект); // копируем наш объект в объект формы и далее открываем ее
Форма.Открыть();

КонецПроцедуры

// Можно использовать безконтекстный вызов, оптимизируем передачу данных

&НаСервереБезКонтекста

Функция ЗаполнитьДокументНаСервере(ДанныеФормы);

Док = ДанныеФормыВЗначение(ДанныеФормы, Тип("ДокументОбъект.НашДокумент")); // Получаем объект из данных формы ИЛИ

Док = Документы.НашДокумент.СоздатьДокумент();

// Заполняем реквизиты объекта или другие действия ********

ЗначениеВДанныеФормы(Док,ДанныеФормы); // Кладем обратно в объект формы уже созданный документ

КонецФункции
...Показать Скрыть

В коде теперь ошибка - Нельзя изменять поле, содержащее объект данных формы....
Как на этом вывихе мозга можно разрабатывать....
30. c (sergoqwe) 06.09.16 11:09
(29) tindir,
&НаКлиенте 
Процедура Команда1(Команда) 

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

КонецПроцедуры 

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

&НаСервере 
Функция ВидОперацииДокумента () 
Возврат Перечисления.ВидыОперацийРеализацияТоваров.Товары; 
КонецФункции 

...Показать Скрыть

Поправьте если что не правильно, только разбираюсь с этим выносом мозга 8.3
31. Александр Noname (Meson) 04.10.16 11:49
Док = ДанныеФормыВЗначение(ДанныеФормы, Тип("ДокументОбъект.РеализацияТоваровУслуг"));
Док = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

В чем смысл этих двух строк?
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа