- Открытие форм
- 1С. Тематические записки. им xzorkiix
- Поиск по этому блогу
- ОткрытьФорму и «ничего не происходит»
- Вводная
- Теперь немного больше деталей.
- Решение
- Ещё немного
- Не срабатывает ОткрытьФорму().
- веб-клиент. ОткрытьФорму() в ПриОткрытии
- 1С. Тематические записки. им xzorkiix
- Поиск по этому блогу
- ОткрытьФорму и «ничего не происходит»
- Вводная
- Теперь немного больше деталей.
- Решение
- Ещё немного
Открытие форм
Область применения: управляемое приложение, мобильное приложение.
1. Для открытия форм следует применять метод глобального контекста ОткрытьФорму (при использовании версии платформы 1С:Предприятие 8.2 и более ранних версий — также ОткрытьФормуМодально ). Применение альтернативного способа, с получением формы и ее последующим открытием с помощью метода ПолучитьФорму , не рекомендуется.
Рекомендация обусловлена соображениями
- повышения устойчивости кода, работающего с формой, за счет разделения программного интерфейса для работы с формой и деталей ее внутренней реализации,
- а также сохранения единой стилистики кода прикладных решений.
Кроме того, применение глобального метода ОткрытьФорму гарантирует выполнение инициализации формы на сервере в обработчике ПриСозданииНаСервере . Этот подход помогает сосредоточить весь код инициализации формы в одном месте и исключает «случайное» обращение к серверу, связанное с инициализацией формы, между строками кода
2. В случаях когда форма требует параметризации при открытии, все ее параметры следует указывать в наборе параметров формы. Таким образом, набор параметров формы декларативно описывает возможности формы по ее параметризации.
Параметры формы из этого набора могут быть указаны в вызывающем коде при открытии формы ( ОткрытьФорму ).
3. Не следует применять другие способы параметризации формы при открытии. Например, нужно избегать обращения к методам и свойствам формы после ее открытия.
Например, вместо
ФормаПутеводитель = Форма.ОткрытьФорму(«ОбщаяФорма.ПутеводительПоСистеме»);
ФормаПутеводитель.Элементы.ГруппаШаг.ТекущаяСтраница = ФормаПутеводитель.Элементы.ГруппаШаг.Страницы.Приветствие;
следует по той же причине использовать параметры формы:
ОткрытьФорму(«ОбщаяФорма.ПутеводительПоСистеме», Новый Структура(«РежимОткрытия», «Приветствие»));
4. Для получения результата работы формы, вместо непосредственного обращения к элементам и реквизитам формы
ФормаВопроса = ПолучитьФорму(«ОбщаяФорма.ФормаВопроса»);
ФормаВопроса.ОткрытьМодально();
Если ФормаВопроса.БольшеНеПоказыватьНапоминание Тогда
// …
следует использовать процедуры-обработчики оповещений, которые будут вызваны при завершении работы пользователя с формой:
Оповещение = Новый ОписаниеОповещения(«БольшеНеПоказыватьНапоминаниеЗавершение», ЭтотОбъект);
ОткрытьФорму(«ОбщаяФорма.ФормаВопроса». Оповещение, РежимОткрытияОкнаФормы.БлокироватьВеcьИнтерфейс);
.
&НаКлиенте
Процедура БольшеНеПоказыватьНапоминаниеЗавершение(БольшеНеПоказыватьНапоминание, Параметры) Экспорт
Если БольшеНеПоказыватьНапоминание = Неопределено Тогда
Возврат;
КонецЕсли;
Если БольшеНеПоказыватьНапоминание Тогда
// …
При этом возвращаемое значение формы формируется в коде модуля формы с помощью метода формы Закрыть .
5. Другие ограничения:
- Обработчик события формы ПриОткрытии не должен содержать код по открытию какой-либо другой формы, так как это может привести к нарушению порядка отображения окон. В этом случае рекомендуется использовать обработчик ожидания на короткий интервал или открывать другие формы интерактивно, например, по нажатию на кнопку.
- Не рекомендуется выполнять программное открытие и закрытие формы в одном обработчике. Такие действия должны быть разнесены по времени. Например, закрытие формы можно выполнять в обработчике ожидания.
- При использовании в конфигурации Библиотека стандартных подсистем и разработке форм (рабочих мест), предназначенных только для внешних пользователей, следует явно блокировать открытие таких форм в сеансах «обычных» пользователей. Для этого следует устанавливать параметр Отказ при создании формы на сервере с помощью функции ЭтоСеансВнешнегоПользователя общего модуля Пользователи или ПользователиКлиент :
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Не ПользователиКлиентСервер.ЭтоСеансВнешнегоПользователя() Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
…
КонецПроцедуры
6. Следующие виды форм должны быть всегда доступны пользователю в режиме 1С:Предприятия из меню «Все функции» вне зависимости от того, размещены ли соответствующие объекты в командном интерфейсе приложения или нет:
Источник
1С. Тематические записки. им xzorkiix
Поиск по этому блогу
ОткрытьФорму и «ничего не происходит»
Вводная
перешли с 8.3.11 на 8.3.12 после отключения совместимости фрагмент кода ниже перестал открывать требуемую форму из другой (справедливо для клиент-серверного варианта проверить файловый вариант ИБ не было возможности)
Теперь немного больше деталей.
Для справочника ДоговорыКонтрагентов реализовано переопределение формы в обработчике получения формы
Решение
Включение в параметры Уникальность = Истина. Возвращает нас к исходному поведению (требуемая форма открывается).
Дальше теории конспирологов (когда сколько бы ты не знал, это только догадки).
Что у нас произошло:
По умолчанию Уникальность = Ложь, те форма не уникальная и сначала попытаться найти среди открытых.
1. мы создали интерактивно новый элемент
2. платформа открывает для него форму по-умолчанию ( Справочник.ДоговорыКонтрагентов.ФормаОбъекта, Владелец)
3. мы переопределяем форму в обработчике получения формы
4 . платформа кеширует ФормаОбъекта+Владелец = форма из п.3 (точнее любая форма какую вернет сервер)
5. Мы программно открывает форму ФормаОбъекта+тот же Владелец — платформа нашла по этим ключам форму из п.2 (тот же набор ключей). Так как форма уже открыта, мы интерактивно не ощущаем каких либо изменений и считаем что открытие формы «не работает».
Ещё немного
Фрагмент справки 8.3.11.2954 идентичен фрагменту справки 8.3.12.1529, 8.3.12.1616
(необязательный)
Тип: Произвольный.
В данном параметре может быть задан некоторый ключ, значение которого будет использоваться для поиска уже открытых форм. Если будет найдена форма с таким же ключом уникальности, вместо открытия новой формы будет активизирована найденная форма.
Ложь — искать форму с ключом уникальности по умолчанию , Истина — не искать форму вообще, любое другое значение устанавливает ключ уникальности, по которому будет произведен поиск.
Значение по умолчанию: Ложь.
Для варианта «По названию» параметры вызова аналогичны параметрам метода ПолучитьФорму.
Обычные формы внешних обработок не поддерживаются.
В управляемом приложении не следует выполнять программное открытие и закрытие одной и той же формы в одном вызове встроенного языка.
Если при открытии обычной формы в параметре указано не стандартное имя формы, передаваемые параметры не обрабатываются.
В процессе выполнения может быть несколько обращений к серверу. Часть из них кэшируются. Как минимум одно обращение к серверу есть всегда и оно не кэшируется. Кэширование зависит от версии платформы и версии конфигурации в целом. Если установлена низкая скорость соединения и не указывается текущая строка, то кэшируется форма выбора. Очистка кэша осуществляется с периодичностью в 20 мин. Удаляются формы, которые не использовались в этот период времени
Из описания ОткрытьФорму() трудно сделать выводы об явном изменении в поведении платформы, скорее всего было исправлено\оптимизировано ранее существовавшее допущение. Скорее всего изменилась обработка Уникального пользовательского ключа и поиска формы по нему, в 8.3.11 пустое значение — не сопоставляется при поиске среди открытых форм, то в 8.3.12 — пустое значение, тоже значение. Напомню в режиме «совместимости с 8.3.11» в 8.3.12 — форма открывается и с Уникальность = Ложь (значение по умолчанию, если верить документации оно — Ложь).
Так же о многом говорит — ничего не говоря конкретно — расплывчатая формулировка » Кэширование зависит от версии платформы и версии конфигурации в целом.»
Источник
Не срабатывает ОткрытьФорму().
В глобальном в процедуре ПриНачалеРаботыСистемы() пишу вот так:
| Код |
|---|
| Показать полностью |
В отладчике ОткрытьФормуМодально(«Обработка.ПервыйЗапуск», 1) = 0.
Форма не открывается, обработка не выполняется. Даже если просто написать безо всяких проверок
| Код |
|---|
| Показать полностью |
все равно не открывается и не отрабатывает.
В стандартной конфе почему-то работает. Код содрал оттуда, все равно результат = 0. Почему?
Да не, там все нормально:
| Код |
|---|
| Показать полностью |
Я ж говорю:
В отладчике ОткрытьФормуМодально(«Обработка.ПервыйЗапуск», 1) = 0.
Когда отладчик на первой строке процедуры ПриОткрытии() в обработке, до туда даже не доходит. Вопрос туда был вставлен просто так, для теста.
Создал пустую конфигурацию, в ГМ добавил
| Код |
|---|
| Показать полностью |
в обработку «первыйзапуск» твой код.
У меня все нормально, видимо у тебя что-то еще мешает, да и тоже:
ОткрытьФормуМодально(«Обработка.ПервыйЗапуск», 1) = 0
Вот глобальный:
| Код |
|---|
| Показать полностью |
А вот обработка:
| Код |
|---|
| Показать полностью |
И тишина.
Если СтатусВозврата() установлен в 0, открытия формы не произойдёт!
azernot Написал:
——————————————————-
> //*******************************************
> Процедура ПриОткрытии() //предопределенная
> СтатусВозврата(0);
>
>
> Если СтатусВозврата() установлен в 0, открытия
> формы не произойдёт!
>
>
> С уважением,
> Зернятко А.В.
Да, но предупреждение должн сработать
Источник
веб-клиент. ОткрытьФорму() в ПриОткрытии
Есть обработка. В ней основной назначена некая сервисная форма, у которой в ПриОткрытии проверяется какую форму открыть и выполняется открытие.
Код простой (это в сервисной форме):
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ДоступПользователя = ПроверитьПользователяНаДоступ();
Если ДоступПользователя = «Количество» Тогда
ОткрытьФорму(«Обработка.ОценкаКачества.Форма.УправляемаяФормаКоличество»);
.
В веб-клиенте получаю сообщение «Использование модальных окон в данном режиме запрещено»
В СП про ОткрытьФорму прочитал все много раз. Нигде про модальность нет. В конфигурации даже включил режим использования модальности. Не помогает.
Есть идеи, как побороть?
(2) Через глубочайшие гланды здесь конкретно вот это:
Рады были помочь, приходите еще.
(0) Да и про СП ты нап. обманул:
(2) Открывать левую форму чтобы открыть другую это и есть через гланды, когда существует событие специально для этого. Экономия серверных вызовов хотя бы.
А по поводу ошибки — ищи отладчиком модальный вызов. Может быть он и тут «ПроверитьПользователяНаДоступ();» сидит.
Тип: Строка.
Имя стандартной формы.
Тип: Структура.
Содержит имя открываемой формы или объект метаданных Форма.
Если значение параметра изменено, то будет осуществлен поиск формы в пределах объекта, для которого открывается форма.
Тип: Структура.
Дополнительная информация открытия формы.
Структура, содержащая поле ПовторноеИспользование (Reuse) типа Булево, которое указывает, кешируется ли форма на стороне клиента.
Тип: Булево.
В данный параметр передается признак выполнения стандартной (системной) обработки события. Если в теле процедуры-обработчика установить данному параметру значение Ложь, стандартная обработка события производиться не будет (выбираются установленные разработчиком форма и параметры).
Значение по умолчанию: Истина.
Описание:
Обработчик события вызывается на сервере при получении стандартной управляемой формы.
Если требуется переопределить выбор открываемой формы, необходимо установить в параметре другое имя формы или объект метаданных формы, которую требуется открыть, и в параметре установить значение Ложь.
Замечание:
Безопасный режим на время исполнения данного обработчика будет отключен. Данное замечание не относится к обработчикам событий, расположенным в расширении конфигурации.
(2) В интерфейсе у тебя должна быть кнопка или ссылка для открытия формы. Сейчас она скорее всего прицеплена к стандартному обработчику открытия формы, поэтому открывается форма обработки по умолчанию. Замены эту кнопку/ссылку на кнопку команды. В модуле команды определяй, какая форма нужна, и открывай сразу ее.
Или если все-таки через гланды хочется, то открывай из формы обработки по умолчанию, но не в процедуре ПриОткрытии. В процедуре ПриОткрытии запускай однократно обработчик ожидания с периодом 0.1 сек., открывай в нем нужную форму, а основную форму закрывай.
немного апну:
Самое смешное, что ОбработкаПолученияФормы в вебклиенте не отрабатывает.
в тонком клиенте — ок. в вебклиенте — фигу.
Повторю вопрос: как в вебклиенте переопределить открываемую форму обработки. Переход к обработке происходит по внешней ссылки.
Источник
1С. Тематические записки. им xzorkiix
Поиск по этому блогу
ОткрытьФорму и «ничего не происходит»
Вводная
перешли с 8.3.11 на 8.3.12 после отключения совместимости фрагмент кода ниже перестал открывать требуемую форму из другой (справедливо для клиент-серверного варианта проверить файловый вариант ИБ не было возможности)
Теперь немного больше деталей.
Для справочника ДоговорыКонтрагентов реализовано переопределение формы в обработчике получения формы
Решение
Включение в параметры Уникальность = Истина. Возвращает нас к исходному поведению (требуемая форма открывается).
Дальше теории конспирологов (когда сколько бы ты не знал, это только догадки).
Что у нас произошло:
По умолчанию Уникальность = Ложь, те форма не уникальная и сначала попытаться найти среди открытых.
1. мы создали интерактивно новый элемент
2. платформа открывает для него форму по-умолчанию ( Справочник.ДоговорыКонтрагентов.ФормаОбъекта, Владелец)
3. мы переопределяем форму в обработчике получения формы
4 . платформа кеширует ФормаОбъекта+Владелец = форма из п.3 (точнее любая форма какую вернет сервер)
5. Мы программно открывает форму ФормаОбъекта+тот же Владелец — платформа нашла по этим ключам форму из п.2 (тот же набор ключей). Так как форма уже открыта, мы интерактивно не ощущаем каких либо изменений и считаем что открытие формы «не работает».
Ещё немного
Фрагмент справки 8.3.11.2954 идентичен фрагменту справки 8.3.12.1529, 8.3.12.1616
(необязательный)
Тип: Произвольный.
В данном параметре может быть задан некоторый ключ, значение которого будет использоваться для поиска уже открытых форм. Если будет найдена форма с таким же ключом уникальности, вместо открытия новой формы будет активизирована найденная форма.
Ложь — искать форму с ключом уникальности по умолчанию , Истина — не искать форму вообще, любое другое значение устанавливает ключ уникальности, по которому будет произведен поиск.
Значение по умолчанию: Ложь.
Для варианта «По названию» параметры вызова аналогичны параметрам метода ПолучитьФорму.
Обычные формы внешних обработок не поддерживаются.
В управляемом приложении не следует выполнять программное открытие и закрытие одной и той же формы в одном вызове встроенного языка.
Если при открытии обычной формы в параметре указано не стандартное имя формы, передаваемые параметры не обрабатываются.
В процессе выполнения может быть несколько обращений к серверу. Часть из них кэшируются. Как минимум одно обращение к серверу есть всегда и оно не кэшируется. Кэширование зависит от версии платформы и версии конфигурации в целом. Если установлена низкая скорость соединения и не указывается текущая строка, то кэшируется форма выбора. Очистка кэша осуществляется с периодичностью в 20 мин. Удаляются формы, которые не использовались в этот период времени
Из описания ОткрытьФорму() трудно сделать выводы об явном изменении в поведении платформы, скорее всего было исправлено\оптимизировано ранее существовавшее допущение. Скорее всего изменилась обработка Уникального пользовательского ключа и поиска формы по нему, в 8.3.11 пустое значение — не сопоставляется при поиске среди открытых форм, то в 8.3.12 — пустое значение, тоже значение. Напомню в режиме «совместимости с 8.3.11» в 8.3.12 — форма открывается и с Уникальность = Ложь (значение по умолчанию, если верить документации оно — Ложь).
Так же о многом говорит — ничего не говоря конкретно — расплывчатая формулировка » Кэширование зависит от версии платформы и версии конфигурации в целом.»
Источник