1с закрыть форму при открытии
Открытие форм
Область применения: управляемое приложение, мобильное приложение.
1. Для открытия форм следует применять метод глобального контекста ОткрытьФорму (при использовании версии платформы 1С:Предприятие 8.2 и более ранних версий - также ОткрытьФормуМодально ). Применение альтернативного способа, с получением формы и ее последующим открытием с помощью метода ПолучитьФорму , не рекомендуется.
Рекомендация обусловлена соображениями
- повышения устойчивости кода, работающего с формой, за счет разделения программного интерфейса для работы с формой и деталей ее внутренней реализации,
- а также сохранения единой стилистики кода прикладных решений.
Кроме того, применение глобального метода ОткрытьФорму гарантирует выполнение инициализации формы на сервере в обработчике ПриСозданииНаСервере . Этот подход помогает сосредоточить весь код инициализации формы в одном месте и исключает "случайное" обращение к серверу, связанное с инициализацией формы, между строками кода
2. В случаях когда форма требует параметризации при открытии, все ее параметры следует указывать в наборе параметров формы. Таким образом, набор параметров формы декларативно описывает возможности формы по ее параметризации.
Параметры формы из этого набора могут быть указаны в вызывающем коде при открытии формы ( ОткрытьФорму ).
3. Не следует применять другие способы параметризации формы при открытии. Например, нужно избегать обращения к методам и свойствам формы после ее открытия.
Например, вместо
следует по той же причине использовать параметры формы:
ОткрытьФорму("ОбщаяФорма.ПутеводительПоСистеме", Новый Структура("РежимОткрытия", "Приветствие"));
4. Для получения результата работы формы, вместо непосредственного обращения к элементам и реквизитам формы
ФормаВопроса = ПолучитьФорму("ОбщаяФорма.ФормаВопроса");
ФормаВопроса.ОткрытьМодально();
Если ФормаВопроса.БольшеНеПоказыватьНапоминание Тогда
// …
следует использовать процедуры-обработчики оповещений, которые будут вызваны при завершении работы пользователя с формой:
Оповещение = Новый ОписаниеОповещения("БольшеНеПоказыватьНапоминаниеЗавершение", ЭтотОбъект);
ОткрытьФорму("ОбщаяФорма.ФормаВопроса". Оповещение, РежимОткрытияОкнаФормы.БлокироватьВеcьИнтерфейс);
.
&НаКлиенте
Процедура БольшеНеПоказыватьНапоминаниеЗавершение(БольшеНеПоказыватьНапоминание, Параметры) Экспорт
Если БольшеНеПоказыватьНапоминание = Неопределено Тогда
Возврат;
КонецЕсли;
Если БольшеНеПоказыватьНапоминание Тогда
// …
При этом возвращаемое значение формы формируется в коде модуля формы с помощью метода формы Закрыть .
5. Другие ограничения:
- Обработчик события формы ПриОткрытии не должен содержать код по открытию какой-либо другой формы, так как это может привести к нарушению порядка отображения окон. В этом случае рекомендуется использовать обработчик ожидания на короткий интервал или открывать другие формы интерактивно, например, по нажатию на кнопку.
- Не рекомендуется выполнять программное открытие и закрытие формы в одном обработчике. Такие действия должны быть разнесены по времени. Например, закрытие формы можно выполнять в обработчике ожидания.
- При использовании в конфигурации Библиотека стандартных подсистем и разработке форм (рабочих мест), предназначенных только для внешних пользователей, следует явно блокировать открытие таких форм в сеансах "обычных" пользователей. Для этого следует устанавливать параметр Отказ при создании формы на сервере с помощью функции ЭтоСеансВнешнегоПользователя общего модуля Пользователи или ПользователиКлиент :
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Не ПользователиКлиентСервер.ЭтоСеансВнешнегоПользователя() Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
…
КонецПроцедуры
6. Следующие виды форм должны быть всегда доступны пользователю в режиме 1С:Предприятия из меню "Все функции" вне зависимости от того, размещены ли соответствующие объекты в командном интерфейсе приложения или нет:
Открываю модально форму. При открытии надо проверить некое условие, и форму сразу же закрыть, если оно выполняется. Как сделать? Закрыть() в ПриОткрытии() не работает.
как-то гений задавался этим вопрос, так вот там убойное решение - выходить в обработчике ожидания ))
(1) телепатирую. эффект 25го кадра. пользователь не успевает увидеть изображение (помните, как в бойцовском клубе?), а в подкорке откладывается
(4) с одной стороны да, но с другой надо ведь и параметр надо вернуть.
(2) как в таком случае вернуть параметр? форма модально открывается.
(14) если не открывать, проверку придется громоздить в модуле обработки. больше писанины.
(16) это правильней, и форма не трогается.
или тогда уж (2), форма возвратит неопределено, что правильно. или чего хочеш вернуть?
(0) Странно - у меня Закрыть() в модуле ПриОткрытии() работает. Тоже делал такой изврат - для чтения сохраннённых параметров, до сих пор работает.
(16), (18) Да. Совсем нынешняя молодёжь не думает об оптимизации. Думают, что программа для удобства программиста, а не пользователя. Считают, что лучше инициализировать кучу лишних объектов, сожрав этим немеренно памяти, лишь бы не перетрудиться, написав нормальный код. А когда-то помню, программисты за каждый байт памяти боролись :)))
(19) И сколько килобайт памяти отожрет лишняя открытая форма и как это сделает работу пользователя удобной ? И на кой хрен мне думать об оптимизации там, где это даст выигрыш в милисекунды ?
И задача у меня так построена что надо восстановить значения, которые сохранила форма внешней обработки. Как их вытащить по другому ?
(22) вау - интересный способ сохранения данных. В мемориз - однозначно.
(23) Предложите способ сохранения настроек по умолчанию для внешних обработок, не трогая конфигурацию.
(24) Для выполнения ВосстановитьЗначение Не Требуется открывать форму. (23),(19),(20) правы
Встречал код, для получения связанных докуметов открывавший форму структуры подчиненности и считывающий с элемента формы выведенное дерево (с последущим закрытием формы). А чо, зачем париться, "на кой хрен мне думать об оптимизации"
(25) Хмм - вот внешняя обработка, у нее есть реквизит "ОтборОрганизация" - пользователь открыл форму, выбрал его и ткнул кнопку "Сохранить значения" и закрыл форму. Как из другой обработки прочитать что было сохранено ?
(29) В ПередСохранениемЗначений выполнить СохранитьЗначение. Позже, при необходимости, ВосстановитьЗначение
+(30) Это если не думать. Если таки подумать, то найдутся и другие варианты, например с использованием возможностей конкретной конфигурации
(30) У меня похожих обработок несколько, и в некоторых одинаковые реквизиты. Придется писать спереди еще идентификаторы, потом читать так же. В то время как форма обработки сама всё умеет - надо только галочки поставить что сохранять, только читать приходится с открытием - какая вот только пользователю разница как там настройки хранятся.
(31) Обработка универсальная, не привязанная к конкретной конфе.
(31) Как раз настройки, касающиеся конкретной конфы и которые надо прочитать и описываются во внешних обработках. А центральная, которая все читает, от особенностей конф не зависит.
(33) СохранитьЗначение и ВосстановитьЗначение работает с привязкой к конфе.
Идентификатор можешь тупо писать один. Пофиг. Далее тупо запустить обработку 1 раз в конфе и все. Т.е. в другой конец, через восстановитьзначение, данные с другой конфы не достать.
Открываю модально форму. При открытии надо проверить некое условие, и форму сразу же закрыть, если оно выполняется. Как сделать? Закрыть в ПриОткрытии не работает.
как-то гений задавался этим вопрос, так вот там убойное решение - выходить в обработчике ожидания ))
телепатирую. эффект 25го кадра. пользователь не успевает увидеть изображение (помните, как в бойцовском клубе?), а в подкорке откладывается
с одной стороны да, но с другой надо ведь и параметр надо вернуть.
как в таком случае вернуть параметр? форма модально открывается.
если не открывать, проверку придется громоздить в модуле обработки. больше писанины.
это правильней, и форма не трогается. или тогда уж , форма возвратит неопределено, что правильно. или чего хочеш вернуть?
Странно - у меня Закрыть в модуле ПриОткрытии работает. Тоже делал такой изврат - для чтения сохраннённых параметров, до сих пор работает.
, Да. Совсем нынешняя молодёжь не думает об оптимизации. Думают, что программа для удобства программиста, а не пользователя. Считают, что лучше инициализировать кучу лишних объектов, сожрав этим немеренно памяти, лишь бы не перетрудиться, написав нормальный код. А когда-то помню, программисты за каждый байт памяти боролись :)))
И сколько килобайт памяти отожрет лишняя открытая форма и как это сделает работу пользователя удобной ? И на кой хрен мне думать об оптимизации там, где это даст выигрыш в милисекунды ? И задача у меня так построена что надо восстановить значения, которые сохранила форма внешней обработки. Как их вытащить по другому ?
вау - интересный способ сохранения данных. В мемориз - однозначно.
Предложите способ сохранения настроек по умолчанию для внешних обработок, не трогая конфигурацию.
Для выполнения ВосстановитьЗначение Не Требуется открывать форму. ,, правы
Встречал код, для получения связанных докуметов открывавший форму структуры подчиненности и считывающий с элемента формы выведенное дерево (с последущим закрытием формы). А чо, зачем париться, "на кой хрен мне думать об оптимизации"
Хмм - вот внешняя обработка, у нее есть реквизит "ОтборОрганизация" - пользователь открыл форму, выбрал его и ткнул кнопку "Сохранить значения" и закрыл форму. Как из другой обработки прочитать что было сохранено ?
В ПередСохранениемЗначений выполнить СохранитьЗначение. Позже, при необходимости, ВосстановитьЗначение
+ Это если не думать. Если таки подумать, то найдутся и другие варианты, например с использованием возможностей конкретной конфигурации
У меня похожих обработок несколько, и в некоторых одинаковые реквизиты. Придется писать спереди еще идентификаторы, потом читать так же. В то время как форма обработки сама всё умеет - надо только галочки поставить что сохранять, только читать приходится с открытием - какая вот только пользователю разница как там настройки хранятся. Обработка универсальная, не привязанная к конкретной конфе.
Как раз настройки, касающиеся конкретной конфы и которые надо прочитать и описываются во внешних обработках. А центральная, которая все читает, от особенностей конф не зависит.
СохранитьЗначение и ВосстановитьЗначение работает с привязкой к конфе. Идентификатор можешь тупо писать один. Пофиг. Далее тупо запустить обработку 1 раз в конфе и все. Т.е. в другой конец, через восстановитьзначение, данные с другой конфы не достать.
Да ладно, сделано и сделано. Мне, реально, все равно, как оно у тебя организовано. Разговор в общем о подходе - сделать "хорошо" или сделать "быстро". Большинство, к сожалению, делают "быстро".
Да не - я знаю, что каждая конфа хранит настройки отдельно и отдельно для каждого пользователя (там по моему один механизм - что для СохранитьЗначение, что для автоматического сохранения данных формы). Но имеется ввиду что в одной базе надо сохранить несколько одинаковых настроек. Это у меня обработка по обмену данными - все настройки конкретных обменов: отборы и прочее лежат в обработках. Обработка обмена при выборе конкретного обмена открывает обработку настройки, считывает сохраненные раньше пользователем отборы и закрывает ее. Пользователю не надо каждый раз лазить настраивать. Я вот тоже не поклонник сделать быстро. Вот только когда я работал во франче мне это выливалось в наименьшее количество закрытых часов по фирме (((
сохраняемое значение - структура, имена настроек - ключи. Это как вариант решения.
Вот тебе задача: Восстановить настройку из регистра/справочника "СохранненныеНастройки" определенную настройку для предопределенного пользователя (константа/предопределенный элемент справочника) и использовать ее в регламентном задании на сервере.
+ общий подход - сделать правильно, исходя из этого и работать тоже будет. всегда
alik-ZmeY --> alik-ZmeYЗиУП logist --> logist
Но тут главное, что бы при открытии не возникала модифицированность. А вообще, я думаю ваша цель не это, скорее всего, то, что вы хотите можно реализовать прямым способом, а не через ж.
pablo --> pabloСовершенно верно. Пишу обработку для заполнения платежных документов. Из текстового файла передаю форме Платежного поручения данные. Форма имеет свои процедуры и функции. которые активируются при вводе вручную.
Так вот при передачи через создатьдокумент(), процедуры которые выполняются при событии по нажатию кнопки не выполняются, и что бы их не переписывать я получаю форму, на форме получаю элементы этой формы и передаю значения. Но нада еще выполнить приОткрытии формы, эта процедура меняет значения документа. Как это сделать??
Читайте также: