Имя: Пароль:
1C
1С v8
Как узнать, какую кнопку нажал пользователь?
0 bahtik
 
10.07.14
14:21
Здравствуйте!
Такая задача. При интерактивном проведении документа необходимо проверить некое условие, задать вопрос пользователю и в зависимости от его ответа либо выполнить проведение, либо отменить команду. Т.к. режим использования модальности отключен, то такой код:


&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    
    Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
        Если Не ПараметрыЗаписи.Свойство("ВыборВидаРасчетаПодтвержден") Тогда
            Если Объект.ВидРасчетов = ПредопределенноеЗначение("Перечисление.ВидыРасчетов.Наличными") И рфОстатокНаДепозите >= 10 Тогда // 10 грн - чтобы не спрашивало в случаях, когда на депозите какая-то мелочь.
                Отказ = Истина;
                ОписаниеОповещения = Новый ОписаниеОповещения("ОтветНаВопросОСпособеРасчетаПолучен", ЭтаФорма, ПараметрыЗаписи);
                Если рфОстатокНаДепозите >= Объект.ПереченьУслугМойки.Итог("Сумма") + Объект.ПереченьУслугХимчистки.Итог("Сумма") + Объект.ПереченьУслугШиномонтажа.Итог("Сумма") Тогда
                    ТекстВопроса = "У клиента имеется достаточно средств на депозите, чтобы оплатить оказанные ему услуги. Клиент действительно хочет рассчитаться наличными?";
                Иначе
                    ТекстВопроса = "У клиента имеются средства на депозите для частичной оплаты оказанных ему услуг. Клиент действительно хочет оплатить всю сумма наличными?";
                КонецЕсли;
                ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

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


Все работает, но возникает проблема, что если пользователь нажал "Провести и закрыть", то после его утвердительного ответа документ проведется но форма не закроется. В общем, нужно узнать, какую кнопку нажал пользователь: "Провести и закрыть" или просто "Провести". Как это сделать?
1 Лефмихалыч
 
10.07.14
14:24
(0) убрать системные кнопки и нарисовать свои
2 Ёпрст
 
10.07.14
14:24
примитив - записать в переменную что либо в принажатиикнопки. потом смотри эту переменную где угодно
3 Лефмихалыч
 
10.07.14
14:24
Но так делают только мудаки.

Ответы на такие вопросы должны храниться в документе, а для этого предусмотрены реквизиты объектов и проверки заполнения
4 bahtik
 
10.07.14
14:24
Это понятно. А стандартных механизмов никаких нет? Что-то вроде кода возврата диалога и т.п.?
5 bahtik
 
10.07.14
14:26
(3) Как тут использовать реквизиты объектов и проверки заполнения? Нужно задать уточняющий вопрос, а не проверять, все ли правильно заполнил пользователь.
6 Fish
 
10.07.14
14:27
(4) Когда же люди научатся читать СП?
"Глобальный контекст (Global context)
ПоказатьВопрос (ShowQueryBox)
Синтаксис:

ПоказатьВопрос(<ОписаниеОповещенияОЗавершении>, <ТекстВопроса>, <Кнопки>, <Таймаут>, <КнопкаПоУмолчанию>, <Заголовок>, <КнопкаТаймаута>)
Параметры:

<ОписаниеОповещенияОЗавершении> (обязательный)

Тип: ОписаниеОповещения.
Содержит описание процедуры, которая будет вызвана после закрытия окна ввода значения со следующими параметрами:
<РезультатВопроса> - результат выбора пользователя: значение системного перечисления или значение, связанное с нажатой кнопкой. В случае закрытия диалога по истечении времени - значение Таймаут,
<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения"
8 bahtik
 
10.07.14
14:32
(6) Ну и? Читать умею вроде. И в курсе про дополнительные параметры. И если посмотришь на код, то я их там и использую. И вопрос как раз и заключается в том, как узнать, что нажал пользователь, чтобы передать это значение в дополнительные параметры.
9 Fragster
 
гуру
10.07.14
14:33
10 bahtik
 
10.07.14
14:33
Еще раз повторяю, если кто неправильно понял мой вопрос: нужно просто узнать, нажал пользователь "Провести и закрыть" или "Провести". Еще до самого вопроса.
11 Лефмихалыч
 
10.07.14
14:35
(5) ниух все уточняющие вопросы. Если для проведения нужно какое-то значение, его нужно хранить в документе и не давать проводить, пока значение не заполнено.
12 Лефмихалыч
 
10.07.14
14:35
(10) неа, нужно тебе что-то другое, а это просто то, *как* ты придумал этого добиться
13 bahtik
 
10.07.14
14:38
(11) Да причем тут заполнено или не заполнено? Еще раз: пользователь выбрал, что клиент рассчитывается наличными, но при этом на депозите клиента есть бабло. Вот я и спрашиваю пользователя, а клиент реально не хочет использовать бабло с депозита, или это ты забыл изменить режим оплаты с "наличными" на "с депозита"? Никаких тут реквизитов и т.п.
14 bahtik
 
10.07.14
14:40
Если пользователь отвечает "Да" (т.е. "ну да, ничего я не забыл, просто клиент так хочет"), то так и продолжаем проводить документ. А если пользователь выбирает "нет" (т.е. "ой, да, забыл, ща выберу, что надо"), то отменяем команду и позволяем пользователю подумать и выбрать другой режим оплаты.
15 Fragster
 
гуру
10.07.14
14:41
(10) см (9), поиск по "Вопрос в обработчике формы ПередЗаписью "
16 Fragster
 
гуру
10.07.14
14:41
в обсуждении на партнерском сказали не выпендриваться и сделать свои кнопки.
17 bahtik
 
10.07.14
14:43
(9) Блин, ну и зачем мне про "режим модальности". Короче, упрощаю вопрос. Просто ситуация: пользователь нажал одну из двух кнопок в документе, либо "Провести и закрыть", либо "Провести". Как узнать какую из них?
18 Лефмихалыч
 
10.07.14
14:44
(17) ни как. Удалить генерируемые системой кнопки и сделай свои, которые будут вызывать нужные тебе методы
19 bahtik
 
10.07.14
14:44
(6) Когда уже ты научишься читать вопрос и понимать его?
20 bahtik
 
10.07.14
14:46
(18) Ну это я и так понимаю, просто думал, что должны же быть какие-то стандартные механизмы.
21 Fragster
 
гуру
10.07.14
14:47
(17) потому что в той статье написано, цитата:

В обработчике события формы ПередЗаписью также может возникнуть потребность задать вопрос. Как и в предыдущем примере. Однако здесь вопрос так просто не решается. Отличие заключается в следующем.

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

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

Поэтому тут можно предложить три варианта, но все они, к сожалению, обладают недостатками:

    Изменить логику прикладного решения так, чтобы не было диалога с пользователем в этом обработчике. Это не всегда возможно;
    В обработке оповещения с помощью собственной блокирующей формы задавать пользователю развернутый вопрос, предполагающий точное описание дальнейших действий: Отказаться?, Только записать?, Записать и закрыть? Это может выглядеть не очень красиво, ведь пользователь уже нажал "Записать и закрыть", а его опять об этом спрашивают;
    Не использовать стандартные команды формы Записать, "Записать и закрыть". Вместо них создать собственные команды, в которых и выполнять необходимые алгоритмы. Создание собственных команд потребует дополнительных трудозатрат.
22 bahtik
 
10.07.14
14:50
(21) Понятно. Т.е. стандартного механизма нет. Печально. Ладно, придется делать свои кнопки... Спасибо.