Открыть другую форму объекта УФ

1. starjevschik 14.09.15 17:22 Сейчас в теме
Есть объект - элемент справочника
У него есть две формы, одна форма элемента и другая просто форма. Во второй форме тоже есть основной реквизит типа Справочник.Объект.
Как из формы 1 открыть форму 2 того же элемента?
На клиенте это можно или надо идти на сервер, делать сакраментальное РеквизитФормыВЗначение, получать форму и тогда уже открывать?
KAV2; adhocprog; +2 Ответить
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
16. klinval 338 15.09.15 15:32 Сейчас в теме
А вот так:?
	Форма2 = ПолучитьФорму("ПутьКФорме",,ЭтаФорма);
	КопироватьДанныеФормы(Объект,Форма2.Объект);
	Форма2.Открыть();
Innuil; vovslev; nik_lankaster; Rain88; ilya4; dragonCat; yghmd; 00alenka00; adhocprog; +9 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
8. herfis 500 15.09.15 13:15 Сейчас в теме
(1) starjevschik, Поясни цель.
Вторая форма - просто вспомогательная для редактирования данных в первой форме?
Тогда не вижу смысла извращаться через основной реквизит формы. Проще открыть её в режиме выбора и обработать получение данных в главной форме по соответствующему событию. Это реально намного проще и эффективнее со всех сторон.
Потому что в случае извращений через основной реквизит, тебе придется открывать ведомую форму модально, что моветон (в противном случае придется как-то извращаться, чтобы данные основной формы не накрыло их старой версией).
Или цель в другом?
2. 1cUserAndrew 63 14.09.15 22:40 Сейчас в теме
Просто с клиента открывайте вторую форму.
ОткрытьФорму("Справочник.Справочник1.Форма.Форма2");


Только имейте в виду, что раз это тоже форма элемента справочника, то данная форма откроется в режиме создания нового элемента.

Можно, конечно, попытаться открыть текущий элемент, передав в открываемую форму параметр "Ключ" с ссылкой на текущий элемент справочника.

ПараметрыФормы = Новый Структура("Ключ", Объект.Ссылка); 
ОткрытьФорму("Справочник.Справочник1.Форма.Форма2", ПараметрыФормы);


Но в этом случае при редактировании элемента справочника в первой и второй форме, Вы то и дело будете натыкаться на объектные блокировки.

Поэтому так делать не следует.
Вторую форму лучше сделать произвольной (не содержащей основного реквизита). И просто передавать туда-обратно необходимые данные.
3. starjevschik 15.09.15 09:10 Сейчас в теме
(2) 1cUserAndrew, мне нужна вторая форма того же элемента. Это не форма элемента, конфликтов не будет.
Передавать параметрами это хорошо, но как мне потом из формы 2 вызвать метод объекта? Передать в форму 2 весь объект как параметр?
Параметр Ключ я делал, реквизит Объект не заполняется во второй форме.
Накину еще маней, нужно решение :)
4. Xershi 1490 15.09.15 09:21 Сейчас в теме
(3) starjevschik,
Глобальный контекст (Global context)
ОткрытьФорму (OpenForm)
Вариант синтаксиса: По названию

Синтаксис:

ОткрытьФорму(<ИмяФормы>, <Параметры>, <Владелец>, <Уникальность>, <Окно>, <НавигационнаяСсылка>, <ОписаниеОповещенияОЗакрытии>, <РежимОткрытияОкна>)


Во владельца запихнул нужную форму, а у нее уже есть объект и верти как хочешь.

Иногда стоит почитать справку;)
5. starjevschik 15.09.15 09:35 Сейчас в теме
(4) Xershi, так и в параметр можно передать объект
Мне кажется логичным, что должен быть какой-то более осмысленный путь.
В форме элемента у меня есть объект.
У объекта есть другая форма.
Почему я не могу эту форму открыть? Просто взять и открыть. Объект.ОткрытьФорму("Нужная мне форма"). Это же логично?
Я не понимаю.
6. Xershi 1490 15.09.15 09:39 Сейчас в теме
(5) starjevschik, потому что не открыть, а получить!
37. vitonya 79 26.11.19 11:46 Сейчас в теме
(4)
ногда стоит почитать


А в справке про владельца нихера не написано.
7. 1cUserAndrew 63 15.09.15 10:55 Сейчас в теме
starjevschik, не
"Объект.ОткрытьФорму(...)"
а просто "ОткрытьФорму(...)", т.е. ровно так, как я написал.
ПараметрыФормы = Новый Структура("Ключ", Объект.Ссылка); 
ОткрытьФорму("Справочник.Справочник1.Форма.Форма2", ПараметрыФормы);

Сам объект как параметр передавать не нужно.
Чтобы вызвать метод объекта, необходимо получить этот объект из основного реквизита формы.
ДокОбъект = РеквизитФормыВЗначение("Объект");
ДокОбъект.ИмяМетодаМодуляОбъекта();
9. starjevschik 15.09.15 13:52 Сейчас в теме
(7) 1cUserAndrew, ссылки не должно там быть. А если объект еще вообще не записан? А если он изменен и еще не записан? И тип реквизита - Справочник.Объект.
Но с объектом я писал именно так и он не заполняется в форме 2.

(8) herfis, постановка задачи. УТ 11 справочник партнеров. В процессе редактирования надо заполнить некую совокупность реквизитов, которые заполняются относительно сложными алгоритмами все вместе. Я сделал для этого отдельную форму, которая номер2. Она открывается из формы объекта, которая форма1.
При записи объекта должна происходить проверка заполнения этих реквизитов, которая тоже довольно длинная и корявая. Она же должна происходить и в этой форме номер 2. Ну там есть пара нюансов, они передаются параметрами. Общий алгоритм проверки один. Проверку я сделал процедурой модуля объекта. При записи объекта вызов не проблема, теперь мне надо вызвать эту же процедуру из формы2.
Форма2 открывается модально.
10. m-serg74 46 15.09.15 14:16 Сейчас в теме
(9) starjevschik,
Проверку я сделал процедурой модуля объекта

может в этом и ошибка, и нужно эту проверку сделать в модуле менеджера?
11. starjevschik 15.09.15 14:26 Сейчас в теме
(10) m-serg74, по логике вещей это процедура объекта. Тоже думал перенести ее в менеджера, то есть по сути это будет просто совсем внешняя процедура. Но хочется же сделать правильно. Процедура имеет совершенно непосредственное отношение к объекту, если в менеджере, туда надо передавать объект, ну это же неправильно...
Ну и возвращаясь к исходному вопросу, неужели это такая проблема, открыть форму объекта? не могу понять этого.

ЗЫ а если передать объект и присвоить его реквизиту формы, даже неосновному, она пишет "Нельзя изменять поле, содержащее объект данных формы".
Какой-то полный финиш. Есть объект, есть его форма, как удалось разработчикам не предусмотреть процедуру Объект.ОткрытьФорму()? я не понимаю...
12. m-serg74 46 15.09.15 15:02 Сейчас в теме
(11) starjevschik,
неужели это такая проблема, открыть форму объекта?

так а чем не подходит получить нужную форму, с нужными параметрами, если нужно то дозаполнить что то и потом открыть?
13. starjevschik 15.09.15 15:05 Сейчас в теме
(12) m-serg74, я вроде написал. Хотелось там в той форме получить реквизит-объект.
15. herfis 500 15.09.15 15:31 Сейчас в теме
(11) starjevschik, "неужели это такая проблема, открыть форму объекта"
Вообще проблема. Так как возможность редактировать один и тот же объект одновременно из разных форм тянет кучу потенциальных проблем и вызывает больше вопросов чем дает ответов. Поэтому даже в толстом клиенте, где объект на клиенте физически существует, я подобной возможности не припоминаю. А на управляемой форме нет объекта. Есть только слепок его данных в основном реквизите формы, обычная коллекция. Поэтому можно попробовать извратиться (из любви к искусству извращений). Напрямую эту коллекцию присвоить ессно нельзя по понятным причинам (фиксированная структура забиндинная на интерфейс). Можно специальным методом - ЗначениеВРеквизитФормы, который выполняет все нужные перепривязки.
По-идее, можно попробовать просто открыть нужную форму (как форму нового объекта) и там на сервере выполнить РеквизитФормыВЗначение() для главной формы и затем ЗначениеВРеквизитФормы() для подчиненной. А потом повторить процедуру при передаче данных обратно (чтобы залить измененные данные в главную форму). Ессно, подчиненная форма должна быть открыта модально (еще одно извращение в копилку).
Если и это не получится - то вообще нельзя, значит. Ибо нефиг.
17. herfis 500 15.09.15 15:36 Сейчас в теме
(15) herfis, +
А! Ну еще на крайний случай остается вариант просто обойти все данные основного реквизита и скопировать их поэлементно. Это-то железно должно сработать :)
19. starjevschik 15.09.15 15:54 Сейчас в теме
(17) herfis, спасибо за развернутый ответ.
Но ведь можно открыть две формы одного объекта. Например у разных пользователей. Оба могут открыть форму элемента справочника, и в каждой из форм будет доступен объект. Ну да, он редактироваться будет в одной из них. А мне и не нужно во второй форме редактировать его, он мне нужен, потому что у него нужные методы.
Все реквизиты скопировать не вариант, мне нужен именно объект, чтобы вызвать его метод. Действительно можно попробовать погонять туда-сюда через ЗначениеВРеквизит и обратно, что ли.
25. herfis 500 15.09.15 16:41 Сейчас в теме
(19) starjevschik, Это будут две формы разных объектов, не зависимых друг от друга, просто созданных из одной ссылки. Вы хотите несколько иное. Вы хотите, чтобы объект в одной форме заполнился данными объекта из другой формы (вернее, формулируете это так, что хотите доступ из двух форм к одному и тому же объекту, что в общем случае невозможно). А так, общая логика заполнения в (16) уже изложена. Обратно только перегнать данные тоже не забыть.
32. klinval 338 15.09.15 17:02 Сейчас в теме
(25) herfis, Обратно перегнать данные можно если на второй форме при закрытии написать:
КопироватьДанныеФормы(Объект,ЭтаФорма.ВладелецФормы.Объект);

(20) starjevschik, ну что попробовали?
ilya4; herfis; +2 Ответить
33. herfis 500 15.09.15 17:21 Сейчас в теме
(32) klinval, Чорд. Я был уверен, что КопироватьДанныеФормы() - это ты в общем смысле. А оказывается есть такой метод глобального контекста!
Век живи - век учись.
34. sommid 15.09.15 17:35 Сейчас в теме
(33) :), да, иногда помогает этот метод. Я пользую в подключаемых обработках по заполнению объектов
27. herfis 500 15.09.15 16:48 Сейчас в теме
(19) starjevschik, Что значит "реквизиты скопировать не вариант"? Ты уже сам запутался, по-ходу. Если тебе нужны только чистые методы с одними параметрами и без контекста объекта, нафига тогда вообще понадобилась форма с основным реквизитом?
18. Xershi 1490 15.09.15 15:37 Сейчас в теме
(11) starjevschik, читаем (6), вам даже пример кода дали в (16).
Одно условие толстый клиент.
20. starjevschik 15.09.15 15:57 Сейчас в теме
(18) Xershi, мне надо для клиента любой толщины делать, увы-увы.

(16) klinval, я попробую чуть позже, надо уже сдавать результат, а не экспериментировать с 1с...
21. klinval 338 15.09.15 15:59 Сейчас в теме
(18) Xershi, толстый клиент не обязателен
22. Xershi 1490 15.09.15 16:11 Сейчас в теме
(21) klinval, а кстати да. Я говорил про обращение через объект. В вашем случае и тонкий клиент будет работать.
23. sommid 15.09.15 16:33 Сейчас в теме
присоединяюсь к (10). Метод проверки переместить в модуль менеджера. В нем учесть особенность что Объект в форме элемента (это специальный тип, по сути Структура) <> ЭтотОбъект в модуле объекта
А из формы элемента вызывать другую форму элемента для редактирования этого же объекта (т.е. когда основной реквизит формы все тот же объект) - по мне это в принципе неправильный подход
14. starjevschik 15.09.15 15:18 Сейчас в теме
Даже такая конструкция
// в форме 1
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("Объект", Объект);
Форма2 = ПолучитьФорму("блабла", СтруктураПараметров, ЭтаФорма);
Форма2.ОткрытьМодально();

// в форме2
// есть реквизит формы СпрОбъект типа Справочник.Объект, неосновной!
ПриСозданииНаСервере()
СпрОбъект = ЭтаФорма.Параметры.Объект;
Показать


валится с ошибкой "Нельзя изменять поле, содержащее объект данных формы"
чего-то я не понимаю все же.
16. klinval 338 15.09.15 15:32 Сейчас в теме
А вот так:?
	Форма2 = ПолучитьФорму("ПутьКФорме",,ЭтаФорма);
	КопироватьДанныеФормы(Объект,Форма2.Объект);
	Форма2.Открыть();
Innuil; vovslev; nik_lankaster; Rain88; ilya4; dragonCat; yghmd; 00alenka00; adhocprog; +9 Ответить
35. starjevschik 16.09.15 12:04 Сейчас в теме
(16) klinval, это лучший ответ :)
спасибо
так работает.

(31) herfis, 1с - это интерфейс к базе данных. Соответственно объект в 1с - это представление для внешнего мира записи из базы данных. Для платформы объекты на сервере и на разных клиентах будут разными типами - окей, это их выбор, наверное, он оправдан. Но какое мне дело до внутренней жизни платформы, я не очень понимаю. Для меня объект он и есть объект, где бы он ни был. У него есть методы, есть формы, мне так кажется логичным, что я могу ими пользоваться там, где у меня есть объект. А уж как платформа будет преобразовывать типы внутри себя, какое мне дело? Зачем все это вынесено на верхний уровень кодирования, мне вообще непонятно. Все это безумие с коллекциями, реквизит в значение, все это должно быть имплисит конвершен, по-моему. Наворотили каких-то ненужных сложностей, а зачем?
Мне вообще иногда кажется, что 1с как фирма время от времени делает некие шаги, заведомо нелогичные, только лишь с одной целью - заставить своих конечных пользователей обратиться к франчам за переделками. И цель этого дела - поднять выручку франчей, чтобы они жили счастливо. Для этого делаются обновления, несовместимые с прошлыми версиями, для этого усложняется язык 1с вместо упрощения (что было бы логично с точки зрения развития). Это такая маркетинговая стратегия по повышению стоимости владения продуктом для пользователей.
36. herfis 500 16.09.15 12:32 Сейчас в теме
(35) starjevschik, Я подразумевал лишь то, что обсуждая любую проблему нужно прийти к соглашению о терминах. Иначе разговор будет вестись на разных языках. В контексте работы прикладных объектов 1С под "объектом" чаще всего подразумевается именно образ прикладного объекта в памяти сервера/толстого клиента, если не оговорено другое. Вы же подразумевали более общее значение объекта. Отсюда некоторое недопонимание друг друга.
Что же касается программирования управляемых форм - вы слишком многого хотите. Вернее, хотите невозможного. Произошла полная смена парадигмы разработки приложения с моноблока на клиент-сервер. 1С и так умудрилась сделать это настолько прозрачно, что многие поначалу не могут понять, увидеть и осознать разницу. Разработка клиент-серверных приложений имеет слишком много особенностей и компромиссов, чтобы полностью скрывать слой клиент-серверного взаимодействия от разработчика.
Casey1984; Xershi; +2 1 Ответить
38. AlexO 135 29.10.20 14:36 Сейчас в теме
(36)
Разработка клиент-серверных приложений имеет слишком много особенностей и компромиссов

Зачем всё это полное непонимание клиент-серверной архитектуры - тащить и взваливать на программиста? Реализуйте внутри платформы свои представления и свои комплексы, вероятность того, что с реализацией УФ у 1С будет работать еще хуже - и так было понятно, но программисты почему крайние?! 1С пусть и несёт все риски и шишки со своей платформой.
чтобы полностью скрывать слой клиент-серверного взаимодействия от разработчика.
ЧТО?! "Клиент-серверная" каша (как 1С поняли задачу клиент-сервера) как раз вынесена наружу, и &НаКлиенте или &НаСервере - прямое тому подтверждение. А следом и остальной "мусор" вынесен и сброшен на голову программиста - мы придумали чушь, а вы там думайте, как передавать данные между формой и "сервером", как обновлять данные на форме после серверной обработки данных, как гонять каждый вызов поиска элемента справочника/получения какой-нить константы на сервер ...
24. Xershi 1490 15.09.15 16:37 Сейчас в теме
Кстати если речь идет только о вызове методов, то тут объект тебе не нужен. Нужно обращаться через модуль менеджера.
26. starjevschik 15.09.15 16:42 Сейчас в теме
(24) Xershi, мне нужен метод объекта. Через модуль менеджера - это все равно что в какой-нибудь внешний модуль положить процедуру и передавать туда объект. Так тоже можно, но это же метод объекта, елки-палки, почему же его нельзя вызвать через объект?
28. Xershi 1490 15.09.15 16:50 Сейчас в теме
(26) starjevschik, переноси метод объекта в модуль менеджера. Т.к. произвольная форма это не объект, то и обратиться к модулю объекта нельзя. Для таких целей и служит модуль менеджера.

Да это почти тоже самое что и общие модули.
29. herfis 500 15.09.15 16:51 Сейчас в теме
(26) starjevschik, Да хоть обвызывайся.
Результат = Документы.МойДокумент.СоздатьДокумент().МояФункция(Параметры);
30. sommid 15.09.15 16:51 Сейчас в теме
(26) да можно его вызвать через объект, проблема в том, что вы пытаетесь этот объект гонять по разным формам. Сделайте 2ю форму без передачи объекта. Передавайте ключевые данные. Там осуществляйте заполнение, возвращайте нужные данные в форму 1 и раскладывайте по полочкам.

Если уж совсем не хотите подход менять. Пробуйте в форме2 заполнять нужные реквизиты напрямую в ВладелецФормы.Объект. Вызвать проверку попробовать так РеквизитФормыВЗначение(ВладелецФормы.Объект).ФункцияПроверки()
31. herfis 500 15.09.15 16:57 Сейчас в теме
По-моему, все проблема в терминологии. Непонятно, что ТС объектом называет. Может он и сам этого не понимает, если не разобрался в тонкостях клиент-серверного взаимодействия.
Casey1984; +1 Ответить
Оставьте свое сообщение

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