Имя: Пароль:
1C
1С v8
Как в форме в обработчике ПередЗакрытием() узнать что было нажато: OK или Cancel
0 xintrea
 
12.11.12
13:11
Здравствуйте!


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

На форме есть две стандартные командные кнопки - OK и Cancel.

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

Как это сделать?
1 Defender aka LINN
 
12.11.12
13:15
Для зачем?
2 Ork
 
12.11.12
13:16
(0) Прописать этим кнопкам свои обработчики.
Останется вопрос с Ctrl+F4 & Alt+F4.
3 dva1c
 
12.11.12
13:17
Простой вопрос в (1). А действительно, зачем?
4 Defender aka LINN
 
12.11.12
13:20
(2) А "ОК" и "Записать, Закрыть" - это одинаковые действия, или нет?
5 dva1c
 
12.11.12
13:22
(4) Нет.
6 dva1c
 
12.11.12
13:24
+(5) Ок - Записать, Провести, Закрыть
    Записать - Записать
    Закрыть - Закрыть
7 Ork
 
12.11.12
13:24
(4) В случае с вопросом о ДВУХ КОНКРЕТНЫХ кнопках - вопрос не имеет смысла.
8 dva1c
 
12.11.12
13:27
(7)+1
9 xintrea
 
12.11.12
13:36
(1)

Я использую формы как обычные визуальные компоненты (как в Qt например), поля формы не привязываются к реквизитам.

И нужно проверить некоторые поля на заполнение. Установка свойства АвтоОтметкаНезаполненного не помогает, так как она только помечает поле, поле становится подчеркнутым, но при нажатии Ok никакого сообщения не появляется.

Авто отметка сработает только тогда, когда поле связано с реквизитом, обязательным для заполнения. А у меня поле с таким реквизитом не связано.

Я сделал такую функцию:

//Проверка на заполненность реквизитов формы, для которых
// установлен признак АвтоОтметкаНезаполненного
Функция ПроверкаАвтоОтметкаНезаполненного() Экспорт

Результат = Ложь;

Для каждого Элемент Из ЭтаФорма.Элементы Цикл
 
    Если ТипЗнч(Элемент) = Тип("ПолеВвода") Тогда
         Если Элемент.АвтоОтметкаНезаполненного И ЗначениеНеЗаполнено(Элемент.Значение) Тогда
            Сообщить("Необходимо заполнить обязательное поле ввода: " + Элемент.Подсказка, СтатусСообщения.Внимание);
            Результат = Истина;
        КонецЕсли;
       
    ИначеЕсли ТипЗнч(Элемент) = Тип("ТабличноеПоле") Тогда
       
        СоставПоля = Элемент.Значение;
        Колонки = Элемент.Колонки;
        Попытка // для ДокументСписок вызовет исключение

            Для каждого Строка Из СоставПоля Цикл
                Для каждого Колонка Из Колонки Цикл
                    Если ТипЗнч(Колонка.ЭлементУправления) = Тип("ПолеВвода") Тогда
                        Если Колонка.АвтоОтметкаНезаполненного И ЗначениеНеЗаполнено(Строка[Колонка.Данные]) Тогда
                            Сообщить("Необходимо заполнить обязательное поле ввода табличной части: " + Колонка.ТекстШапки, СтатусСообщения.Внимание);
                            Результат = Истина;
                        КонецЕсли;
                    КонецЕсли;
                КонецЦикла;
            КонецЦикла;
        Исключение
        КонецПопытки;
           
    КонецЕсли;

КонецЦикла;

Возврат Результат;
КонецФункции

Её нужно вызывать при нажатии Ok, и если она возвратит False, форму не закрывать и показать сообщение что надо бы заполнить поле.

Проблема в том, что у стандартных кнопок OK и Cancel нет обработчиков.

Видимо, придется делать самодельные кнопки.
10 Cube
 
12.11.12
13:39
(9) Не оно?

УправляемаяФорма (ManagedForm)
ОбработкаПроверкиЗаполненияНаСервере (FillCheckProcessingAtServer)
Синтаксис:

ОбработкаПроверкиЗаполненияНаСервере(<Отказ>, <ПроверяемыеРеквизиты>)
Параметры:

<Отказ>

Тип: Булево.
Признак отказа от записи. Если в теле процедуры-обработчика установить данному параметру значение Истина, то запись выполнена не будет.
Значение по умолчанию: Ложь
<ПроверяемыеРеквизиты>

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

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

// Проверим заполненность реквизита "Покупатель"
Если Не ЗначениеЗаполнено(Покупатель) Тогда
   
   // Если он не заполнен, сообщим об этом пользователю
   Сообщение = Новый СообщениеПользователю();
   Сообщение.Текст = "Не указан Покупатель, на которого выписывается товарная накладная!";
   Сообщение.Поле = "Покупатель";
   Сообщение.Сообщить();
       
   // Сообщим платформе, что мы сами обработали проверку заполнения реквизита "Покупатель"
   ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("Покупатель"));
   // Так как информация не консистентна, то продолжать работу дальше смысла нет
   Отказ = Истина;
       
КонецЕсли;
   
КонецПроцедуры
11 Defender aka LINN
 
12.11.12
13:41
(6) Для проведенного документа, к примеру, Записать, Закрыть = ОК. Для справочника - тоже.
(9) Не вижу никаких причин,Ю почему бы благородному дону не использовать реквизиты и функционал платформы.