1с открыть не основную форму
Многие сталкиваются с проблемой при использовании внешних отчетов и обработок в управляемом приложении: если необходимо открыть вторую форму обработки, то данные, введенные на первой форме не доступны. То есть, вторая форма открывается, как бы, отдельно от первой, как новый экземпляр обработки.
В этой статье мы рассмотрим способ, с помощью которого можно открыть вторую (а также третью, четвертую и т.д.) форму внешней обработки, не потеряв при этом данные, введенные на первой форме. Опустим моменты, связанные с созданием кнопок и процедур открытия форм и перейдем сразу к процедуре переноса данных из первой управляемой формы во вторую. Кстати, об открытии форм в управляемом приложении можно почитать тут.
Итак, первое, что нужно сделать — это поместить все данные внешней обработки, введенные на первой форме, в некоторое хранилище. Для этого используем функцию ПоместитьВоВременноеХранилище(). В нее нужно передать все данные внешней обработки. В целом код выглядит так:
&НаКлиенте
Процедура ОткрытьВторуюФорму ( )
//Обойдем в цикле все реквизиты внешней обработки и запишем их в структуру
_Объект = РеквизитФормыВЗначение ( "Объект" ) ;
СтруктураПараметров = Новый Структура ;
Для каждого Реквизит из _Объект . Метаданные ( ) . Реквизиты Цикл
СтруктураПараметров . Вставить ( Реквизит . Имя , Объект [ Реквизит . Имя ] ) ;
КонецЦикла ;
//Можно добавить и табличные части, и реквизиты первой формы.
СтруктураПараметров . Вставить ( "РеквизитФормы1" , РеквизитФормы 1 ) ;
СтруктураПараметров . Вставить ( "ТабличнаяЧасть1" , Объект [ "ТабличнаяЧасть1" ] . Выгрузить ( ) ) ;
//Теперь помещаем эти данные в хранилище и получаем адрес этого хранилища
АдресПередаваемыхПараметров = ПоместитьВоВременноеХранилище ( СтруктураПараметров , Новый УникальныйИдентификатор ) ;
//Создаем структуру с параметрами, которые передадим во вторую форму
_Параметры = новый Структура ( "Адрес" , АдресПередаваемыхПараметров ) ;
//Создаем оповещение, которое сработает при закрытии второй формы,
//т.к. измененные в ней данные нужно передать обратно в первую.
ОписаниеОповещения = Новый ОписаниеОповещения ( "ОбработатьЗакрытиеВторойФормы" , ЭтаФорма ) ;
//Ну и, наконец, открываем вторую форму
ОткрытьФорму ( "ВнешняяОбработка.ВыпускПроданнойПродукции.Форма.ФормаПараметровЗаполненияУПР" , _Параметры , ЭтаФорма . ОписаниеОповещения ) ;
Теперь нужно во второй управляемой форме принять и обработать данные. Это делается через обработчик события ПриСозданииНаСервере().
&НаСервере
Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка )
//Получаем сохраненные в хранилище данные
СтруктураПараметров = ПолучитьИзВременногоХранилища ( Параметры . Адрес ) ;
//Загружаем табличную часть
Объект [ "ТабличнаяЧасть1" ] . Загрузить ( СтруктураПараметров [ "ТабличнаяЧасть1" ] ) ;
//Загружаем реквизиты внешней обработки
_Объект = РеквизитФормыВЗначение ( "Объект" ) ;
Для каждого Реквизит из _Объект . Метаданные ( ) . Реквизиты Цикл
Объект [ Реквизит . Имя ] = СтруктураПараметров [ Реквизит . Имя ] ;
КонецЦикла ;
При закрытии второй формы нужно сделать то же самое: собрать все данные в хранилище, передать в процедуру оповещения в первой форме и обработать там.
&НаКлиенте
Процедура ЗакрытьФорму ( )
//Обойдем в цикле все реквизиты внешней обработки и запишем их в структуру
_Объект = РеквизитФормыВЗначение ( "Объект" ) ;
СтруктураПараметров = Новый Структура ;
Для каждого Реквизит из _Объект . Метаданные ( ) . Реквизиты Цикл
СтруктураПараметров . Вставить ( Реквизит . Имя , Объект [ Реквизит . Имя ] ) ;
КонецЦикла ;
//Можно добавить и табличные части, и реквизиты первой формы.
СтруктураПараметров . Вставить ( "РеквизитФормы1" , РеквизитФормы 1 ) ;
СтруктураПараметров . Вставить ( "ТабличнаяЧасть1" , Объект [ "ТабличнаяЧасть1" ] . Выгрузить ( ) ) ;
//Теперь помещаем эти данные в хранилище и получаем адрес этого хранилища
АдресПередаваемыхПараметров = ПоместитьВоВременноеХранилище ( СтруктураПараметров , Новый УникальныйИдентификатор ) ;
//Создаем структуру с параметрами, которые передадим во вторую форму
_Параметры = новый Структура ( "Адрес" , АдресПередаваемыхПараметров ) ;
//Закрываем форму, передав параметры.
Закрыть ( _Параметры ) ;
А в первой форме создаем процедуру, для которой делали описание оповещения. В ней обрабатываем принятые данные.
&НаСервере
Процедура ОбработатьЗакрытиеВторойФормы ( РезультатЗакрытия , Параметры ) Экспорт
Если РезультатЗакрытия = Неопределено Тогда
Возврат ;
КонецЕсли ;
//Получаем данные из хранилища
СтруктураПараметров = ПолучитьИзВременногоХранилища ( РезультатЗакрытия . Адрес ) ;
//Загружаем данные
Объект [ "ТабличнаяЧасть1" ] . Загрузить ( СтруктураПараметров [ "ТабличнаяЧасть1" ] ) ;
_Объект = РеквизитФормыВЗначение ( "Объект" ) ;
Для каждого Реквизит из _Объект . Метаданные ( ) . Реквизиты Цикл
Объект [ Реквизит . Имя ] = СтруктураПараметров [ Реквизит . Имя ] ;
КонецЦикла ;
Как открыть вторую форму внешней обработки в управляемом приложении 1С : 1 комментарий
«&НаКлиенте
Процедура ОткрытьВторуюФорму ()
//Обойдем в цикле все реквизиты внешней обработки и запишем их в структуру
_Объект = РеквизитФормыВЗначение(«Объект»);»
РеквизитФормыВЗначение на клиенте.
Добавить комментарий Отменить ответ
Теперь мы в соцсетях! Подписывайтесь, чтобы получать информацию о последних обновлениях или задать вопрос.
Доброго времени суток. Возникла необходимость открыть собственноручно спроектированную форму элемента справочника через двойной клик по записи в форме списка этого же справочника. форма, которую надо вызвать не есть основная, так еще надо как-то запретить ее открываться при двойном клике. А то так как я сейчас сделал открывается и моя и та, которая указана основно.
Вот как я открываю форму элемента из формы списка по двойному клику
Таким способом открывается, но пустая, поля соответствующие незаполненные.
Версия 1С 8.2 редакция 1.2.
Пожалуйста помогите, а то уже второй день парюсь.
(0)
копай в сторону обработчика в менеджере справочника
ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
(3)
Под основным реквизитов, который реквизит имеется в виду?
При создании собственноручной формы я выбирал тип формы форма элемента и перетащил туда код и наименование записи в справочнике, при том сделал эти два поля доступны для редактирования, я еще и три поля вытащил, которые и имеет редактировать пользователь с помощью этой формы.
Изюминка заключается в том, что когда проверить передан параметр Ключ, то он почему-то пустой (выводил в Сообщить, а также в процедуре ПриСозданииНаСервере пробовал передать в Объект формы объект записи Объект = Параметры.Ключ.ПолучитьОбъект ();
но оно выбрасывает ошибку, что значение не задано).
Еще попробовал таким вариантом открыть:
&НаКлиенте
Пошло, хотя ранше открывало совсем другую форму.
(2) Я прочитал о ОбработкаПолученияФормы (ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) и насколько я понял, то она заменит мне вызов основной формы для некоторого типа форм, а мне нужно чтобы только в форме ФормаСпискаДляПереглядуАсортименту, которая является типа формы списка и не является основной (там другая записана) при двойном клике мышки по записи в списке открывалась не основное форма элемента, а моя и только для данной формы списка.
Форма элемента, которую надо вызвать ФормаДляЗаданиеАсортимента.
Я бы был очень благодарен за пример, потому что сейчас сам не могу понять как это закодиты.
Функция ОткрытьФорму() имеет несколько вариантов синтаксиса:
Вариант синтаксиса 1: По имени
Функция ОткрытьФорму() имеет следующий синтаксис:
А также альтернативный англоязычный синтаксис:
Параметры
Описание параметров процедуры ОткрытьФорму() :
- ФормаОбъекта (ObjectForm) — форма объекта по умолчанию;
- ФормаГруппы (FolderForm) — форма группы по умолчанию;
- ФормаЗаписи (RecordForm) — форма записи регистра по умолчанию;
- ФормаСписка (ListForm) — форма списка по умолчанию;
- ФормаВыбора (ChoiceForm) — форма выбора по умолчанию;
- ФормаВыбораГруппы (FolderChoiceForm) — форма выбора группы по умолчанию;
- ФормаКонстант (ConstantsForm) — форма констант по умолчанию;
- Форма (Form) — форма отчета и обработки по умолчанию;
- ФормаНастроек (SettingsForm) — форма настроек отчета по умолчанию;
- ФормаЗагрузки (LoadForm) — форма загрузки настроек;
- ФормаСохранения (SaveForm) — форма сохранения настроек;
- БлокироватьВеcьИнтерфейс — Блокировать весь интерфейс. При этом блокируется работа всех остальных открытых окон приложения, включая главное окно
- БлокироватьОкноВладельца — Блокировать только форму-владельца, переданного в параметре ВладелецФормы . Новое окно открывается поверх окна-владельца
- Независимый — Независимое окно (обычный режим открытия формы). В интерфейсе «В отдельных окнах» открывается отдельное окно, а в интерфейсах «В закладках» или «Такси» форма открывается в рабочей области основного окна
Возвращаемое значение
Описание варианта 1
Функция ОткрытьФорму() открывает форму по имени. Перед открытием осуществляется поиск ранее открытой формы того же типа и совпадающими параметрами: значениям ключевых параметров формы, владельца формы, пользовательского ключа уникальности. Для форм ФормаОбъекта , ФормаЗаписи , ФормаНабораЗаписей , ФормаКонстант при поиске ранее открытых форм, владелец не учитывается.
Вариант синтаксиса 2: По форме
Функция ОткрытьФорму() имеет следующий синтаксис:
А также альтернативный англоязычный синтаксис:
Параметры
Описание параметров процедуры ОткрытьФорму() :
Возвращаемое значение
Описание варианта 2
Функция ОткрытьФорму() открывает форму, полученную ранее функциями ОткрытьФорму() или ПолучитьФорму()
Доступность
Тонкий клиент, веб-клиент, мобильный клиент, толстый клиент, мобильное приложение(клиент).
Форма — это основной инструмент взаимодействия пользователя с системой.
Существует два типа форм:
- Форма — обычная форма, унаследованная от предыдущих версий платформы 1С:Предприятие 8.0 и 8.1.
- УправляемаяФорма — более современная форма, которая появилась начиная с платформы 1С:Предприятие 8.2. Она основана на декларативном описании состава и расположения элементов управления;
Для программного открытия обоих типов форм используются всего пара функций:
-
— открывает форму объекта; — возвращает объект типа Форма или УправляемаяФорма , который впоследствии можно открыть;
Поскольку технологическая платформа 1С:Предприятие 8 способна генерировать платформы самостоятельно, то можно выделить несколько типов форм:
- Основная форма объекта;
- Вспомогательная форма объекта;
- Произвольная форма (не привязана к конкретному объекту);
Основная форма объекта
Основная форма — это форма, назначенная объекту в качестве основной формы, которая и будет открываться по-умолчанию.
Чтобы программно открыть основную форму объекта достаточно выполнить следующий простенький код:
где Справочник.ФизическиеЛица.ФормаОбъекта — полный путь к основной форме объекта (ознакомьтесь со списком основных объектов платформы 1С:Предприятие 8), а ФормаОбъекта — зарезервированное имя основной формы объекта. Кроме этого имени, зарезервирован еще ряд имен:
- ФормаКонстант (ConstantsForm) — форма констант по умолчанию;
- ФормаОбъекта (ObjectForm) — форма объекта по умолчанию (элемента справочника, документа, плана счетов и т.п);
- ФормаГруппы (FolderForm) — форма группы по умолчанию (группы справочника, плана счетов и т.п.);
- ФормаСписка (ListForm) — форма списка по умолчанию (справочника, документа, плана счетов, регистра и т.п.);
- ФормаВыбора (ChoiceForm) — форма выбора по умолчанию (справочника, документа, плана счетов и т.п);
- ФормаВыбораГруппы (FolderChoiceForm) — форма выбора группы по умолчанию (справочника, документа, плана счетов и т.п);
- ФормаЗаписи (RecordForm) — форма записи регистра сведений по умолчанию;
- Форма (Form) — форма отчета или обработки по умолчанию;
- ФормаНастроек (SettingsForm) — форма настроек отчета по умолчанию;
- ФормаЗагрузки (LoadForm) — форма загрузки настроек отчета;
- ФормаСохранения (SaveForm) — форма сохранения настроек отчета;
- ФормаВарианта (VariantForm) — форма редактирования варианта отчета;
- и т.п.
Вспомогательная форма объекта
Вспомогательная форма — это любая другая форма, не назначенная в качестве основной.
Чтобы программно открыть вспомогательную форму объекта необходимо выполнить следующий код:
Как видите, достаточно было указать имя формы (как оно задано в конфигураторе), после ключевого имени Форма
Произвольная форма
Произвольная форма — это форма, в которой не выбран основной реквизит.
Открытие произвольной формы ничем не отличается от открытия вспомогательной формы. Код используется тот же самый
Открытие формы существующего объекта
Для открытия формы существующего объекта необходимо модифицировать наш код. Забегая вперед, скажу, что мы будем использовать параметры формы:
Служебный параметр Ключ обозначает ссылку на объект информационной базы, которую требуется открыть
Ответ: Чтобы открыть форму нам нужно связать ее с ссылкой объекта, но объект еще не записан. Многие пытаются использовать метод УстановитьСсылкуНового () но это не прокатывает. После долгих чтений я сделал вот так:
&НаКлиенте
Процедура Команда ( Команда )
Форма = ПолучитьФорму ( «Документ.НашДокумент .ФормаОбъекта» );
ДанныеФормы = Форма.Объект ; // Получаем объект формы в переменную
ЗаполнитьДокументНаСервере ( ДанныеФормы ); // Заполняем документ на сервере
КопироватьДанныеФормы ( ДанныеФормы, Форма.Объект ); // копируем наш объект в объект формы и далее открываем ее
Форма.Открыть ();
// Можно использовать безконтекстный вызов, оптимизируем передачу данных
Функция ЗаполнитьДокументНаСервере ( ДанныеФормы );
Док = ДанныеФормыВЗначение ( ДанныеФормы , Тип ( «ДокументОбъект.НашДокумент» )); // Получаем объект из данных формы ИЛИ
// Заполняем реквизиты объекта или другие действия ********
ЗначениеВДанныеФормы ( Док,ДанныеФормы ); // Кладем обратно в объект формы уже созданный документ
2. Как открыть форму уже записанного документа?
Здесь есть два метода ОткрытьФорму () или ОткрытьЗначение () . В обоих случаях нужно передавать ссылку на записанный документ.
&НаКлиенте
Процедура Команда ( Команда )
СсылкаОбъекта = СоздатьНаСервере ();
//1.
ОткрытьФорму ( «Документ.НашДокумент.Егоформа» , Новый Стурктура ( «Ключ» , СсылкаОбъекта )); // Через параметры мы передаем ссылку документа
&НаСервере
Функция ЗаполнитьДокументНаСервере ()
// Используем метод создать
НовыйОбъект = Документы . НашДокумент . СоздатьДокумент ();
НовыйОбъект . Записать (); // Обязательно записываем
Возврат НовыйОбъект . Ссылка ; //Возвращаем ссылку
На уникальность материла не претендую, сам только «начинающий» так что если что не так — критикуйте!
Читайте также: