Версия для печати темы (https://pro1c.org.ua/index.php?s=27bc90bedf38101edff1c90a052486e2&showtopic=37917)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование управляемых форм 1С 8.2 _ Проверка открытия формы Справочника/документа

Автор: Gigi 15.06.17, 14:01

Добрый день.
Как можно проверить открыта ли форма определенного Справочника/Документа или нет?
Пример:

Форма = Справочники.Объект.ПолучитьФорму("ФормаОбъекта");
Если Форма.Открыта() тогда
//-*-*-*-*
КонецЕсли;

НЕ РАБОТАЕТ!

Автор: Flexy 15.06.17, 14:15

Цитата(Gigi @ 15.06.17, 14:01) *
НЕ РАБОТАЕТ!

Конечно. ПолучитьФорму() и ОткрытьФорму() - это две большие разницы.
В вашем случае форма не открыта.

Инфо из СП:

Открыта (IsOpen)
Синтаксис:

Открыта()
Возвращаемое значение:

Тип: Булево.
Истина - форма открыта; Ложь - не открыта.
В обработчике события ПриОткрытии возвращает Истина .
Описание:

Определяет, открыта ли данная форма.

Доступность:

Тонкий клиент, веб-клиент, толстый клиент, мобильное приложение(клиент).

Автор: Gigi 15.06.17, 14:28

Flexy @ Сегодня, 15:15 * ,
Я имею ввиду случай определения открытости или закрытости формы другого справочника.
На пример я открыл форму справочника: "ОБЪЕКТ". В группе(вкладке) которого имеется динамический список справочника: "ТОЧКА".
Где в командной строке последнего имеется лично созданная кнопка создания нового элемента того же справочника: "ТОЧКА".
Что нужно...
Что бы ПриОткрытии справочника "ТОЧКА", можно было определить открыта ли форма справочника: ОБЪЕКТ.
Вот что нужно.
А так я тоже знаю, что в таком виде:

Сообщить(ЭтаФорма.Открыта());

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

Автор: Flexy 15.06.17, 14:33

Имхо, тогда нужно курить ОкнаКлиентскогоПриложения
СП:
ОкнаКлиентскогоПриложения (ClientApplicationWindows)
Элементы коллекции:

ОкноКлиентскогоПриложения
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются элементы коллекции.
Возможно обращение к элементу коллекции посредством оператора [...]. В качестве аргумента передается индекс (нумерация с 0).

Методы:

Количество (Count)
Получить (Get)

Описание:

Коллекция содержит объекты типа ОкноКлиентскогоПриложения: все главные окна приложения, окна форм и документов. В коллекцию не входят модальные окна сообщений, подсказки и другие служебные окна.
Коллекция формируется автоматически и не имеет методов добавления или удаления.

Доступность:

Тонкий клиент, веб-клиент, толстый клиент, внешнее соединение, мобильное приложение(клиент).

Автор: Gigi 15.06.17, 15:08

Flexy @ Сегодня, 15:33 * ,
Я просто новичок в 1С так что ....
Короче не получается.

Gigi @ Сегодня, 15:54 * ,
А таким маккаром:

Окна = ПолучитьОкна();
Для каждого Окно из Окна Цикл
  Сообщить(Окно.Заголовок);
КонецЦикла;

Ругается.
Буду признателен если помощь не по тому, что написано в это дурацком синтаксис помощнике.
Который наверно "нужен" тому, который и без него все итак знает. smile.gifsmile.gif
Пожалуйста НА ПРИМЕРЕ! Если возможно!

Автор: Flexy 15.06.17, 15:09

Gigi @ Сегодня, 14:54 * ,
Как-то так...

КоллекцияОкон = ПолучитьОкна();
    Для Каждого Окно Из КоллекцияОкон Цикл
        КоллекцияСодержимое = Окно.Содержимое;
        Для Каждого Содержимое Из КоллекцияСодержимое Цикл
            Сообщить(Содержимое.ИмяФормы);
        КонецЦикла;
    КонецЦикла;

Автор: Gigi 15.06.17, 15:26

Flexy @ Сегодня, 16:09 * ,
СПАСИБО!
Ша проверю!

Flexy @ Сегодня, 16:09 * ,

Цитата(Flexy @ 15.06.17, 16:09) *
КоллекцияОкон = ПолучитьОкна();
    Для Каждого Окно Из КоллекцияОкон Цикл
        КоллекцияСодержимое = Окно.Содержимое;
        Для Каждого Содержимое Из КоллекцияСодержимое Цикл
            Сообщить(Содержимое.ИмяФормы);
        КонецЦикла;
    КонецЦикла;

Блин! Не работает!
Пишет:
Цитата
{Справочник.ТОЧКА.Форма.ФормаЭлемента.Форма(35)}: Поле объекта не обнаружено (Содержимое)
КоллекцияСодержимое = Окно.Содержимое;




Gigi @ Сегодня, 16:22 * ,
Код для 1С 8.2? Или как?

Gigi @ Сегодня, 16:23 * ,
Цитата
Содержимое (Content)
Использование:
Только чтение.
Описание:
Тип: СписокКомпонентXS.
Содержит список всех компонент схемы.
Доступность:
Сервер, толстый клиент, внешнее соединение.


Блин! Как быть?

Автор: Petre 15.06.17, 15:31

Gigi @ Сегодня, 16:26 * ,
Приложение управляемое?

Автор: Gigi 15.06.17, 15:33

Цитата(Petre @ 15.06.17, 16:31) *
Приложение управляемое?

Да!

Автор: Petre 15.06.17, 15:40

Gigi @ Сегодня, 16:33 * ,
И код запускаете на клиенте?

Автор: Gigi 15.06.17, 15:43

Petre @ Сегодня, 16:40 * ,
Да на клиенте

&НаКлиенте
Процедура ПриОткрытии(Отказ)
КоллекцияОкон = ПолучитьОкна();
    Для Каждого Окно Из КоллекцияОкон Цикл
        КоллекцияСодержимое = Окно.Содержимое;
        Для Каждого Содержимое Из КоллекцияСодержимое Цикл
            Сообщить(Содержимое.ИмяФормы);
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры

Короче .. ругается...

Автор: Flexy 15.06.17, 15:43

Попробуйте так:

КоллекцияОкон = ПолучитьОкна();
    Для Каждого Окно Из КоллекцияОкон Цикл
        КоллекцияСодержимое = Окно.ПолучитьСодержимое();
                Если КоллекцияСодержимое = Неопределено Тогда
                       Продолжить;
                КонецЕсли;
        Для Каждого Содержимое Из КоллекцияСодержимое Цикл
            Сообщить(Содержимое.ИмяФормы);
        КонецЦикла;
    КонецЦикла;

Автор: sava1 15.06.17, 15:48

Для Каждого Окно Из Окна Цикл
    Если Не Окно.Основное Тогда
       // Форма = Окно.ПолучитьСодержимое();
       // Форма.Закрыть();
    КонецЕсли;
КонецЦикла;

Автор: Gigi 15.06.17, 15:53

Flexy @ Сегодня, 16:43 * ,
Так я тоже уже пробовал:
Через "ПолучитьСодержимое();"
Пишет:

Цитата
{Справочник.ТОЧКА.Форма.ФормаЭлемента.Форма(45)}: Ошибка при установке значения атрибута контекста (Окно)
Для Каждого Окно Из КоллекцияОкон Цикл
по причине:
Несоответствие типов

Пока даже так не хочет

Gigi @ Сегодня, 16:48 * ,
КоллекцияОкон = ПолучитьОкна();
Для Каждого Окно Из КоллекцияОкон Цикл
    Если Не Окно.Основное Тогда
        Сообщить("!!");
       // Форма = Окно.ПолучитьСодержимое();
       // Форма.Закрыть();
    КонецЕсли;
КонецЦикла;

И так тоже пишет то же самое
Никак не получается блин!

Автор: sava1 15.06.17, 15:55

У основного окна нет содержимого.

Какую форму хотите получить? списка, элемента..

Автор: Gigi 15.06.17, 15:56

sava1 @ Сегодня, 16:54 * ,

Цитата(sava1 @ 15.06.17, 16:54) *
У основного окна нет содержимого.

Открываемое окно должно быть пустым. А форма с которой она должна быть открыта содержит данные.
Основное окно (т.е. самое верхнее и последнее) не содержит данные
Получить надо ФормуОбъекта, но что бы она определяла, открыта ли та форма с которой ее запустили.

Автор: logist 15.06.17, 16:23

Цитата(Gigi @ 15.06.17, 16:56) *
открыта ли та форма с которой ее запустили.

У формы есть свойство Владелец, оно содержит данные о форме из которой была открыта текущая форма.

Автор: Gigi 15.06.17, 16:33

Всем привет!
Уважаемые специалисты. не подскажете как получить список всех открытых управляемых Форм на клиенте для 1С 8.2?
Пожалуйста на примере кода если можно.
Буду признателен!


Gigi @ Сегодня, 16:27 * ,
Нарыл вот такое решение:

 Процедура СписокОткрытыхФорм() Экспорт
Для Каждого Справочник Из Метаданные.Справочники Цикл
   Для Каждого ТекФорма Из Справочник.Формы Цикл
       Форма = Справочники[Справочник.Имя].ПолучитьФорму(ТекФорма.Имя);
       Если Форма.Открыта() Тогда
           Сообщить(Справочник.Имя + " " + ТекФорма.Имя);
       КонецЕсли;
   КонецЦикла;
КонецЦикла;
КонецПроцедуры

Гуууу... тоже НЕ РАБОТАЕТ!

Автор: Gigi 15.06.17, 16:29

logist @ Сегодня, 16:23 * ,
Это я знаю, но сделать через "Владелец" просто так не совсем устраивает.
Ладно перехожу к новой теме и формулирую тему иначе:
Вот так:
http://pro1c.org.ua/index.php?showtopic=37919
Буду признателен:

Автор: logist 15.06.17, 16:37

Цитата(Gigi @ 15.06.17, 17:29) *
Ладно перехожу к новой теме и формулирую тему иначе:

Не надо.

Цитата(Gigi @ 15.06.17, 17:29) *
но сделать через "Владелец" просто так не совсем устраивает.

Почему не устраивает?

Автор: Gigi 15.06.17, 16:50

Gigi @ Сегодня, 16:29 * ,
Хотя продолжая данную тему, а что если в перечислении создать элемент "ДаНет" с двумя значениями: Да/Нет
И вставить реквизит со ссылкой на этот элемент перечисления в нужную форму.
И таким образом регистрировать ПриОткрытии (Да) ПриЗакритии(Нет)
Это конечно изврат но все таки... как будет работать?


Цитата(logist @ 15.06.17, 16:37) *
Почему не устраивает?

Боковая панель навигации, которая появляться когда делаешь через Владелец. В моем случае думаю она совсем не нужна.
Мне просто нужно установить обмен данными между двумя справочниками без использования Владелец-подчиненный
А то "владелец", "родитель! Хорошо что еще бабушки и дедушки нет! smile.gifsmile.gif

Автор: Petre 15.06.17, 16:56

Цитата(Gigi @ 15.06.17, 17:50) *
Боковая панель навигации, которая появляться когда делаешь через Владелец

О чем это вы?

Автор: logist 15.06.17, 16:57

Цитата(Petre @ 15.06.17, 17:56) *
О чем это вы?

+1. Перечитал тему, как обычно не понял в чем задача, как обычно рискну предположить что она решается намного проще, чем вы тут изобретаете.

Автор: Gigi 15.06.17, 16:59

Цитата(Gigi @ 15.06.17, 16:50) *
Это конечно изврат но все таки... как будет работать?

Так что, возвращаясь к такому решению вопрос.
Такое решение не опасно?
Ведь на клиенте пользователей будет несколько.
И вообще наСервере на клиенте. Последнее означает ли то, что событие смены параметра будет иметь отношение только к компьютеру одного пользователя?

Автор: logist 15.06.17, 17:05

Цитата(Gigi @ 15.06.17, 17:59) *
Такое решение не опасно?

Это вообще не решение а шопопало

Автор: Gigi 15.06.17, 17:09

Цитата(Petre @ 15.06.17, 16:56) *
О чем это вы?


Нужно без этого

Gigi @ Сегодня, 17:06 * ,
Мне нужно просто установить обмен данными между справочниками ПО СВОЕМУ УСМОТРЕНИЮ!
Без использования Владелец.
Ладно! Видимо это невозможно!

Автор: sava1 15.06.17, 17:15

Цитата(Gigi @ 15.06.17, 17:59) *
на клиенте пользователей будет несколько


Они в очереди будут стоять?

Автор: Gigi 15.06.17, 17:24

sava1 @ Сегодня, 17:15 * ,

Цитата(sava1 @ 15.06.17, 17:15) *
Они в очереди будут стоять?

Не понял при чем очередь..
Просто дело в том, что на пример один пользователь открыл форму, и параметр из перечисления на форме стал "да". т.е. форма отрыта.
И в это самое время, вдруг бац и другой на другом компе закрыл эту форму пока у первого не закрыта и параметр стал "нет".
Иными словами повлияет ли все это негативно... не будет ли коллапс.
В таком случае нужно, что бы параметры открытости или закрытости формы работали только для одного компа.
И вопрос... решает ли этот вопрос такое решение:
Цитата(Gigi @ 15.06.17, 16:50) *
Хотя продолжая данную тему, а что если в перечислении создать элемент "ДаНет" с двумя значениями: Да/Нет
И вставить реквизит со ссылкой на этот элемент перечисления в нужную форму.
И таким образом регистрировать ПриОткрытии (Да) ПриЗакритии(Нет)
Это конечно изврат но все таки... как будет работать?

Автор: sava1 15.06.17, 17:30

Цитата(Gigi @ 15.06.17, 18:24) *
один пользователь отрыл форму, и параметр из перечисления на форме стал "да". т.е. форма отрыта.
И в это самое время, вдруг бац и другой на другом компе закрыл эту форму пока у первого не закрыта


Вы вооще понимаете принцып асинхронных вызовов и работу клиент-сервера?
Вы никогда не найдете открытые формы , кроме своих.

Автор: Gigi 15.06.17, 19:54

sava1 @ Сегодня, 17:30 * ,

Цитата(sava1 @ 15.06.17, 17:30) *
Вы вооще понимаете принцып асинхронных вызовов и работу клиент-сервера?
Вы никогда не найдете открытые формы , кроме своих.


Ну да... вообще как все работает в этом слабо... признаюсь.
просто разбираться в принципе работ и вдаваться во все это на это пока нет времени. Надо заканчивать то. что затянулось.
Все это ..... это уже отдельная история. Это надо сесть и во всем шаг за шагом доскональна разобраться.
А пока надо просто срочно сделать работу и успеть пока директор в отпуске. Что бы предложить практичный и работающий вариант разработки.
Хотя и написанный на очень грубом языке.
Мне просто нужно просто где то обозначить то, что указанная форма открыта и то, что форма закрыта
Если я события открытия и закрытия формы запишу на сервер, то как мне думается получиться чехорда.
Потому, что как мне понимается сервер ведь общего доступа. А клиент индивидуального. И каждый пользователь будет влиять на запись Да или Нет.
Блиин! Я уже думаю, может с каждым открытием формы создавать какой-нибудь блокнот с именем :"достало уже учиться" ... и с закрытием его удалять.
И так и дать понять машине указанная форма открыта или закрыта.
Вот до такого извращения уже дохожу.
Не мог бы кто подсказать что нибудь получше, чем этот ужас?
Мне просто нужно обозначить одно единственное!
ОТКРЫТА ЛИ УКАЗАННАЯ ФОРМА?
Всего лишь

Автор: Gigi 16.06.17, 9:19

Gigi @ Вчера, 19:54 * ,
Уже решил вопрос.
Не знаю настолько вяжется но вроде, нормально работает! Без какого либо сбоя.
Вот в таком формате:

//########## МОДУЛЬ ФОРМЫ ЭЛЕМЕНТА СПРАВОЧНИКА: "ОБЪЕКТ" ##########
//Кнопка в форме справочника "ОБЪЕКТ" в командной панели динамического списка Справочника "ТОЧКА"
&НаКлиенте
Процедура Кнопка_ДобавитьТочкуУчета(Команда)
//===========================================
Если Объект.Код = ""  Тогда
Предупреждение("Для определения точек учета объект не сохранен!");
Перейти ~Выход;
КонецЕсли;
//===========================================
Форма_ТОЧКА = ПолучитьФорму("Справочник.ТОЧКА.ФормаОбъекта", новый Структура("Ключ", ,,ЭтаФорма));
//===========================================
ЭлементОбъекта=SubFx_СерверПойскЗапись.ПолучитьЭлементОбъектаПоКодуНомеру("Справочники","ОБЪЕКТ",Объект.Код); //функция из обшего модуля для получающая объект по коду/номеру
Форма_ТОЧКА.Объект.БалансоваяПринадлежность=ЭлементОбъекта; // Линия присваивания  реквизиту справочника ТОЧКА в данном случае с именем: "БалансоваяПринадлежность"
//===========================================
Форма_ТОЧКА.ОткрытьМодально();
//===========================================
Отобор_ТочкиУчета(); //Процедура отбора динамического списка справочника: "ТОЧКА" с увязкой их балансовой принадлежности.
~Выход:;
КонецПроцедуры

//########## МОДУЛЬ ФОРМЫ ЭЛЕМЕНТА СПРАВОЧНИКА: "ТОЧКА" ##########
&НаКлиенте
Процедура ПриОткрытии(Отказ)
//===================================================
Если Объект.Код="" и Объект.БалансоваяПринадлежность.Пустая() тогда
стрПредупреждение="Данный способ обычного создания новой учетной точки НЕ РЕКОМЕНДУЕТСЯ!
|Так как при нем нужно в ручном режиме указывать некоторые парамметры учетной точки. От которых зависит правильный учет данных!
|Что бы нужные для учета параметры устанавливались автоматический, новую учетную точку необходимо создавать ТОЛЬКО В ФОРМЕ ОБЪЕКТА!
|-----------------------------------------------------------------------------
|Открыть форму создания новой учетной точки?";
    Если Вопрос(стрПредупреждение,РежимДиалогаВопрос.ДаНет,,,"Создение точки учета обычным путем")=КодВозвратаДиалога.Да Тогда
    Иначе
    Отказ = Истина;
    КонецЕсли;        
КонецЕсли;
//===================================================
КонецПроцедуры

Вот собственно все что нужно было для преследуемой простой цели.
А что касается Владелец..Подчиненный.. Родитель... сынок и т.д.
Все это конечно очень хорошо и удобно. Но не всегда.
Как мне самому думается, владелец-подчиненный очень удобен, когда у одного справочника много справочников в подчинении ... пять шесть или двадцать.
Тогда та самая боковая панель навигации нужна и очень удобна.
Но в моем случае, речь всего лишь об одном владельце и подчиненном. А эта боковая панель ничему для всего лишь одной строки с боку.
В таком случае удобнее, роль этой строки перенести в группы(вкладки) с динамическим списком с нужными отбором.
Понятное дело, что это не совсем по стандарту, но лично для меня это НЕ АРГУМЕНТ!
Потому, что важно не то по стандарту или нет, а только то как удобнее пользоваться. Вот что важнее..
я почему все это говорю.
На эту тему ... в другой рубрике:
http://pro1c.org.ua/topic/avto-zapis-dannyh-na-server-dlya-rekvizita-ssylka-37549/?hl=
я был понят не правильно. и спор так затянулся, что наверно владелец сайта подумал.... когда они закончат эту свою болтовню smile.gifsmile.gif
На этот раз думаю буду правильно понят.
Вот собственно и все
Ладно! В любом случае спасибо Всем!














Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua