1с при закрытии формы закрыть 1с

[Новое в платформе] Как правильно закрывать формы и приложение в платформе 1С:Предприятие 8.3.8 (и старше)

Эта статья для программистов 1С – в ней разберем новое ограничение платформы при разработке кода.

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

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

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

Коротко о главном…

Сначала коротко обозначим суть изменений. Начиная с версии платформы 8.3.8 необходимо выделять 2 сценария закрытия формы:

Как это повлияло на объем кода?

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

Фактически теперь в процессе закрытия приложения можно указать только текст вопроса, который увидит пользователь.
Скорее всего, у вас уже возник вопрос: к чему же все эти изменения?

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

Теперь подробнее разъясним суть проблемы.

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

Что же сделали разработчики платформы? Теперь платформа ведет себя так же, как и веб-браузеры: если приложение не хочет, чтобы его закрывали, тогда выводится платформенный диалог. В результате нет необходимости писать код под разные клиенты, так как работает он одинаково, но платой за такую универсальность являются описанные выше ограничения.

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

На этом завершаем краткий обзор изменений и переходим к подробному разбору.

Вопрос при закрытии формы

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

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

Если данный код попытаться выполнить на платформе 8.3.8 с отключенным режимом совместимости, тогда возникнет ошибка:

forms and applications closing01

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

Таким образом, код требует модернизации:

Как вы можете заметить, у обработчика ПередЗакрытием появились 2 новых параметра:

Теперь подробнее об изменении в коде. Как вы видите, появилась новая ветка алгоритма, которая выполняется в процессе завершения работы системы.

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

В толстом и тонком клиенте окно предупреждения будет следующим:

forms and applications closing02

Стоит отметить, что если флаг Отказ сброшен, а ТекстПредупреждения заполнен, тогда система проигнорирует текст и сообщение отображено не будет. Если же флаг Отказ установлен, а параметр ТекстПредупреждения не заполнен, тогда будет отображено системное предупреждение:

forms and applications closing03

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

В веб-клиенте диалог будет выглядеть иначе. В веб-браузерах Mozilla Firefox и Google Chrome будет отображен только текст, заданный разработчиками веб-браузера и не будет отображаться текст, установленный в обработчиках событий системы.

Пример диалога для Mozilla Firefox:

forms and applications closing04

Пример диалога для Google Chrome:

forms and applications closing05

В веб-браузере Internet Explorer диалог будет выглядеть иначе. Будет отображен единый диалог, содержащий все сообщения, установленные в обработчиках формы и модуле управляемого приложения:

forms and applications closing06

Стоит отметить, что если в свойствах конфигурации включен режим совместимости с 8.3.7 и более ранними версиями, то данный механизм будет работать в старом варианте.

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

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

Вопрос при закрытии приложения

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

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

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

Открытие формы обработки при закрытии приложения

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

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

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

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

forms and applications closing07

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

Заключение

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

Чтобы освоить разработку интерфейсов и форм в 1С:Предприятие 8.3
на профессиональном уровне, рекомендуем записаться на курс:

Поддержка – 3 месяца. Объем курса – 49 учебных часов.

Об авторе

Sergey Kalinkin

Автор статьи – Сергей Калинкин

Директор ЦСО «Центр профессионального программирования», г. Казань

PDF-версия статьи для участников группы ВКонтакте

Если Вы еще не вступили в нее – сделайте это сейчас, и в блоке ниже (на этой странице) появятся ссылки на скачивание материалов.

Источник

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Сообщение пользователю после закрытия формы

1С:Предприятие 8.3 (8.3.4.389)
Бухгалтерия предприятия, редакция 3.0 (3.0.28.12)

Дописал в БП 3.0 подписку на событие перед запиью регистра бухгалтерии НаборЗаписей в модуле на сервере, которое информирует пользователя, т.е. выводит сообщение, в случае необходимости.
Но если пользователь в открытом документ нажимает «Провести и закрыть», то данное сообщение показывается в форме документа и закрывается тут же, поэтому прочесть его нет возможности.

Игрался с КлючДанных и ПутьКДанным ничего не получилось.

Как можно вывести сообщение не в текущую форму, а в форму списка регистра бухгалтерии или допустим в форму рабочего стола?

Неужели никто так и не поборол этот «подарок от разработчиков платформы»?

В реквизиты формы добавил реквизит с типом СписокЗначений. Я его назвал СообщенияПользователюПослеЗаписи.

Далее, в обработчике формы ПослеЗаписиНаСервере, пока, после выполнения записи объекта на сервере, управление еще не вернулось на клиента, и выведенные пользователю сообщения еще не отображены на клиенте, я снимаю копию очереди сообщений пользователю и сохраняю ее в добавленном реквизите СообщенияПользователюПослеЗаписи:

Подозреваю, что можно было вызывать ПолучитьСообщенияПользователю(. ) с аргументом Ложь, и тогда можно было бы прямо полученные сообщения и добавлять в реквизит СообщенияПользователюПослеЗаписи, не делая их копии. Но опробовать эту «оптимизацию» еще не успел, поэтому привел работающий вариант кода.

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

Сам обработчик выглядит вот так

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

Вообще, эта очистка очереди сообщений нужна для того, чтобы в случае, если пользователь получил свои сообщения при записи объекта, то чтобы ему не выводились эти же сообщения еще раз при закрытии формы, если он ее закрывает без записи. Такая ситуация может возникнуть, например, если пользователь нажал «Записать», прочитал сообщения, и нажимает «Закрыть» (без записи). В таком случае вывод сообщений будет «странным» с точки зрения пользователя.

В этом обработчике, мы все собранные в реквизите формы сообщения пользователю выводим, перепривязывая их (с помощью свойства ИдентификаторНазначения) к текущей активной форме (которая уже не наша закрываемая форма). Делаем мы это только в том случае, если окно закрывается не «при завершении работы», т.к. при завершении работы закрыты будут все окна 1С, и пользователь все-равно ничего не успеет прочитать.

А! Ну а сами сообщения выдаются в обработчиках модуля объекта (ПередЗаписью, ПриЗаписи, ОбработкаПроверкиЗаполнения и т.п.) с помощью классического метода Сообщить или через объект СообщениеПользователю. Кстати, в последнем случае можно даже привязать сообщения к конкретным реквизитам записываемого объекта, и тогда, после записи и закрытия формы объекта, можно будет двойным щелчком по сообщению обратно открыть объект и перейти к редактированию «стремного» реквизита. Что уже приобретает смысл «удобства пользователя».

Источник

Как в форме выбора при закрытии формы отказаться от значения

Так ты ж и получаешь просто выбранный элемент. Вместо этого нужно почитать про возвращаемое значение для модального окна в синтакс-помощнике:

И переделать код на

Вот нашел ранее что писал, думаю этот алгоритм можно и тут применить.
Уже поднималась эта тема.
Текстовое поле имеет тип ДокументСсылка. Справа кнопка выбора позволяет выбрать нужный документ. Если ввести в поле текст значения реквизита. То выдается ошибка:
«В поле введены некорректные данные.Отменить ввод?»
Так и должно быть. С этим все понятно.
Как я хочу сделать:
При окончании ввода по введенному тексту найти запросом нужный документ.
Далее присвоить этому текстовому полю ссылку на найденный документ.
Все работает. Ввожу текст. Документ находится. Поле заполняется:
Док номер такой-то от таког-то числа
Вот только ошибка эта все равно вылазиит.
Отключал
СтандартнаяОбработка = Ложь
В этом случае вообще ничего не заполняется.

——
Если надо кому нашел решение.

Да, всё верно в случае если Ставим СтандартнаяОбработка = Ложь ничего не заполняется. Именно это нам и надо.

1. В вышеописанной процедуре присваиваем значение Глобальной (описанной в модуле этой форме) Переменной.
Например описали:
Перем НайденныйДок;
И присваиваем ей например Номер найденного в запросе документа

2. В процедуре при изменении пишем
Процедура ТабличнаяЧастьДоверенностьПриИзменении(Элемент)
ИщемДокумент=Документы.Доверенность.НайтиПоНомеру(НайденныйДок,ЭтотОбъект.Дата);
Если ИщемДокумент=Документы.Доверенность.ПустаяСсылка() Тогда
Сообщить(«К сожалению не найдена доверенность под Номером «+НайденныйДок);
Иначе
Элемент.Значение=Документы.Доверенность.НайтиПоНомеру(НайденныйДок,ЭтотОбъект.Дата);
КонецЕсли;
КонецПроцедуры;

Источник

Вывод сообщений пользователю из закрывающейся управляемой формы 1С

Введение

В управляемом интерфейсе 1С, сообщения, выводимые пользователю с помощью функции Сообщить(. ) или объекта СообщениеПользователю, отображаются с привязкой к форме. И даже если явно такая привязка не задана, то платформа их автоматически привязывает к текущей активной форме.

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

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

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

Впервые этот прием был описан мною в обсуждении темы на Инфостарте.
Здесь же я проверил свои предположения о возможности оптимизации описанной там версии приема, и описал уже результирующую оптимизированную версию.

Ограничения

Т.к. платформа 1С не предоставляет возможности работать с сообщениями, выведенными из клиентского контекста, то описанный ниже прием работает только для тех сообщений, которые выводятся в серверном контексте исполнения кода.
А так как сохранение объектов и проведение документов выполняется в серверном контексте, то нам такое решение вполне подходит.

Общая идея

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

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

Подробности реализации на примере

Обоснование

Для того, чтобы продемонстрировать техническую реализацию данного метода, возьмем для примера типовую конфигурацию «Бухгалтерия для Украины 2.0» (2.0.23.1). В ней при проведении документа «Приложение 2 к Налоговой накладной», если документ не включен в ЕРНН, пользователю в окно сообщений выдается предупреждение

«Не указана дата регистрации документа в ЕРНН покупателем! Проводки сформированы частично».

Но если пользователь нажимает на кнопку «Провести и закрыть», то он это предупреждение не увидит (см. видео).

Добавление реквизита формы

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

Сохранение сообщений после записи на сервере

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

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

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

Удаление сообщений, если форма не закрылась (и они отобразились пользователю платформой)

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

Демонстрация результата

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

О Лицензии

Источник

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