Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

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

Вопрос при закрытии произвольной формы
Я
   Csar
 
16.03.18 - 13:54
Добрый день, коллеги.
Столкнулся с простой казалось бы задачей, но вопрос при закрытии произвольной формы что-то не удается решить.
Есть ОбщаяФорма, которая вызывается из ФормыДокумента. ОбщуюФорму можно закрыть нажав кнопку Да или кнопку Отмена. Так же можно закрыть крестиком или через Esc.
1) При нажатии на кнопку Да возвращаем Текст в ФормуДокумента.
2) При нажатии на кнопку Отмена: появляется вопрос типа "Вы хотите сохранить изменения? Да/Нет" - если нажали на Да, то в ФормуДокумента возвращается Текст, если нет, то возвращается КодВозвратаДиалога.Отмена.
3) При выходе из формы через Esc или крестик справа вверху формы, то действовать как в п. 2)

Так вот первые 2 пункта я реализовал, а вот с третьим не могу, т.к. нет обработчика события такого. Если в ПередЗакрытием впихнуть обработку всей логики с итоговыми процедурами "Закрыть(...)", то не понятно как вызвать обработчик ПередЗакрытием при нажатии на кнопки Да или Отмена.
 
 
   Csar
 
1 - 16.03.18 - 14:03
Вот что у меня вышло для первых двух пунктов:

[1с]&НаКлиенте
Процедура OK(Команда)
    КодОтвета = "Да";
    ОповеститьОВыборе(Текст);
    Закрыть(Текст);
КонецПроцедуры

&НаКлиенте
Процедура Отмена(Команда)
    КодОтвета = "Нет";
    ОтветНаВопрос = Ложь;
    Если ПереспрашиватьПриОтмене И Модифицированность Тогда
        ТекстВопрос     = ?(ОтображениеДанныхНаАнглийском, "Do you want to save changes?",
                                                            "Вы хотите сохранить изменения?");
        ТекстЗаголовка     = ?(ОтображениеДанныхНаАнглийском, "Saving data changes",
                                                            "Сохранение введенных данных");
        ОтветНаВопрос = Вопрос(ТекстВопрос, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да, ТекстЗаголовка) = КодВозвратаДиалога.Да;
    КонецЕсли;
    Если ОтветНаВопрос Тогда
        ОповеститьОВыборе(Текст);
        Закрыть(Текст);
    Иначе
        Закрыть(КодВозвратаДиалога.Отмена);
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
    Отказ = НЕ (КодОтвета = "Да" ИЛИ КодОтвета = "Нет");
КонецПроцедуры
[/1с]
   Csar
 
2 - 16.03.18 - 14:31
Есть ли у кого-нибудь идеи как реализовать третий пункт?
   Buster007
 
3 - 16.03.18 - 14:47
При отмене надо просто закрывать форму. Сработает процедура ПередЗакрытием
в перед закрытием пишешь
Если ЗадалиВопрос Тогда
Возврат;
КонецЕсли;

твой код с вопросом с результатом закрытия формы
ЗадалиВопрос = Истина;

Оповестить о выборе надо делать в при закрытии
   Csar
 
4 - 16.03.18 - 15:05
При Отмене - это при нажатии на кнопку Отмена? И закрывать - это вызывать процедуру Закрыть()?
   Csar
 
5 - 16.03.18 - 15:08
У меня получается так, что если я обработаю так:
&НаКлиенте
Процедура Отмена(Команда)
...
Закрыть();
КонецПроцедуры

&НаКлиенте 
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
...
КодСЗаданиемВопроса();
Закрыть();
...
КонецПроцедуры


То с таком случае, вопрос задается дважды, т.е. в "ПередЗакрытием" заходит дважды
   Csar
 
6 - 16.03.18 - 15:16
(3) Как просто закрывать форму?
Если через Закрыть(), то что бы я не возвращал в "ПередЗакрытием" - все равно ничего не возвращается.
   Mankubus
 
7 - 16.03.18 - 15:39
Не надо вообще ничего писать в отмене. Надо оставить стандартную кнопку Отмена, она закрывает форму
   Csar
 
8 - 16.03.18 - 15:51
(7) если оставить обработку кнопки Да с процедурой Закрыть(), то после вызова процедуры Закрыть() в "ПередЗакрытием" программа снова сюда заходит. В итоге дважды задается вопрос.
   Buster007
 
9 - 16.03.18 - 15:56
зачем ты вызываешь в процедуре перед закрытием метод Закрыть()? Форма и так уже закрывается
   Csar
 
10 - 16.03.18 - 16:00
А как иначе вернуть требуемое значение?
 
 Рекламное место пустует
   Buster007
 
11 - 16.03.18 - 16:05
а как возврат значения связан с методом Закрыть()
   Csar
 
12 - 16.03.18 - 16:08
(11) Закрыть(ВозвращаемоеЗначение)
В итоге что я имею сейчас:
1) &НаКлиенте
Процедура OK(Команда)
    КодОтвета = "Да";
    ОповеститьОВыборе(Текст);
    Закрыть(Текст);
КонецПроцедуры

2) Кнопка Отмена берется системная без ручного обработчика
3) &НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
    ОтветНаВопрос = Ложь;
    Если ПереспрашиватьПриОтмене И Модифицированность И КодОтвета <> "Да" Тогда
        ТекстВопрос     = ?(ОтображениеДанныхНаАнглийском, "Do you want to save changes?", 
                                                            "Вы хотите сохранить изменения?");
        ТекстЗаголовка     = ?(ОтображениеДанныхНаАнглийском, "Saving data changes", 
                                                            "Сохранение введенных данных");
        ОтветНаВопрос = Вопрос(ТекстВопрос, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да, ТекстЗаголовка) = КодВозвратаДиалога.Да;
        КодОтвета = ?(ОтветНаВопрос = Истина, "Да", "Нет");
    КонецЕсли;
КонецПроцедуры
3) &НаКлиенте
Процедура ПриЗакрытии()
    Если КодОтвета = "Да" Тогда
        ОповеститьОВыборе(Текст);
        Закрыть(Текст);
    Иначе
        Закрыть(КодВозвратаДиалога.Отмена);
    КонецЕсли;
КонецПроцедуры

В 3) программа ругается на Закрыть(ВозвращаемоеЗначение);
   Csar
 
13 - 16.03.18 - 16:09
Да, наверное надо было упомянуть о том, что у меня модальное окошко и его вызов должен напрямую вернуть Значение.
   Csar
 
14 - 16.03.18 - 16:18
(11) я использую не метод, а процедуру.
   Buster007
 
15 - 16.03.18 - 16:35
у ОткрытьФорму есть такой параметр как ОписаниеОповещенияОЗакрытии. Почитай
   Buster007
 
16 - 16.03.18 - 16:35
(13) вместо модального вызова формы следует использовать не модальный с указанием параметра БлокироватьОкноВладельца
   Buster007
 
17 - 16.03.18 - 16:36
+(15) не, не катит. Тогда тебе надо использовать метод формы Закрыть, как ты и делаешь.
В таком случае надо просто использовать Оповестить
   Csar
 
18 - 16.03.18 - 16:45
(17) так вот и получается, что если я использую Закрыть(Текст) в обработчике кнопки ОК, а потом и при Закрытии обработки в случае, если юзер нажал Отмена, а потом решил все же сохранить данные, то опять вызываю Закрыть(Текст), то все равно возвращается неопределено.
   h-sp
 
19 - 16.03.18 - 19:28
(18) выкиньте ПриЗакрытии, она нахрен не нужна, делайте всё в ПередЗакрытием


И не забывайте Отказ=Истина, если вдруг повторно Закрыть вызывается.
   Csar
 
20 - 18.03.18 - 12:02
Придумал таки решение. Оказалось все действительно просто - надо лишь понять какое действие вызывает событие. Если не кнопка, то своя логика, если кнопка, то логика обрабатывается ТОЛЬКО в действиях кнопки:

&НаКлиенте
Процедура OK(Команда)
  ВыбранноеДействие = "Да";
  ОповеститьОВыборе(Текст);
  Закрыть(Текст);
КонецПроцедуры

&НаКлиенте
Процедура Отмена(Команда)
  ВыбранноеДействие = "Отмена";
  ОтветНаВопрос = Вопрос("Сохранить?", РежимДиалогаВопрос.ДаНет);
  Если ОтветНаВопрос = КодВозвратаДиалога.Да Тогда
    ВыбранноеДействие = "Да";
    ОповеститьОВыборе(Текст);
    Закрыть(Текст);
  Иначе
    ВыбранноеДействие = "Отмена";
    Закрыть(КодВозвратаДиалога.Отмена);
  КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
  Если НЕ (ВыбранноеДействие = "Отмена" ИЛИ ВыбранноеДействие = "Да") Тогда
    ОтветНаВопрос = Вопрос("Сохранить?", РежимДиалогаВопрос.ДаНет);
    Если ОтветНаВопрос = КодВозвратаДиалога.Да Тогда
      ВыбранноеДействие = "Да";
      ОповеститьОВыборе(Текст);
      Закрыть(Текст);
    Иначе
      ВыбранноеДействие = "Отмена";
      Закрыть(КодВозвратаДиалога.Отмена);
    КонецЕсли;
  КонецЕсли;
КонецПроцедуры
   Cyberhawk
 
21 - 18.03.18 - 12:03
Много букв. Сколько платят за решение вопроса?
   Cool_Profi
 
22 - 18.03.18 - 12:15
(20) 1с  - доступно и всеръёз!


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует