Есть объект - элемент справочника
У него есть две формы, одна форма элемента и другая просто форма. Во второй форме тоже есть основной реквизит типа Справочник.Объект.
Как из формы 1 открыть форму 2 того же элемента?
На клиенте это можно или надо идти на сервер, делать сакраментальное РеквизитФормыВЗначение, получать форму и тогда уже открывать?
У него есть две формы, одна форма элемента и другая просто форма. Во второй форме тоже есть основной реквизит типа Справочник.Объект.
Как из формы 1 открыть форму 2 того же элемента?
На клиенте это можно или надо идти на сервер, делать сакраментальное РеквизитФормыВЗначение, получать форму и тогда уже открывать?
По теме из базы знаний
- Передача реквизитов, данных между формами (УФ)
- Права на объект (расширение, отчет)
- Панель #Расширение объекта: Редактор, Права, Поиск, Сторно, Обмен
- Защита объектов от изменения обменом
- Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) starjevschik, Поясни цель.
Вторая форма - просто вспомогательная для редактирования данных в первой форме?
Тогда не вижу смысла извращаться через основной реквизит формы. Проще открыть её в режиме выбора и обработать получение данных в главной форме по соответствующему событию. Это реально намного проще и эффективнее со всех сторон.
Потому что в случае извращений через основной реквизит, тебе придется открывать ведомую форму модально, что моветон (в противном случае придется как-то извращаться, чтобы данные основной формы не накрыло их старой версией).
Или цель в другом?
Вторая форма - просто вспомогательная для редактирования данных в первой форме?
Тогда не вижу смысла извращаться через основной реквизит формы. Проще открыть её в режиме выбора и обработать получение данных в главной форме по соответствующему событию. Это реально намного проще и эффективнее со всех сторон.
Потому что в случае извращений через основной реквизит, тебе придется открывать ведомую форму модально, что моветон (в противном случае придется как-то извращаться, чтобы данные основной формы не накрыло их старой версией).
Или цель в другом?
Просто с клиента открывайте вторую форму.
Только имейте в виду, что раз это тоже форма элемента справочника, то данная форма откроется в режиме создания нового элемента.
Можно, конечно, попытаться открыть текущий элемент, передав в открываемую форму параметр "Ключ" с ссылкой на текущий элемент справочника.
Но в этом случае при редактировании элемента справочника в первой и второй форме, Вы то и дело будете натыкаться на объектные блокировки.
Поэтому так делать не следует.
Вторую форму лучше сделать произвольной (не содержащей основного реквизита). И просто передавать туда-обратно необходимые данные.
ОткрытьФорму("Справочник.Справочник1.Форма.Форма2");
Только имейте в виду, что раз это тоже форма элемента справочника, то данная форма откроется в режиме создания нового элемента.
Можно, конечно, попытаться открыть текущий элемент, передав в открываемую форму параметр "Ключ" с ссылкой на текущий элемент справочника.
ПараметрыФормы = Новый Структура("Ключ", Объект.Ссылка);
ОткрытьФорму("Справочник.Справочник1.Форма.Форма2", ПараметрыФормы);
Но в этом случае при редактировании элемента справочника в первой и второй форме, Вы то и дело будете натыкаться на объектные блокировки.
Поэтому так делать не следует.
Вторую форму лучше сделать произвольной (не содержащей основного реквизита). И просто передавать туда-обратно необходимые данные.
(2) 1cUserAndrew, мне нужна вторая форма того же элемента. Это не форма элемента, конфликтов не будет.
Передавать параметрами это хорошо, но как мне потом из формы 2 вызвать метод объекта? Передать в форму 2 весь объект как параметр?
Параметр Ключ я делал, реквизит Объект не заполняется во второй форме.
Накину еще маней, нужно решение :)
Передавать параметрами это хорошо, но как мне потом из формы 2 вызвать метод объекта? Передать в форму 2 весь объект как параметр?
Параметр Ключ я делал, реквизит Объект не заполняется во второй форме.
Накину еще маней, нужно решение :)
(3) starjevschik,
Во владельца запихнул нужную форму, а у нее уже есть объект и верти как хочешь.
Иногда стоит почитать справку;)
Глобальный контекст (Global context)
ОткрытьФорму (OpenForm)
Вариант синтаксиса: По названию
Синтаксис:
ОткрытьФорму(<ИмяФормы>, <Параметры>, <Владелец>, <Уникальность>, <Окно>, <НавигационнаяСсылка>, <ОписаниеОповещенияОЗакрытии>, <РежимОткрытияОкна>)
ОткрытьФорму (OpenForm)
Вариант синтаксиса: По названию
Синтаксис:
ОткрытьФорму(<ИмяФормы>, <Параметры>, <Владелец>, <Уникальность>, <Окно>, <НавигационнаяСсылка>, <ОписаниеОповещенияОЗакрытии>, <РежимОткрытияОкна>)
Во владельца запихнул нужную форму, а у нее уже есть объект и верти как хочешь.
Иногда стоит почитать справку;)
(4) Xershi, так и в параметр можно передать объект
Мне кажется логичным, что должен быть какой-то более осмысленный путь.
В форме элемента у меня есть объект.
У объекта есть другая форма.
Почему я не могу эту форму открыть? Просто взять и открыть. Объект.ОткрытьФорму("Нужная мне форма"). Это же логично?
Я не понимаю.
Мне кажется логичным, что должен быть какой-то более осмысленный путь.
В форме элемента у меня есть объект.
У объекта есть другая форма.
Почему я не могу эту форму открыть? Просто взять и открыть. Объект.ОткрытьФорму("Нужная мне форма"). Это же логично?
Я не понимаю.
starjevschik, не
"Объект.ОткрытьФорму(...)"
а просто "ОткрытьФорму(...)", т.е. ровно так, как я написал.
Сам объект как параметр передавать не нужно.
Чтобы вызвать метод объекта, необходимо получить этот объект из основного реквизита формы.
"Объект.ОткрытьФорму(...)"
а просто "ОткрытьФорму(...)", т.е. ровно так, как я написал.
ПараметрыФормы = Новый Структура("Ключ", Объект.Ссылка);
ОткрытьФорму("Справочник.Справочник1.Форма.Форма2", ПараметрыФормы);
Сам объект как параметр передавать не нужно.
Чтобы вызвать метод объекта, необходимо получить этот объект из основного реквизита формы.
ДокОбъект = РеквизитФормыВЗначение("Объект");
ДокОбъект.ИмяМетодаМодуляОбъекта();
(7) 1cUserAndrew, ссылки не должно там быть. А если объект еще вообще не записан? А если он изменен и еще не записан? И тип реквизита - Справочник.Объект.
Но с объектом я писал именно так и он не заполняется в форме 2.
(8) herfis, постановка задачи. УТ 11 справочник партнеров. В процессе редактирования надо заполнить некую совокупность реквизитов, которые заполняются относительно сложными алгоритмами все вместе. Я сделал для этого отдельную форму, которая номер2. Она открывается из формы объекта, которая форма1.
При записи объекта должна происходить проверка заполнения этих реквизитов, которая тоже довольно длинная и корявая. Она же должна происходить и в этой форме номер 2. Ну там есть пара нюансов, они передаются параметрами. Общий алгоритм проверки один. Проверку я сделал процедурой модуля объекта. При записи объекта вызов не проблема, теперь мне надо вызвать эту же процедуру из формы2.
Форма2 открывается модально.
Но с объектом я писал именно так и он не заполняется в форме 2.
(8) herfis, постановка задачи. УТ 11 справочник партнеров. В процессе редактирования надо заполнить некую совокупность реквизитов, которые заполняются относительно сложными алгоритмами все вместе. Я сделал для этого отдельную форму, которая номер2. Она открывается из формы объекта, которая форма1.
При записи объекта должна происходить проверка заполнения этих реквизитов, которая тоже довольно длинная и корявая. Она же должна происходить и в этой форме номер 2. Ну там есть пара нюансов, они передаются параметрами. Общий алгоритм проверки один. Проверку я сделал процедурой модуля объекта. При записи объекта вызов не проблема, теперь мне надо вызвать эту же процедуру из формы2.
Форма2 открывается модально.
(10) m-serg74, по логике вещей это процедура объекта. Тоже думал перенести ее в менеджера, то есть по сути это будет просто совсем внешняя процедура. Но хочется же сделать правильно. Процедура имеет совершенно непосредственное отношение к объекту, если в менеджере, туда надо передавать объект, ну это же неправильно...
Ну и возвращаясь к исходному вопросу, неужели это такая проблема, открыть форму объекта? не могу понять этого.
ЗЫ а если передать объект и присвоить его реквизиту формы, даже неосновному, она пишет "Нельзя изменять поле, содержащее объект данных формы".
Какой-то полный финиш. Есть объект, есть его форма, как удалось разработчикам не предусмотреть процедуру Объект.ОткрытьФорму()? я не понимаю...
Ну и возвращаясь к исходному вопросу, неужели это такая проблема, открыть форму объекта? не могу понять этого.
ЗЫ а если передать объект и присвоить его реквизиту формы, даже неосновному, она пишет "Нельзя изменять поле, содержащее объект данных формы".
Какой-то полный финиш. Есть объект, есть его форма, как удалось разработчикам не предусмотреть процедуру Объект.ОткрытьФорму()? я не понимаю...
(11) starjevschik, "неужели это такая проблема, открыть форму объекта"
Вообще проблема. Так как возможность редактировать один и тот же объект одновременно из разных форм тянет кучу потенциальных проблем и вызывает больше вопросов чем дает ответов. Поэтому даже в толстом клиенте, где объект на клиенте физически существует, я подобной возможности не припоминаю. А на управляемой форме нет объекта. Есть только слепок его данных в основном реквизите формы, обычная коллекция. Поэтому можно попробовать извратиться (из любви к искусству извращений). Напрямую эту коллекцию присвоить ессно нельзя по понятным причинам (фиксированная структура забиндинная на интерфейс). Можно специальным методом - ЗначениеВРеквизитФормы, который выполняет все нужные перепривязки.
По-идее, можно попробовать просто открыть нужную форму (как форму нового объекта) и там на сервере выполнить РеквизитФормыВЗначение() для главной формы и затем ЗначениеВРеквизитФормы() для подчиненной. А потом повторить процедуру при передаче данных обратно (чтобы залить измененные данные в главную форму). Ессно, подчиненная форма должна быть открыта модально (еще одно извращение в копилку).
Если и это не получится - то вообще нельзя, значит. Ибо нефиг.
Вообще проблема. Так как возможность редактировать один и тот же объект одновременно из разных форм тянет кучу потенциальных проблем и вызывает больше вопросов чем дает ответов. Поэтому даже в толстом клиенте, где объект на клиенте физически существует, я подобной возможности не припоминаю. А на управляемой форме нет объекта. Есть только слепок его данных в основном реквизите формы, обычная коллекция. Поэтому можно попробовать извратиться (из любви к искусству извращений). Напрямую эту коллекцию присвоить ессно нельзя по понятным причинам (фиксированная структура забиндинная на интерфейс). Можно специальным методом - ЗначениеВРеквизитФормы, который выполняет все нужные перепривязки.
По-идее, можно попробовать просто открыть нужную форму (как форму нового объекта) и там на сервере выполнить РеквизитФормыВЗначение() для главной формы и затем ЗначениеВРеквизитФормы() для подчиненной. А потом повторить процедуру при передаче данных обратно (чтобы залить измененные данные в главную форму). Ессно, подчиненная форма должна быть открыта модально (еще одно извращение в копилку).
Если и это не получится - то вообще нельзя, значит. Ибо нефиг.
(17) herfis, спасибо за развернутый ответ.
Но ведь можно открыть две формы одного объекта. Например у разных пользователей. Оба могут открыть форму элемента справочника, и в каждой из форм будет доступен объект. Ну да, он редактироваться будет в одной из них. А мне и не нужно во второй форме редактировать его, он мне нужен, потому что у него нужные методы.
Все реквизиты скопировать не вариант, мне нужен именно объект, чтобы вызвать его метод. Действительно можно попробовать погонять туда-сюда через ЗначениеВРеквизит и обратно, что ли.
Но ведь можно открыть две формы одного объекта. Например у разных пользователей. Оба могут открыть форму элемента справочника, и в каждой из форм будет доступен объект. Ну да, он редактироваться будет в одной из них. А мне и не нужно во второй форме редактировать его, он мне нужен, потому что у него нужные методы.
Все реквизиты скопировать не вариант, мне нужен именно объект, чтобы вызвать его метод. Действительно можно попробовать погонять туда-сюда через ЗначениеВРеквизит и обратно, что ли.
(19) starjevschik, Это будут две формы разных объектов, не зависимых друг от друга, просто созданных из одной ссылки. Вы хотите несколько иное. Вы хотите, чтобы объект в одной форме заполнился данными объекта из другой формы (вернее, формулируете это так, что хотите доступ из двух форм к одному и тому же объекту, что в общем случае невозможно). А так, общая логика заполнения в (16) уже изложена. Обратно только перегнать данные тоже не забыть.
присоединяюсь к (10). Метод проверки переместить в модуль менеджера. В нем учесть особенность что Объект в форме элемента (это специальный тип, по сути Структура) <> ЭтотОбъект в модуле объекта
А из формы элемента вызывать другую форму элемента для редактирования этого же объекта (т.е. когда основной реквизит формы все тот же объект) - по мне это в принципе неправильный подход
А из формы элемента вызывать другую форму элемента для редактирования этого же объекта (т.е. когда основной реквизит формы все тот же объект) - по мне это в принципе неправильный подход
Даже такая конструкция
валится с ошибкой "Нельзя изменять поле, содержащее объект данных формы"
чего-то я не понимаю все же.
// в форме 1
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("Объект", Объект);
Форма2 = ПолучитьФорму("блабла", СтруктураПараметров, ЭтаФорма);
Форма2.ОткрытьМодально();
// в форме2
// есть реквизит формы СпрОбъект типа Справочник.Объект, неосновной!
ПриСозданииНаСервере()
СпрОбъект = ЭтаФорма.Параметры.Объект;
Показатьвалится с ошибкой "Нельзя изменять поле, содержащее объект данных формы"
чего-то я не понимаю все же.
(16) klinval, это лучший ответ :)
спасибо
так работает.
(31) herfis, 1с - это интерфейс к базе данных. Соответственно объект в 1с - это представление для внешнего мира записи из базы данных. Для платформы объекты на сервере и на разных клиентах будут разными типами - окей, это их выбор, наверное, он оправдан. Но какое мне дело до внутренней жизни платформы, я не очень понимаю. Для меня объект он и есть объект, где бы он ни был. У него есть методы, есть формы, мне так кажется логичным, что я могу ими пользоваться там, где у меня есть объект. А уж как платформа будет преобразовывать типы внутри себя, какое мне дело? Зачем все это вынесено на верхний уровень кодирования, мне вообще непонятно. Все это безумие с коллекциями, реквизит в значение, все это должно быть имплисит конвершен, по-моему. Наворотили каких-то ненужных сложностей, а зачем?
Мне вообще иногда кажется, что 1с как фирма время от времени делает некие шаги, заведомо нелогичные, только лишь с одной целью - заставить своих конечных пользователей обратиться к франчам за переделками. И цель этого дела - поднять выручку франчей, чтобы они жили счастливо. Для этого делаются обновления, несовместимые с прошлыми версиями, для этого усложняется язык 1с вместо упрощения (что было бы логично с точки зрения развития). Это такая маркетинговая стратегия по повышению стоимости владения продуктом для пользователей.
спасибо
так работает.
(31) herfis, 1с - это интерфейс к базе данных. Соответственно объект в 1с - это представление для внешнего мира записи из базы данных. Для платформы объекты на сервере и на разных клиентах будут разными типами - окей, это их выбор, наверное, он оправдан. Но какое мне дело до внутренней жизни платформы, я не очень понимаю. Для меня объект он и есть объект, где бы он ни был. У него есть методы, есть формы, мне так кажется логичным, что я могу ими пользоваться там, где у меня есть объект. А уж как платформа будет преобразовывать типы внутри себя, какое мне дело? Зачем все это вынесено на верхний уровень кодирования, мне вообще непонятно. Все это безумие с коллекциями, реквизит в значение, все это должно быть имплисит конвершен, по-моему. Наворотили каких-то ненужных сложностей, а зачем?
Мне вообще иногда кажется, что 1с как фирма время от времени делает некие шаги, заведомо нелогичные, только лишь с одной целью - заставить своих конечных пользователей обратиться к франчам за переделками. И цель этого дела - поднять выручку франчей, чтобы они жили счастливо. Для этого делаются обновления, несовместимые с прошлыми версиями, для этого усложняется язык 1с вместо упрощения (что было бы логично с точки зрения развития). Это такая маркетинговая стратегия по повышению стоимости владения продуктом для пользователей.
(35) starjevschik, Я подразумевал лишь то, что обсуждая любую проблему нужно прийти к соглашению о терминах. Иначе разговор будет вестись на разных языках. В контексте работы прикладных объектов 1С под "объектом" чаще всего подразумевается именно образ прикладного объекта в памяти сервера/толстого клиента, если не оговорено другое. Вы же подразумевали более общее значение объекта. Отсюда некоторое недопонимание друг друга.
Что же касается программирования управляемых форм - вы слишком многого хотите. Вернее, хотите невозможного. Произошла полная смена парадигмы разработки приложения с моноблока на клиент-сервер. 1С и так умудрилась сделать это настолько прозрачно, что многие поначалу не могут понять, увидеть и осознать разницу. Разработка клиент-серверных приложений имеет слишком много особенностей и компромиссов, чтобы полностью скрывать слой клиент-серверного взаимодействия от разработчика.
Что же касается программирования управляемых форм - вы слишком многого хотите. Вернее, хотите невозможного. Произошла полная смена парадигмы разработки приложения с моноблока на клиент-сервер. 1С и так умудрилась сделать это настолько прозрачно, что многие поначалу не могут понять, увидеть и осознать разницу. Разработка клиент-серверных приложений имеет слишком много особенностей и компромиссов, чтобы полностью скрывать слой клиент-серверного взаимодействия от разработчика.
(36)
Зачем всё это полное непонимание клиент-серверной архитектуры - тащить и взваливать на программиста? Реализуйте внутри платформы свои представления и свои комплексы, вероятность того, что с реализацией УФ у 1С будет работать еще хуже - и так было понятно, но программисты почему крайние?! 1С пусть и несёт все риски и шишки со своей платформой.
Разработка клиент-серверных приложений имеет слишком много особенностей и компромиссов
Зачем всё это полное непонимание клиент-серверной архитектуры - тащить и взваливать на программиста? Реализуйте внутри платформы свои представления и свои комплексы, вероятность того, что с реализацией УФ у 1С будет работать еще хуже - и так было понятно, но программисты почему крайние?! 1С пусть и несёт все риски и шишки со своей платформой.
чтобы полностью скрывать слой клиент-серверного взаимодействия от разработчика.
ЧТО?! "Клиент-серверная" каша (как 1С поняли задачу клиент-сервера) как раз вынесена наружу, и &НаКлиенте или &НаСервере - прямое тому подтверждение. А следом и остальной "мусор" вынесен и сброшен на голову программиста - мы придумали чушь, а вы там думайте, как передавать данные между формой и "сервером", как обновлять данные на форме после серверной обработки данных, как гонять каждый вызов поиска элемента справочника/получения какой-нить константы на сервер ...
(26) да можно его вызвать через объект, проблема в том, что вы пытаетесь этот объект гонять по разным формам. Сделайте 2ю форму без передачи объекта. Передавайте ключевые данные. Там осуществляйте заполнение, возвращайте нужные данные в форму 1 и раскладывайте по полочкам.
Если уж совсем не хотите подход менять. Пробуйте в форме2 заполнять нужные реквизиты напрямую в ВладелецФормы.Объект. Вызвать проверку попробовать так РеквизитФормыВЗначение(ВладелецФормы.Объект).ФункцияПроверки()
Если уж совсем не хотите подход менять. Пробуйте в форме2 заполнять нужные реквизиты напрямую в ВладелецФормы.Объект. Вызвать проверку попробовать так РеквизитФормыВЗначение(ВладелецФормы.Объект).ФункцияПроверки()
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот