Есть объект - элемент справочника
У него есть две формы, одна форма элемента и другая просто форма. Во второй форме тоже есть основной реквизит типа Справочник.Объект.
Как из формы 1 открыть форму 2 того же элемента?
На клиенте это можно или надо идти на сервер, делать сакраментальное РеквизитФормыВЗначение, получать форму и тогда уже открывать?
---
А вот так:?

```1c
    Форма2 = ПолучитьФорму("ПутьКФорме",,ЭтаФорма);
    КопироватьДанныеФормы(Объект,Форма2.Объект);
    Форма2.Открыть();
```
---
starjevschik, Поясни цель.
Вторая форма - просто вспомогательная для редактирования данных в первой форме?
Тогда не вижу смысла извращаться через основной реквизит формы. Проще открыть её в режиме выбора и обработать получение данных в главной форме по соответствующему событию. Это реально намного проще и эффективнее со всех сторон.
Потому что в случае извращений через основной реквизит, тебе придется открывать ведомую форму модально, что моветон (в противном случае придется как-то извращаться, чтобы данные основной формы не накрыло их старой версией).
Или цель в другом?
---
Просто с клиента открывайте вторую форму.

```1c
    ОткрытьФорму("Справочник.Справочник1.Форма.Форма2");
```

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

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

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

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

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

Синтаксис:

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

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

Иногда стоит почитать справку;)
---
Xershi, так и в параметр можно передать объект
Мне кажется логичным, что должен быть какой-то более осмысленный путь.
В форме элемента у меня есть объект.
У объекта есть другая форма.
Почему я не могу эту форму открыть? Просто взять и открыть. Объект.ОткрытьФорму("Нужная мне форма"). Это же логично?
Я не понимаю.
---
starjevschik, потому что не открыть, а получить!
---
ногда стоит почитать

А в справке про владельца нихера не написано.
---
starjevschik, не
"Объект.ОткрытьФорму(...)"
а просто "ОткрытьФорму(...)", т.е. ровно так, как я написал.

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

Сам объект как параметр передавать не нужно.
Чтобы вызвать метод объекта, необходимо получить этот объект из основного реквизита формы.

```1c
    ДокОбъект = РеквизитФормыВЗначение("Объект");
    ДокОбъект.ИмяМетодаМодуляОбъекта();
```
---
1cUserAndrew, ссылки не должно там быть. А если объект еще вообще не записан? А если он изменен и еще не записан? И тип реквизита - Справочник.Объект.
Но с объектом я писал именно так и он не заполняется в форме 2.

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

ЗЫ а если передать объект и присвоить его реквизиту формы, даже неосновному, она пишет "Нельзя изменять поле, содержащее объект данных формы".
Какой-то полный финиш. Есть объект, есть его форма, как удалось разработчикам не предусмотреть процедуру Объект.ОткрытьФорму()? я не понимаю...
---
starjevschik, неужели это такая проблема, открыть форму объекта?
так а чем не подходит получить нужную форму, с нужными параметрами, если нужно то дозаполнить что то и потом открыть?
---
m-serg74, я вроде написал. Хотелось там в той форме получить реквизит-объект.
---
starjevschik, "неужели это такая проблема, открыть форму объекта"
Вообще проблема. Так как возможность редактировать один и тот же объект одновременно из разных форм тянет кучу потенциальных проблем и вызывает больше вопросов чем дает ответов. Поэтому даже в толстом клиенте, где объект на клиенте физически существует, я подобной возможности не припоминаю. А на управляемой форме нет объекта. Есть только слепок его данных в основном реквизите формы, обычная коллекция. Поэтому можно попробовать извратиться (из любви к искусству извращений). Напрямую эту коллекцию присвоить ессно нельзя по понятным причинам (фиксированная структура забиндинная на интерфейс). Можно специальным методом - ЗначениеВРеквизитФормы, который выполняет все нужные перепривязки.
По-идее, можно попробовать просто открыть нужную форму (как форму нового объекта) и там на сервере выполнить РеквизитФормыВЗначение() для главной формы и затем ЗначениеВРеквизитФормы() для подчиненной. А потом повторить процедуру при передаче данных обратно (чтобы залить измененные данные в главную форму). Ессно, подчиненная форма должна быть открыта модально (еще одно извращение в копилку).
Если и это не получится - то вообще нельзя, значит. Ибо нефиг.
---
herfis, +
А! Ну еще на крайний случай остается вариант просто обойти все данные основного реквизита и скопировать их поэлементно. Это-то железно должно сработать :)
---
herfis, спасибо за развернутый ответ.
Но ведь можно открыть две формы одного объекта. Например у разных пользователей. Оба могут открыть форму элемента справочника, и в каждой из форм будет доступен объект. Ну да, он редактироваться будет в одной из них. А мне и не нужно во второй форме редактировать его, он мне нужен, потому что у него нужные методы.
Все реквизиты скопировать не вариант, мне нужен именно объект, чтобы вызвать его метод. Действительно можно попробовать погонять туда-сюда через ЗначениеВРеквизит и обратно, что ли.
---
starjevschik, Это будут две формы разных объектов, не зависимых друг от друга, просто созданных из одной ссылки. Вы хотите несколько иное. Вы хотите, чтобы объект в одной форме заполнился данными объекта из другой формы (вернее, формулируете это так, что хотите доступ из двух форм к одному и тому же объекту, что в общем случае невозможно). А так, общая логика заполнения в (16) уже изложена. Обратно только перегнать данные тоже не забыть.
---
herfis, Обратно перегнать данные можно если на второй форме при закрытии написать:

```1c
    КопироватьДанныеФормы(Объект,ЭтаФорма.ВладелецФормы.Объект);
```

(20) starjevschik, ну что попробовали?
---
klinval, Чорд. Я был уверен, что КопироватьДанныеФормы() - это ты в общем смысле. А оказывается есть такой метод глобального контекста!
Век живи - век учись.
---
:), да, иногда помогает этот метод. Я пользую в подключаемых обработках по заполнению объектов
---
starjevschik, Что значит "реквизиты скопировать не вариант"? Ты уже сам запутался, по-ходу. Если тебе нужны только чистые методы с одними параметрами и без контекста объекта, нафига тогда вообще понадобилась форма с основным реквизитом?
---
starjevschik, читаем (6), вам даже пример кода дали в (16).
Одно условие толстый клиент.
---
Xershi, мне надо для клиента любой толщины делать, увы-увы.

(16) klinval, я попробую чуть позже, надо уже сдавать результат, а не экспериментировать с 1с...
---
Xershi, толстый клиент не обязателен
---
klinval, а кстати да. Я говорил про обращение через объект. В вашем случае и тонкий клиент будет работать.
---
присоединяюсь к (10). Метод проверки переместить в модуль менеджера. В нем учесть особенность что Объект в форме элемента (это специальный тип, по сути Структура) <> ЭтотОбъект в модуле объекта
А из формы элемента вызывать другую форму элемента для редактирования этого же объекта (т.е. когда основной реквизит формы все тот же объект) - по мне это в принципе неправильный подход
---
Даже такая конструкция

```1c
    // в форме 1
    СтруктураПараметров = Новый Структура;
    СтруктураПараметров.Вставить("Объект", Объект);
    Форма2 = ПолучитьФорму("блабла", СтруктураПараметров, ЭтаФорма);
    Форма2.ОткрытьМодально();

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

валится с ошибкой "Нельзя изменять поле, содержащее объект данных формы"
чего-то я не понимаю все же.
---
А вот так:?

```1c
    Форма2 = ПолучитьФорму("ПутьКФорме",,ЭтаФорма);
    КопироватьДанныеФормы(Объект,Форма2.Объект);
    Форма2.Открыть();
```
---
klinval, это лучший ответ :)
спасибо
так работает.

(31) herfis, 1с - это интерфейс к базе данных. Соответственно объект в 1с - это представление для внешнего мира записи из базы данных. Для платформы объекты на сервере и на разных клиентах будут разными типами - окей, это их выбор, наверное, он оправдан. Но какое мне дело до внутренней жизни платформы, я не очень понимаю. Для меня объект он и есть объект, где бы он ни был. У него есть методы, есть формы, мне так кажется логичным, что я могу ими пользоваться там, где у меня есть объект. А уж как платформа будет преобразовывать типы внутри себя, какое мне дело? Зачем все это вынесено на верхний уровень кодирования, мне вообще непонятно. Все это безумие с коллекциями, реквизит в значение, все это должно быть имплисит конвершен, по-моему. Наворотили каких-то ненужных сложностей, а зачем?
Мне вообще иногда кажется, что 1с как фирма время от времени делает некие шаги, заведомо нелогичные, только лишь с одной целью - заставить своих конечных пользователей обратиться к франчам за переделками. И цель этого дела - поднять выручку франчей, чтобы они жили счастливо. Для этого делаются обновления, несовместимые с прошлыми версиями, для этого усложняется язык 1с вместо упрощения (что было бы логично с точки зрения развития). Это такая маркетинговая стратегия по повышению стоимости владения продуктом для пользователей.
---
starjevschik, Я подразумевал лишь то, что обсуждая любую проблему нужно прийти к соглашению о терминах. Иначе разговор будет вестись на разных языках. В контексте работы прикладных объектов 1С под "объектом" чаще всего подразумевается именно образ прикладного объекта в памяти сервера/толстого клиента, если не оговорено другое. Вы же подразумевали более общее значение объекта. Отсюда некоторое недопонимание друг друга.
Что же касается программирования управляемых форм - вы слишком многого хотите. Вернее, хотите невозможного. Произошла полная смена парадигмы разработки приложения с моноблока на клиент-сервер. 1С и так умудрилась сделать это настолько прозрачно, что многие поначалу не могут понять, увидеть и осознать разницу. Разработка клиент-серверных приложений имеет слишком много особенностей и компромиссов, чтобы полностью скрывать слой клиент-серверного взаимодействия от разработчика.
---
Разработка клиент-серверных приложений имеет слишком много особенностей и компромиссов
Зачем всё это полное непонимание клиент-серверной архитектуры - тащить и взваливать на программиста? Реализуйте внутри платформы свои представления и свои комплексы, вероятность того, что с реализацией УФ у 1С будет работать еще хуже - и так было понятно, но программисты почему крайние?! 1С пусть и несёт все риски и шишки со своей платформой.
чтобы полностью скрывать слой клиент-серверного взаимодействия от разработчика. ЧТО?! "Клиент-серверная" каша (как 1С поняли задачу клиент-сервера) как раз вынесена наружу, и &НаКлиенте или &НаСервере - прямое тому подтверждение. А следом и остальной "мусор" вынесен и сброшен на голову программиста - мы придумали чушь, а вы там думайте, как передавать данные между формой и "сервером", как обновлять данные на форме после серверной обработки данных, как гонять каждый вызов поиска элемента справочника/получения какой-нить константы на сервер ...
---
Кстати если речь идет только о вызове методов, то тут объект тебе не нужен. Нужно обращаться через модуль менеджера.
---
Xershi, мне нужен метод объекта. Через модуль менеджера - это все равно что в какой-нибудь внешний модуль положить процедуру и передавать туда объект. Так тоже можно, но это же метод объекта, елки-палки, почему же его нельзя вызвать через объект?
---
starjevschik, переноси метод объекта в модуль менеджера. Т.к. произвольная форма это не объект, то и обратиться к модулю объекта нельзя. Для таких целей и служит модуль менеджера.

Да это почти тоже самое что и общие модули.
---
starjevschik, Да хоть обвызывайся.

```1c
    Результат = Документы.МойДокумент.СоздатьДокумент().МояФункция(Параметры);
```
---
да можно его вызвать через объект, проблема в том, что вы пытаетесь этот объект гонять по разным формам. Сделайте 2ю форму без передачи объекта. Передавайте ключевые данные. Там осуществляйте заполнение, возвращайте нужные данные в форму 1 и раскладывайте по полочкам.

Если уж совсем не хотите подход менять. Пробуйте в форме2 заполнять нужные реквизиты напрямую в ВладелецФормы.Объект. Вызвать проверку попробовать так РеквизитФормыВЗначение(ВладелецФормы.Объект).ФункцияПроверки()
---
По-моему, все проблема в терминологии. Непонятно, что ТС объектом называет. Может он и сам этого не понимает, если не разобрался в тонкостях клиент-серверного взаимодействия.