Всем доброго времени суток! Столкнулся с проблемой, вроде простая задача но не могу найти нигде решения, как только не писал в поиске. В общем есть самописная конфигурация, управляемое приложение, без БСП. В конфигурации есть встроенная обработка. Вопрос: как в пределах текущего пользователя запретить повторное открытие обработки. Т.е. если открыли основную форму, то при повторном открытии что бы происходила активация первой обработки и все, ну или вообще что бы ничего не происходило. На данный момент обработку можно открыть сколько угодно раз и пользователь начинает путаться. Заранее спасибо!
---
А свойств там нет нет толком никаких, имени формы там нет
```1c
    Для Каждого ОткрытоеОкно Из ПолучитьОкна() Цикл
    Для Каждого Форма Из ОткрытоеОкно.Содержимое Цикл

    ПолноеИмяФормы = Форма.ИмяФормы;

    КонецЦикла;
    КонецЦикла;
```
 Про ключевые параметры формы так ничего и не ответили. Если они присутствуют, то ключ уникальности не поможет.
---
Спасибо! Остановился на предложенном Вами способе:

```1c
    &НаСервере
    Функция ПолноеИмяОбработки() Экспорт
    Результат = РеквизитФормыВЗначение("Объект").Метаданные().ПолноеИмя();

    Возврат Результат;
    КонецФункции

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

    //...
    КонецПроцедуры
```

Поиск по полному имени формы вполне себе годный, но громоздкий, но зато можно не делать общую команду, кроме того открытие с уникальностью через общую команду все равно, почему то, нихрена не работает, ну или я чего то не понимаю...
---
Как открывается обработка? В общем случае и должна открываться всегда одна форма для встроенной обработки.
---
Открывается просто из интерфейса
---
Возможно, форма обработки имеет ключевые параметры, которые меняются в процессе работы с ней.
---
2 простых способа - писать в файл, писать в РС маркер открытия.
---
задача интересная, только вопрос. если пользователь открыл обработку, зачем ему еще раз ее открывать если она открыта либо свернута.
пользователь забывает что ее открыл до этого?)))
---
Да, менно так
---
Событие есть "ПриПовторномОткрытии()" как вариант?
---
ОкнаКлиентскогоПриложения (ClientApplicationWindows)
Элементы коллекции:
ОкноКлиентскогоПриложения
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются элементы коллекции.
Возможно обращение к элементу коллекции посредством оператора [...]. В качестве аргумента передается индекс (нумерация с 0).
Методы:
Количество (Count)
Получить (Get)
Описание:
Коллекция содержит объекты типа ОкноКлиентскогоПриложения: все главные окна приложения, окна форм и документов. В коллекцию не входят модальные окна сообщений, подсказки и другие служебные окна.
Коллекция формируется автоматически и не имеет методов добавления или удаления.
---
При повторном открытии можно смотреть, есть ли такое окно
---
Спасибо за наводку, сейчас посмотрю!
---
В открытии общей командой всё решается очень просто:

```1c
    //Открывает то же самое окно
    ОткрытьФорму("Отчет.АнализСубконто.Форма", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник,
    ПараметрыВыполненияКоманды.Уникальность,
    ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка);
    //Открывает новое окно
    ОткрытьФорму("Отчет.АнализСубконто.Форма", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник,
    Истина,
    ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка);
```

Найдите 10 отличий...

З.Ы. 4-й параметр "Уникальность"
---
Не использую открыть форму. Хотя можно сделать общую команду, там присваивать ключ уникальности при открытии и в интерфейс выводить общую команду, а не саму обработку. Можно попробовать, но думал в 1С это как то по проще делается. В обычных формах вроде можно было менять уникальный идентификатор перед открытием и все работало, а тут херня какая то
---
Как бы, и не обязательно общей командой делать. В методах открытия формы обработки захардкодить эту Уникальность каким-нить УИДом или строкой типа "форма обработки Обработка1" - и все...
---
Можно по подробнее, как форме при открытии присвоить свой гуид? Поле УникальныйИдентификатор не доступно для записи. КлючУникальности при открытии устанавливаю, но это никак не влияет на повторное открытие, а при создании на сервере это свойство не доступно.
---
может при помощи ПолучитьОкна(), потом цикле перебрать из и активировать если уже открыто
---
Мне кажется "костылем" каким то. Просто по какому полю искать? Как по мне то в этом случае можно привязаться только к заголовку, но ваще фигня какая то, а не дай боже заголовок совпадет с другим окном, хоть и мало вероятно, но как то коряво. Не понятно почему разработчики в свойства окна не добавили какое то поле которой можно менять или не вывели туда ключ уникальности который можно менять
---
конечно костыль)
Не помню точно, но там имя формы должно быть, по нему и искать.

В идеале выше написали - можно создать команду, например общую, и открывать только при помощи нее. В интерфейс вывести открытие обработки только через команду, остальное убрать.
---
Да тоже подумал про общую команду. А свойств там нет нет толком никаких, имени формы там нет
---
А свойств там нет нет толком никаких, имени формы там нет
```1c
    Для Каждого ОткрытоеОкно Из ПолучитьОкна() Цикл
    Для Каждого Форма Из ОткрытоеОкно.Содержимое Цикл

    ПолноеИмяФормы = Форма.ИмяФормы;

    КонецЦикла;
    КонецЦикла;
```
 Про ключевые параметры формы так ничего и не ответили. Если они присутствуют, то ключ уникальности не поможет.
---
Аааа, вон оно как надо. Про ключевые параметры не понял вопроса
---
Вкладка Параметры в окне редактора формы.
---
Спасибо! Остановился на предложенном Вами способе:

```1c
    &НаСервере
    Функция ПолноеИмяОбработки() Экспорт
    Результат = РеквизитФормыВЗначение("Объект").Метаданные().ПолноеИмя();

    Возврат Результат;
    КонецФункции

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

    //...
    КонецПроцедуры
```

Поиск по полному имени формы вполне себе годный, но громоздкий, но зато можно не делать общую команду, кроме того открытие с уникальностью через общую команду все равно, почему то, нихрена не работает, ну или я чего то не понимаю...
---
Если Форма.ИмяФормы = ИмяФормыОбработки Тогда Тогда уж проще
```1c
    Если Форма.ИмяФормы = ИмяФормы Тогда
```
---
Спасибо БОЛЬШОЕ! :)
---
тоже столкнулся с такой задачей и также открывались новые окна хотя задана уникальность при открытии формы.

```1c
    ОткрытьФорму("Отчет.АнализСубконто.Форма", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник,
    ПараметрыВыполненияКоманды.Уникальность,
    ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка);
```

Все дело было в параметре формы "РежимОткрытияОкна" - если "РежимОткрытияОкна= Независимый" все отрабатывает отлично, не нужно делать общую команду, достаточно создать команду в обработке.
---
Нет-нет, форме ничего не нужно присваивать. Просто нужно придумать нечто достаточно уникальное и передавать в параметр Уникальность в методе ОткрытьФорму. Как вариант этого уникального, сгенерировать какой-нибудь УИД и статично хардкодом прописать его значение в методе открытия формы.
---
Поискал в УНФ насчет ПолучитьОкна() - там именно так корзина сделана. Ищутся уже открытые формы заказов и предлагает потом выбрать любою из форм для до заполнения. В вашем случае это костыль конечно, но тоже решение.
---
Что за "дичь"? Сделал общую команду. В модуле команды код:

ПараметрыФормы = Новый Структура("", );
ОткрытьФорму("Обработка.урв_МастерПодключения.Форма", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, "51790fe8-8c72-11e6-a97a-902b3472f9b0", ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка);

Ну то есть задал уникальность в явном виде и все равно открывается не меренное количество раз обработка. Что я делаю не так? В справке написано:

<Уникальность> (необязательный)
Тип: Произвольный.
В данном параметре может быть задан некоторый ключ, значение которого будет использоваться для поиска уже открытых форм. Если будет найдена форма с таким же ключом уникальности, вместо открытия новой формы будет активизирована найденная форма.
Ложь - искать форму с ключом уникальности по умолчанию, Истина - не искать форму вообще, любое другое значение устанавливает ключ уникальности, по которому будет произведен поиск.
Значение по умолчанию: Ложь.
---
```1c
    //Открывает то же самое окно
    ОткрытьФорму("Отчет.АнализСубконто.Форма", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник,
    ПараметрыВыполненияКоманды.Уникальность,
    ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка);
```
---
Изначально было так, не работает
---
Замени "51790fe8-8c72-11e6-a97a-902b3472f9b0" на Новый УникальныйИдентификатор("51790fe8-8c72-11e6-a97a-902b3472f9b0") и будет счастье
---
Нет, не работает, открывает сколько угодно копий, кроме того в справке сказано, что тип произвольный и ничего не сказано про УИД
---
Вот текущий код команды;

```1c
    &НаКлиенте
    Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    ПараметрыФормы = Новый Структура(", );
    ОткрытьФорму("Обработка.ОбработкаМастера.Форма", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, Новый УникальныйИдентификатор("51790fe8-8c72-11e6-a97a-902b3472f9b0"), ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка);
    КонецПроцедуры
```

Обработка все равно открывается сколько угодно раз. Может кто нибудь ответить что не так или на какие формы распространяется уникальность? Или как вообще этим механизмом пользоваться?
---
Ещё раз: вы должны исходить из того, что форма встроенной обработки по умолчанию должна открываться всегда в одном экземпляре. Если код
```1c
    ОткрытьФорму("Обработка.ОбработкаМастера.Форма")
```
 всегда открывает новый экземпляр, то никакие танцы вокруг ключа уникальности в параметрах этого метода не помогут – проблема в модуле самой формы. Вариантов может быть несколько: либо в модуле формы меняется КлючУникальности, либо устанавливаются ключевые параметры формы, либо вовсе ПриОткрытии программно открывается другая форма.
---
Вариантов может быть несколько: либо в модуле формы меняется КлючУникальности, либо устанавливаются ключевые параметры формы, либо вовсе ПриОткрытии программно открывается другая форма.
Так, я думал что галочка "Ключевой параметр" ставится, что бы этот параметр был доступен не только на сервере, но и на клиенте. Ключевые параметры как то влияют на уникальность формы что ли?
---
Да, там в описании об этом сказано.
---
Эээээм, спасибо. Я ахреневаю... Сколько читал про эту галку, нигде об этом ничего не говорилось. Еще думаю какого черта такое название галки, если все ее используют вообще не в контексте уникальности.
---
Удачно натолкнулась на обсуждение, как раз такой же вопрос возник
---
```1c
    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
    Для Каждого ЧужОкно Из ПолучитьОкна() Цикл
    Для Каждого ЧужФорма Из ЧужОкно.Содержимое Цикл
    Если (ЧужФорма.ИмяФормы = Этаформа.ИмяФормы) Тогда
    ЧужФорма.Активизировать(); Отказ = Истина; Возврат;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    ...
    КонецПроцедуры
```