получение формы открытого документа (обычные формы)

1. German_Tagil 43 16.01.16 19:21 Сейчас в теме
Три дня бьюсь: не могу получить форму открытого документа
просмотрел все что есть в инете - но так и не заработало.

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

Иначе

Сообщить("Не открыта");
КонецЕсли;
вообще возможно ли получить форму открытого документа?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. CaptainMorgan 16.01.16 19:58 Сейчас в теме
(1) Вы пишите "не могу получить форму открытого документа"
Форма Документа у вас уже открыта.
Надо проверить так ли это и при необходимости активировать.
А если не открыта - открыть.

Удобнее всего использовать подобный код:
		Ф_ = ДокЪ.ПолучитьФорму( , "ФормаДокумента");
		Если Ф_.Открыта() Тогда
			Ф_.Активизировать();
		Иначе
			Ф_.Открыть();
		КонецЕсли;
4. Allexe8.1 16.01.16 20:09 Сейчас в теме
(1) German_Tagil,
Ссылка.ПолучитьФорму().Открыть()

При Ссылка.ПолучитьОбъект().ПолучитьФорму() - вы получаете форму нового экземпляра объекта.
VickWood; +1 Ответить
3. German_Tagil 43 16.01.16 20:01 Сейчас в теме
дак вот и не могу я до формы добраться
5. German_Tagil 43 16.01.16 20:12 Сейчас в теме
мне не надо получать форму нового экземпляра объекта - мне надо проверить открыт ли документ чтобы не потерялись данные в форме документа
6. Allexe8.1 16.01.16 20:15 Сейчас в теме
(5) German_Tagil, Тогда используйте
Ссылка.ПолучитьФорму().Открыть()


мне надо проверить открыт ли документ чтобы не потерялись данные в форме документа

Курите в сторону ЗаблокироватьДанныеДляРедактирования.
Т.к. я очень сильно сомневаюсь, что вы получите формы, открытые в других сеансах

т.е код примерно такой:
ФормаОткрыта = Истина;
Попытка
ЗаблокироватьДанныеДляРедактирования(Ссылка);
Исключение
Формаоткрыта = Ложь;
КонецПопытки
7. CaptainMorgan 16.01.16 20:20 Сейчас в теме
(5) Вы пишите "мне не надовы получать форму нового экземпляра объекта - мне надо проверить открыт ли документ"

Смотрите код внимательно.
Объект = Выборка.ссылка.ПолучитьОбъект(); 
Номер = Объект.Ссылка.Номер;
Док=Документы.ЗаказПокупателя.НайтиПоНомеру(Номер);
ФормаДок = Док.ПолучитьФорму( , "ФормаДокумента");
Если не ФормаДок.Открыта() Тогда
    ФормаДок.Открыть();
КонецЕсли;
8. German_Tagil 43 16.01.16 20:36 Сейчас в теме
{Форма.ФормаБуфераОбмена.Форма(109)}: Ошибка при вызове метода контекста (ПолучитьФорму)
ФормаДок = Док.ПолучитьФорму( , "ФормаДокумента");
по причине:
Элемент не выбран!
9. Allexe8.1 16.01.16 20:39 Сейчас в теме
(8) German_Tagil,
Документы.ЗаказПокупателя.НайтиПоНомеру(Номер)

А второй параметр где? У Заказа нумератор периодический. Поэтому ссылку не находит. + проверку нужно обязательно, на то что ссылка пустая.
10. CaptainMorgan 16.01.16 21:13 Сейчас в теме
(8) Очень сложно отлаживать программу не видя всего кода.
Ситуация как "у трёх слепых, изучающих одного слона"

Я исхожу из того, что код
Объект = Выборка.ссылка.ПолучитьОбъект(); 
Номер = Объект.Ссылка.Номер;

Адекватный и там данные верные.

В отладчике посмотрите Объект - это конкретно документ?

По идее, можно сразу получить форму
ФормаДок = Объект.ПолучитьФорму( , "ФормаДокумента");


Отладчиком посмотрите.
12. Allexe8.1 16.01.16 21:24 Сейчас в теме
(10) CaptainMorgan, в контексте основной задачи, которая звучит
как мне надо проверить открыт ли документ чтобы не потерялись данные в форме документа
- данный код неверен, т.к. вы не сможете, к примеру, получить формы, открытые в других сеансах.
Более того, даже в контексте темы
получение формы открытого документа
этот код неверен, т.к. получается форма нового экземпляра объекта, т.е. гарантированно новая форма.
11. German_Tagil 43 16.01.16 21:22 Сейчас в теме
Исправил
Номер = Объект.ссылка.Номер;
ДатаД =Объект.ссылка.Дата;
Сообщить("номер "+ номер+ " " +датаД);
Док=Документы.ЗаказПокупателя.НайтиПоНомеру(Номер,ДатаД);
Сообщить("Док "+ Док.ссылка);

ФормаДок = Док.ссылка.ПолучитьФорму( , "ФормаДокумента",номер);
Если ФормаДок.Открыта() Тогда

Сообщить(" открыта");
иначе
Сообщить("не открыта");
КонецЕсли;


все равно не видит форму - документ открыт
13. Allexe8.1 16.01.16 21:24 Сейчас в теме
(11) German_Tagil,
читай (6)
зы. И Док.ссылка - не нужно. У тебя в Док - уже ссылка. Док.Ссылка - работает как Док.ПолучитьОбъект().Ссылка
14. German_Tagil 43 16.01.16 21:30 Сейчас в теме
да я до этого раньше от безисходности додумался
Если Не Объект.Заблокирован() Тогда
Объект.Заблокировать();
Объект.Записать();
Объект.Разблокировать();
иначе
оповестить("Нужно освободить документ " + Объект.ссылка);
КонецЕсли;
вот как-то так
15. Allexe8.1 16.01.16 21:33 Сейчас в теме
(14) German_Tagil, не
Объект.Заблокировать()
а
ЗаблокироватьДанныеДляИзменения(Ссылка)
16. German_Tagil 43 16.01.16 21:38 Сейчас в теме
17. German_Tagil 43 16.01.16 21:44 Сейчас в теме
Нет у меня таких функций ЗаблокироватьДанныеДляИзменения(Ссылка)
18. Allexe8.1 16.01.16 21:53 Сейчас в теме
(17) German_Tagil, в синтакс-помощнике нет такой ф-ии? Синтаксический контроль на нее ругается? Платформа 8.1?
ЗаблокироватьДанныеДляРедактирования(), сорряй
19. German_Tagil 43 16.01.16 21:56 Сейчас в теме
21. Allexe8.1 16.01.16 22:00 Сейчас в теме
(19) German_Tagil, короче, попробуй код из (6) Мне в свое время этот метод очень помог в решении подобной задачи.
20. German_Tagil 43 16.01.16 21:59 Сейчас в теме
ЗаблокироватьДанныеДляРедактирования() и что в данном случае блокируется там я конкретно только один документ блокирую
22. Allexe8.1 16.01.16 22:03 Сейчас в теме
(20) German_Tagil, блокируется объект по ключу Ссылка(отбор регистра) /идентификатор формы.
Данная блокировка - возникает при открытии формы. То есть если пользователь открыл форму существующего документа - он неявно заблокировал этот объект для редактирования. Когда ты в своей обработке - пытаешься заблокировать этот же объект (ту же ссылку по сути) - у тебя вылетает исключение, т.к. объект уже заблокирован открытой формой другого пользователя. Причем про эту форму тебе ничего знать не нужно.
23. German_Tagil 43 16.01.16 22:10 Сейчас в теме
тут другое интересно
ДатаСв=Док.ссылка.ПолучитьФорму("ФормаДокумента").Дата;
Сообщить("ДатаСв открыта"+ДатаСв);

ДатаСв открыта08.06.2015 12:57:28

те данные формы он видит
24. Allexe8.1 16.01.16 22:20 Сейчас в теме
(23) German_Tagil, это данные не формы, а основного объекта формы. Т.е фактически ("ДокументОбъект" - по умолчанию) - Форма.ДокументОбъект.Дата
25. German_Tagil 43 16.01.16 22:29 Сейчас в теме
ну муть-то блин неужели никак нельзя мне сегодня что-то подобное попадалось и вроде они запустили
26. German_Tagil 43 16.01.16 22:49 Сейчас в теме
вот нашел но тоже не работает
Док1 = ТекДок.ПолучитьОбъект();
ФормаДок1 = Док1.ПолучитьФорму(«ФормаДокумента»);
Если ФормаДок1.Открыта() Тогда


ФормаДок1 = ТекДок.ПолучитьФорму(«ФормаДокумента»);
не надо объект получать
issyk23
7 - 13.03.07 - 17:37
Да, так все получилось. Спасибо.
а у меня неполучилось
27. German_Tagil 43 17.01.16 06:22 Сейчас в теме
http://www.forum.mista.ru/topic.php?id=529674
и у меня вопрос. каким образом я могу узнать Владельцформы
если только форма была открыта мной и я где-то сохранил значение
а если не мной открыта?
Окна перебирать - но в обычных формах 8.2 как то смутно это все прописано

ФормаДокумента2 = Документ1Объект.Документ2.ПолучитьФорму("ФормаДокумента",Владелецформы,Документ1Объект.Номер);
28. CaptainMorgan 17.01.16 07:01 Сейчас в теме
(27) ПолучитьФорму(<ПолноеИмяФайла>, <ИмяФормы>, <Владелец>, <КлючУникальности>)

Параметры:

<ПолноеИмяФайла> (обязательный)
Тип: Строка.
Путь к файлу внешней обработки.
<ИмяФормы> (необязательный)

Тип: Строка; ОбъектМетаданных: Форма .
Имя формы, как оно задано в конфигураторе.
Если параметр не указан, то используется форма, заданная в качестве основной.

<Владелец> (необязательный)
Тип: Форма.
Форма, которая будет являться владельцем открываемой формы. Если параметр не указан, то используется основная форма, заданная в конфигураторе.

<КлючУникальности> (необязательный)
Тип: Произвольный.
В данном параметре может быть задан некоторый ключ, значение которого будет использоваться для поиска уже открытых форм. Если будет найдена форма с таким же ключом уникальности, вместо открытия новой формы будет активизирована найденная форма.
Если параметр не указан, сначала всегда будет искаться уже открытая форма.
29. German_Tagil 43 17.01.16 11:47 Сейчас в теме
вот и непонятно каким образом узнать открыт документ или нет
может есть другие варианты решения данной проблемы
32. starik-2005 3084 03.02.16 21:44 Сейчас в теме
(29) German_Tagil, тут вопрос - кем открыт? Вами в текущем приложении или вообще? Если вообще, то хороший вариант с блокировкой. Если у текущего пользователя, то в тонком клиенте есть "ПолучитьОкна()", а для толстого ничего не сделали такого.
30. German_Tagil 43 22.01.16 13:59 Сейчас в теме
Мда вопрос вроде регулярно поднимается а вот ответа вразумительного похоже так и нет
31. German_Tagil 43 03.02.16 21:29 Сейчас в теме
И все таки есть ли достаточно простой способ обновить проверить уже открытую форму?
33. German_Tagil 43 05.02.16 12:12 Сейчас в теме
в данном случае я пока обошелся блокировкой потому что документ может быть открыт как и мной (забыл закрыть к примеру) так и другим пользователем
встречалось про оповещения но честно говоря не понял как ими пользоваться
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот