1с ожидать закрытия формы

Обработка оповещения

Добрый день, коллеги!

Два часа сижу с простой задачей.

Соответственно есть вторая процедура:

т.е. нужно после закрытия вызываемой формы выполнять некие действия. Ошибок при выполнении нет, но и результата ноль. 1с процедуру находит, но не выполняет.

Но опыт показывает, что в 99,9 % проблема все-же не в лыжах, я что-то делаю не так. Но что?

Глобальный контекст (Global context)
ПоказатьЗначение (ShowValue)
Синтаксис:

В вызове формы (ПоказатьЗначение()) действительно два параметра: Оповещение и ссылка на то, что открываем. Они заполнены. А какой параметр должен быть в процедуре, которая отрабатывает при завершении?

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

У вас наступило это событие? Которое вы ожидаете?

(12) hroa, Спасибо за участие!

Смотрите, как я понимаю. Запускаем процедуру ПоказатьЗначение(), она вызывает форму, когда форма закрывается, и наступает событие. Вполне допускаю, что я мыслю неверно, но как тогда понять наступило событие или нет?

Задача реализуется следующая:

Есть ТЧ обработки, в эту ТЧ запросом отбираются элементы справочника, по условиям. ТЧ для пользователя отображается в режиме «Только просмотр», при клике на конкретную строку открываем форму по ссылке, которая есть в строке процедурой ПоказатьЗначение(). После того, как пользователь внес изменения в элемент справочника и закрыл форму, нужно очистить и заново заполнить ТЧ т.к. вполне возможно, что данный измененный элемент уже не нужен в ТЧ. Т.е. как только пользователь закрыл форму, нужно запускать процедуру переформирования ТЧ. Можно решить задачу модальным окном, но это не айс, сами понимаете.

Источник

Правильный метод задать вопрос о закрытии формы

При закрытии формы обработки требуется задавать пользователю вопрос, действительно ли нужно закрыть форму. Сейчас это реализовано через обработчик события ПередЗакрытием() и реквизит формы типа Булево – пользователь пробует закрыть форму, обработчик смотрит в переменную, и если она Ложь – отменяет закрытие и задает пользователю вопрос. Если пользователь дает положительный ответ, реквизит формы устанавливается в Истина и форма принудительно закрывается через Закрыть(); в этот раз ПередЗакрытием() видит, что реквизит – Истина, и не блокирует закрытие.

Проблема в том, что эта схема мешает закрытию приложения, если пользователь закрывает не форму обработки отдельно, а все приложение целиком. При этом вызывается то же самое событие ПередЗакрытием(), которое, фактически, всегда отказывается закрывать форму. В итоге форма будет, конечно, закрыта, если пользователь положительно ответит на вопрос, но приложение уже не закроется, т.к. при первом прохождении через ПередЗакрытием() форма отказалась закрываться.

Стандартное поведение форм (например, при изменении данных справочника) более правильное – в них положительный ответ на вопрос о сохранении измененных данных приводит к закрытию приложения. Как добиться такого эффекта самостоятельно?

(5) RocKeR_13, к сожалению, в этой задаче модальные варианты неприемлемы.

(6) dj_serega, оно действительно не критично, но глаз цепляется :)

(4) SerLeon, (7) herfis – понял. Спасибо!

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

Например, в конфигурации есть форма, перед закрытием которой также задаётся вопрос пользователю в немодальном диалоге. Допустим, пользователь модифицировал данные в этой форме и, не сохраняя их, пытается закрыть всё приложение. В результате он ответит что-то в диалоге перед закрытием формы, форма закроется, но приложение останется открытым. Так происходит потому, что в немодальном диалоге перед закрытием формы сначала отменяется стандартная последовательность действий системы (см. пример). А это, в том числе, отменяет и закрытие самого приложения.

Получается, что пока никак не сделать. Хотя может я не в курсе.

Ошибка в ващем сообщеении:

ОписаниеОповещения = Новый ОписаниеОповещения(«ПередЗакрытиемЗавершение», ЭтотОбъект);
// Инициализируется «ОписаниеОповещения «

ПоказатьВопрос(ОписаниеОповещенияОЗавершении, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
// Потом используется»ОписаниеОповещенияОЗавершении»

Сейчас добавили параметр:

Источник

Проверка закрытия формы

Если Док.Товары.Количество() > 0 Тогда

Правильно, к форме обращаться не зачем.
Достаточно обратиться к объекту

Не совсем понятно откуда Вы запускаете этот код.
Если из обработки создаете и заполняете документ Док то достаточно
проверить Док.ЭтоНовый()=Истина

Если у Док проверить УникальныйИдентификатор
у не записаного объекта он будет равен
Док.Ссылка.УникальныйИдентификатор() = «00000000-0000-0000-0000-000000000000»

Если из модуля объект Док то тогда

Если ЭтотОбъект.ЭтоНовый() = Истина Тогда
Сообщить(«Это новый, не записаный документ. «);
КонецЕсли;

Выше не верно написал. Не разобрался в вопросе.

Док.Открыть() не ждет реакции пользователя сохранил он документ или закрыл без сохранения.
Док.Открытьмодально() как раз ждет не не продолжает выполнение кода 1С пока пользователь не закроет Док с сохранением или без.

К примеру Вы создаете 10 документов в обработке.
У вас 1С на экране сразу откроет 10 форм новых документов если использовать Док.Открыть()
И обработка закончит выполнение.

Поэтому без Модального режима Вы не унаете о реакции пользователя.

Не зная полного замысла этой обработки тяжело что то посоветовать

Не записанный документ, не имеет сохраненной ссылки в базе данных. Попробуйте
Если ЭтотОбъект.Ссылка.Пустая() Тогда

Документ не записан

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

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

Толстый клиент.
Пример:

Если Не Форма.Открыта() Тогда
Форма.Открыть();
КонецЕсли;

ЭтоНовый я уже разобрался
а вот с модифицированностью интересно

если док. Модифицированность тогда
удалить что-то (те документ не записан)
иначе
записан
конецесли;

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

Изменение объекта, являющимся значением основного реквизита формы. Это изменение может быть произведено интерактивно с помощью элемента управления связанным с реквизитом объекта или программно.
При изменении данных или отработке события элемента управления, у которого взведен флаг «изменяет данные».

Признак модифицированности формы сбрасывается системой при наступлении одного из следующих событий:

Измененный объект, являющийся значением основного реквизита формы, был успешно записан.
При открытии формы после события ПередОткрытием() формы, но перед событием ПриОткрытии().

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

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

Источник

Отказ от использования модальных окон

В статье будут рассмотрены причины отказа от дальнейшей поддержки модальных окон в платформе «1С:Предприятие» и типовые сценарии перевода имеющегося функционала на новую модель.

Развитие продуктов «1С» и платформы «1С:Предприятие»

Одним из основных векторов развития платформы «1С:Предприятие» является возможность ее успешного использования в среде Интернет.

Эта среда имеет ряд ограничений, которые отсутствуют в среде настольных приложений:

Приложения, предназначенные для работы через Интернет, должны быть построены с учетом этих ограничений, поэтому их модель отличается от настольных приложений.

Все интернет-приложения создаются с использованием асинхронной (событийно-управляемой) модели управления логикой, в отличие от принятой в настольных приложениях синхронной (последовательной) модели.

Изначально платформа «1С:Предприятие» создавалась для построения настольных бизнес-приложений, использующих синхронную модель. Однако, с развитием SaaS-решений потребовался постепенный переход на асинхронную логику.

Проблемы поддержки модальных окон в среде Интернет

Модальные окна являются элементом синхронной модели. Они блокируют исполнение логики приложения, позволяя выполнять ее участки последовательно, друг за другом, в зависимости от результата, полученного от пользователя.

Такие окна не входят в стандарт веб-разработки, поэтому не поддерживаются всеми браузерами, при помощи которых пользователь получает доступ к приложениям «1С».

Для разработки качественных веб-приложений требуются асинхронные средства обеспечения взаимодействия с пользователем.

Такие средства были добавлены в платформу «1С:Предприятие» в версии 8.3.3.

Несколько терминов и определений

Далее в статье будут использоваться следующие термины:

Общие принципы при переходе на асинхронную модель построения бизнес-логики

В синхронной модели код, зависящий от выбора пользователя, выполняется последовательно.

В асинхронной модели мы можем получить результат только обрабатывая события, которые возникают, когда пользователь делает свой выбор. При этом на время ожидания выбора код приложения не останавливается и оно продолжает работать.

Таким образом, получается, что такой код разбивается на две процедуры:

Новые асинхронные средства платформы для взаимодействия с пользователем

Для реализации асинхронной модели в первую очередь требуется возможность описания процедур-обработчиков оповещений, которые будут вызваны системой при завершении выбора пользователя.

Этот объект имеет конструктор со следующими параметрами:

Для получения значения модуля у вышеперечисленных объектов добавлено общее свойство ЭтотОбъект.

Для перехода на асинхронную модель в платформу были добавлены методы, аналогичные модальным методам, но, в отличие от них, не блокирующие поток исполнения. Эти методы уже не являются элементами синхронной логики, поэтому могут беспрепятственно использоваться при разработке веб-приложений.

Группа этих методов отличается следующим:

Также были добавлены возможности работы с управляемыми формами в асинхронной модели. Однако, для них не создавалось новых методов, а были доработаны уже имеющиеся средства:

Дополнительно реализован новый метод глобального контекста ВыполнитьОбработкуОповещения(), который позволяет вручную осуществить вызов процедуры-обработчика. Это позволяет реализовать общую процедуру, выполняющую опрос пользователя, которая вызывается из разных мест.

Особенности реализации асинхронной бизнес-логики

Следует отметить, что поначалу асинхронная модель может показаться сложнее привычной синхронной. На самом деле, понимая основные различия этих моделей, разработка асинхронных приложений становится не многим труднее.

Это подтверждается тем фактом, что все современные веб-приложения построены именно с использованием асинхронной модели и их количество постоянно растет.

Типовые сценарии при переходе на асинхронную модель


Вопрос пользователю в команде формы

Наиболее частым сценарием является получение информации от пользователя во время исполнения какой-либо команды.
Допустим, существует следующий код, написанный в рамках синхронной модели:

В рамках асинхронной модели с использованием новых средств этот код будет выглядеть следующим образом:

//Добавим вид характеристики на форму
ДобавитьХарактеристикуНаСервере ( ВидХарактеристики ) ;
КонецПроцедуры

Следует обратить внимание, что процедура-обработчик объявлена экпортируемой. Это связано с тем, что эта процедура будет вызвана не кодом самого модуля, а системным кодом платформы, поэтому модуль должен предоставить к ней доступ.

Вопрос пользователю при закрытии формы

В таких случаях доступен следующий алгоритм:

Ниже приведен пример кода, реализующего этот алгоритм:

Вопрос пользователю во вложенных процедурах

Теперь рассмотрим случай, когда выбор пользователя осуществляется в некоторой общей процедуре, вызываемой из разных мест другими процедурами. Получается, что в асинхронной модели такая процедура не может сразу вернуть результат, а должна как-то уведомлять вызывающие ее процедуры о том, что результат получен и можно продолжать работу.

Предположим, существует общая функция, которая возвращает текст, в зависимости от ответа пользователя:

В асинхронной модели эту функцию и ее вызовы следует реализовывать следующим образом:

Таким образом, вызовы процедур можно связывать в цепочки, передавая им результат при помощи метода ВыполнитьОбработкуОповещения().

Заключение

В статье были рассмотрены новые средства, позволяющие реализовывать более качественные приложения с использованием асинхронной модели, принятой в среде Интернет.

Несмотря на наличие таких средств, видно, что большое количество диалогов может усложнять программный код. К тому же, в веб-приложениях диалоги выбора используются гораздо реже, чем в настольных, поскольку снижают общее удобство использования.

В таких случаях имеет смысл рассмотреть другие подходы, не требующие использования диалогов. Например, использование сообщений, всплывающих подсказок вместо диалогов предупреждений.

Источник

Открытие форм

Область применения: управляемое приложение, мобильное приложение.

Рекомендация обусловлена соображениями

2. В случаях когда форма требует параметризации при открытии, все ее параметры следует указывать в наборе параметров формы. Таким образом, набор параметров формы декларативно описывает возможности формы по ее параметризации.

Параметры формы из этого набора могут быть указаны в вызывающем коде при открытии формы ( ОткрытьФорму ).

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

ФормаПутеводитель = Форма.ОткрытьФорму(«ОбщаяФорма.ПутеводительПоСистеме»);
ФормаПутеводитель.Элементы.ГруппаШаг.ТекущаяСтраница = ФормаПутеводитель.Элементы.ГруппаШаг.Страницы.Приветствие;

следует по той же причине использовать параметры формы:

ОткрытьФорму(«ОбщаяФорма.ПутеводительПоСистеме», Новый Структура(«РежимОткрытия», «Приветствие»));

4. Для получения результата работы формы, вместо непосредственного обращения к элементам и реквизитам формы

ФормаВопроса = ПолучитьФорму(«ОбщаяФорма.ФормаВопроса»);
ФормаВопроса.ОткрытьМодально();
Если ФормаВопроса.БольшеНеПоказыватьНапоминание Тогда
// …

следует использовать процедуры-обработчики оповещений, которые будут вызваны при завершении работы пользователя с формой:

Оповещение = Новый ОписаниеОповещения(«БольшеНеПоказыватьНапоминаниеЗавершение», ЭтотОбъект);
ОткрытьФорму(«ОбщаяФорма.ФормаВопроса». Оповещение, РежимОткрытияОкнаФормы.БлокироватьВеcьИнтерфейс);
.

&НаКлиенте
Процедура БольшеНеПоказыватьНапоминаниеЗавершение(БольшеНеПоказыватьНапоминание, Параметры) Экспорт

Если БольшеНеПоказыватьНапоминание = Неопределено Тогда
Возврат;
КонецЕсли;

Если БольшеНеПоказыватьНапоминание Тогда
// …

5. Другие ограничения:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Не ПользователиКлиентСервер.ЭтоСеансВнешнегоПользователя() Тогда
Отказ = Истина;
Возврат;
КонецЕсли;

КонецПроцедуры

6. Следующие виды форм должны быть всегда доступны пользователю в режиме 1С:Предприятия из меню «Все функции» вне зависимости от того, размещены ли соответствующие объекты в командном интерфейсе приложения или нет:

Источник

Понравилась статья? Поделить с друзьями:
Добавить комментарий
  • Как сделать успешный бизнес на ритуальных услугах
  • Выездной кейтеринг в России
  • Риски бизнеса: без чего не обойтись на пути к успеху
  • 1с ограничение прав на уровне записей
  • 1с обычные формы флажок в табличной части