Каталог решений - Переопределение кнопки "Провести и закрыть"

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

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

В наличии

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

Категория:

Описание

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

Имеется: Документ с реквизитами НомерВх и ДатаВх, а также основная форма документа

Зачада: Перед записью необходимо задать вопрос пользователю и по результату ответа продолжить запись, либо не продолжать.

Решение:

В свойствах формы редактируем список команд: снимаем галки с команд "Провести и закрыть", "Записать", "Провести".

Для командной панели убираем признак "Автозаполнение". Добавляем на форму свои команды, а также добавляем группу с типовыми командами. Далее описываем код для созданных команд:

Далее описываем код команд и проверку на дубли


&НаКлиенте
Процедура КомандаЗаписать(Команда)
	ПараметрыЗаписи = Новый Структура("РежимЗаписи, Закрыть", РежимЗаписиДокумента.Запись, Ложь);
	ВыполнитьПроверкуЗадатьВопросПродолжитьЗапись(ПараметрыЗаписи);
КонецПроцедуры

&НаКлиенте
Процедура КомандаПровести(Команда)
	ПараметрыЗаписи = Новый Структура("РежимЗаписи, Закрыть", РежимЗаписиДокумента.Проведение, Ложь);
	ВыполнитьПроверкуЗадатьВопросПродолжитьЗапись(ПараметрыЗаписи);
КонецПроцедуры

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

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


&НаКлиенте
Процедура ВыполнитьПроверкуЗадатьВопросПродолжитьЗапись(ПараметрыЗаписи)

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

КонецПроцедуры // ВыполнитьПроверкуЗадатьВопросПродолжитьЗапись(ПараметрыЗаписи)

Собственно, процедура самой проверки

&НаСервереБезКонтекста
Функция ПроверимНаНаличиеДублей(ТекДатаВх, ТекНомерВх, Ссылка)
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Тестовый.Ссылка
		|ИЗ
		|	Документ.Тестовый КАК Тестовый
		|ГДЕ
		|	Тестовый.НомерВх = &НомерВх
		|	И Тестовый.ДатаВх = &ДатаВх
		|	И Тестовый.Ссылка <> &Ссылка";
	Запрос.УстановитьПараметр("ДатаВх", ТекДатаВх);
	Запрос.УстановитьПараметр("НомерВх", ТекНомерВх);
	Запрос.УстановитьПараметр("Ссылка", Ссылка);
	Результат = Запрос.Выполнить();
	//Если запрос содержит данные, значит существует дубль по дату и номеру Вх
	Возврат НЕ Результат.Пустой();
КонецФункции // ПроверимНаНаличиеДублей()

Далее процедура обработки оповещения, в которой происходит запись и закрытие документа (если он должен закрыться)

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

Остается ещё один момент: документ может быть записан при закрытии на крестик, тогда будут отрабатывать только типовые механизмы записи документа. Для себя решил это следующим образом (возможно, не очень правильно):

Добавлен реквизит формыВ процедуре ПередЗаписью следующий код

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

В процедуре ПриСозданииНаСервере устанавливаем флаг в положение ИСТИНА

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	КонтролироватьДубли = Истина;
КонецПроцедуры

Вот и всё, типовые команды заменены на наши и можно задавать вопросы пользователю до записи документа. Надеюсь статья будет кому-то полезна. Самого на написание статьи подтолкнула ситуация, когда при нажатии на кнопку "Провести и закрыть" выводится вопрос, подтверждаю запись, но документ не закрывается, закрыть документ можно только по крестику.

С удовольствием почитаю критику.

has been added to your cart:
Оформление заказа