Как программно отличить "Записать" и "Записать и закрыть"?

1. Fe9_min 50 28.07.22 10:21 Сейчас в теме
День добрый!
Как на форме программно отличить нажатие кнопки "Записать" от "Записать и закрыть" например, в процедурах ПриЗаписи, ПередЗаписью или ещё раньше?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. lmnlmn 69 28.07.22 10:40 Сейчас в теме
(1) На сколько я знаю, стандартные команды не перехватить. Любопытно узнать вашу задачу где подобное прогнозирование потребовалось.
13. Aleksandr_prof 197 17.10.23 12:45 Сейчас в теме
(1) У вас нашлось решение? Тоже ищу
2. laperuz 46 28.07.22 10:27 Сейчас в теме
Убрать стандартные кнопки и сделать свои.
3. soft_wind 28.07.22 10:28 Сейчас в теме
(1) а самый главный вопрос:
А зачем это все определять?
6. Fe9_min 50 28.07.22 11:40 Сейчас в теме
7. ZergKRSK 130 28.07.22 11:44 Сейчас в теме
5. soft_wind 28.07.22 10:55 Сейчас в теме
(1) в общем, на форме при нажатии на эти кнопки срабатывают несколько событий
часть совпадает, часть - нет,
определите нужное для себя событие и используйте.
8. yaroslav.artem 28.07.22 11:52 Сейчас в теме
Не так давно сталкивался с подобной задачей. В итоге только свои кнопки рисовать вместо стандартных с записью доп параметров.
Создаешь переменную вверху модуля формы, что нибудь типо
перем мЭтоЗаписьИЗакрытие;
При нажатии своей кнопки мЭтоЗаписьИЗакрытие = Истина или Ложь, ну и соответсвенно ПередЗаписью смотришь в значение это переменной, пишешь условия.
9. Drivingblind 231 01.08.22 06:59 Сейчас в теме
В типовых конфигурациях УТ/КА/ЕРП видел следующий подход: переопределяются платформенные кнопки "Записать", "Провести", "Провести и закрыть". Прикрепляю скриншоты формы документа "Заказ клиента"
Прикрепленные файлы:
10. MaCCapAkIII 21.03.23 11:51 Сейчас в теме
Приветствую. Работаю с асинхронным диалогом с пользователем в модуле формы документа. Диалог вызывается из процедуры ПередЗаписью и в зависимости от выбора ответа пользователя документ либо записывается (записывается и закрывается форма), либо записи не происходит и форма остается видимой. Так вот платформенная команда Записать и закрыть в этом случае работать перестает, причину понять не могу, происходит только запись документа. Выходит, что если я вмешиваюсь в стандартное поведение процедуры ПередЗаписью (отказ = Истина для работы с асинхронным диалогом), а потом повторно вызываю Запись() - происходит именно запись без закрытия. Поэтому есть вопрос - как определить, что пользователь нажал именно Записать и закрыть, а не просто Закрыть?
11. Sashares 35 21.03.23 13:45 Сейчас в теме
(10)Никак, ничего не изменилось.
Добавить свою кнопку вместо стандартной.
12. Aleksandr_prof 197 17.10.23 12:45 Сейчас в теме
(10) Вы нашли решение? Тоже ищу
14. MaCCapAkIII 17.10.23 17:45 Сейчас в теме
(12) Сделал как советовал 11, переопределил штатную команду своей и использовал переменную для хранения булева значения закрывать форму или нет.
15. kostaen 03.11.23 17:36 Сейчас в теме
1. При создании формы на севере переопределил команду у уже имеющейся кнопки "Записать и закрыть":

// Создаю свою команду
ИмяКомандыЗаписатьИЗакрыть = "ЗаписатьИЗакрыть";
КомандаЗаписатьИЗакрыть = ЭтаФорма.Команды.Добавить(ИмяКомандыЗаписатьИЗакрыть);

// Описываю действие, которое будет вызываться при выполнении команды
КомандаЗаписатьИЗакрыть.Действие = "Подключаемый_" + ИмяКомандыЗаписатьИЗакрыть;

// Присваиваю команду уже имеющейся кнопке
КоманднаяПанель.ПодчиненныеЭлементы.ФормаЗаписатьИЗакрыть.ИмяКоманды = ИмяКомандыЗаписатьИЗакрыть;

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


2. В процедуре, которую описал в действии команды добавил:

// Свойство в параметрах записи
ЭтаФорма.Записать(Новый Структура("ЗакрыватьПослеЗаписи"));


3. В процедуре "ПередЗаписью":

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

//Описываю вопрос и оповещение к нему	
		ОписаниеОповещенияПередЗаписью = Новый ОписаниеОповещения("ПередЗаписьюПродолжение",ЭтаФорма,ДополнительныеПараметры);
		
                ТекстВопроса = НСтр("ru = 'Какой-то вопрос?'");
		ПоказатьВопрос(ОписаниеОповещенияПередЗаписью,ТекстВопроса,РежимДиалогаВопрос.ДаНет);
		
	КонецЕсли;
Показать


4. Процедура "ПередЗаписьюПродолжение" (описана в оповещении к вопросу)

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

// Пробрасываем параметр о том что форма будет закрыта.
	Если ДополнительныеПараметры.ЗакрыватьПослеЗаписи Тогда
		ПараметрыЗаписи.Вставить("ЗакрыватьПослеЗаписи");
	КонецЕсли;
	ЭтаФорма.Записать(ПараметрыЗаписи);
Показать


5. В процедуре "ПослеЗаписи"

Если ПараметрыЗаписи.Свойство("ЗакрыватьПослеЗаписи") Тогда
	ЭтаФорма.Закрыть();
КонецЕсли;
16. Djo82 11 08.08.24 07:27 Сейчас в теме
Для моей задачи сделал так, в расширении. Спасибо kostaen.
&НаСервере
&Вместо("ПриСозданииНаСервере")
Процедура Расширение_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	//свой код
	////
	
	ИмяКомандыЗаписатьИЗакрыть = "ЗаписатьИЗакрыть";
	КомандаЗаписатьИЗакрыть = ЭтаФорма.Команды.Добавить(ИмяКомандыЗаписатьИЗакрыть);
	КомандаЗаписатьИЗакрыть.Заголовок = НСтр("ru = 'Записать и закрыть'");
	
	// Описываю действие, которое будет вызываться при выполнении команды
	КомандаЗаписатьИЗакрыть.Действие = "Подключаемый_" + ИмяКомандыЗаписатьИЗакрыть;
	
	// Присваиваю команду уже имеющейся кнопке
	КоманднаяПанель.ПодчиненныеЭлементы.ФормаЗаписатьИЗакрыть.ИмяКоманды = ИмяКомандыЗаписатьИЗакрыть;
	
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ЗаписатьИЗакрыть(Команда)

	ПараметрыЗаписи = Новый Структура;
	ПараметрыЗаписи.Вставить("Закрыть", Истина);

	ЭтаФорма.Записать(ПараметрыЗаписи);
	
КонецПроцедуры

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

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


&НаКлиенте
&Перед("ПередЗаписью")
Процедура Расширение_ПередЗаписью(Отказ, ПараметрыЗаписи)
	
	Если Не Отказ Тогда
		Если Не ПараметрыЗаписи.Свойство("ЗаписатьПослеВопроса") Тогда
			
			ЗадатьВопрос = Ложь;
			Расширение_ПроверитьНаДубли(ЗадатьВопрос);
			Если ЗадатьВопрос Тогда
				Отказ = Истина;
				
				Оповещение = Новый ОписаниеОповещения("Расширение_ПослеЗакрытияВопроса", ЭтотОбъект, ПараметрыЗаписи);
				ПоказатьВопрос(Оповещение, НСтр("ru = 'Подобный договор существует!
				|ИСПОЛЬЗОВАТЬ ИМЕЮЩИЙСЯ ДОГОВОР?'"), РежимДиалогаВопрос.ДаНет, 0);
				Возврат;
			КонецЕсли;
		КонецЕсли; 
		Если ПараметрыЗаписи.Свойство("Закрыть", Истина) Тогда
			
			Закрыть();
			
			Возврат;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры
Показать
17. Djo82 11 08.08.24 09:17 Сейчас в теме
(16) поправил немного код
&НаСервере
&Вместо("ПриСозданииНаСервере")
Процедура Расширение_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	//свой код
	////
	
	ИмяКомандыЗаписатьИЗакрыть = "ЗаписатьИЗакрыть";
	КомандаЗаписатьИЗакрыть = ЭтаФорма.Команды.Добавить(ИмяКомандыЗаписатьИЗакрыть);
	КомандаЗаписатьИЗакрыть.Заголовок = НСтр("ru = 'Записать и закрыть'");
	
	// Описываю действие, которое будет вызываться при выполнении команды
	КомандаЗаписатьИЗакрыть.Действие = "Подключаемый_" + ИмяКомандыЗаписатьИЗакрыть;
	
	// Присваиваю команду уже имеющейся кнопке
	КоманднаяПанель.ПодчиненныеЭлементы.ФормаЗаписатьИЗакрыть.ИмяКоманды = ИмяКомандыЗаписатьИЗакрыть;
	
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ЗаписатьИЗакрыть(Команда)

	ПараметрыЗаписи = Новый Структура;
	ПараметрыЗаписи.Вставить("Закрыть", Истина);

	ЭтаФорма.Записать(ПараметрыЗаписи);
	
КонецПроцедуры

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

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


&НаКлиенте
&Перед("ПередЗаписью")
Процедура Расширение_ПередЗаписью(Отказ, ПараметрыЗаписи)
	
	Если Не Отказ Тогда
		Если Не ПараметрыЗаписи.Свойство("ЗаписатьПослеВопроса") Тогда
			
			ЗадатьВопрос = Ложь;
			Расширение_ПроверитьНаДубли(ЗадатьВопрос);
			Если ЗадатьВопрос Тогда
				Отказ = Истина;
				
				Оповещение = Новый ОписаниеОповещения("Расширение_ПослеЗакрытияВопроса", ЭтотОбъект, ПараметрыЗаписи);
				ПоказатьВопрос(Оповещение, НСтр("ru = 'Подобный договор существует!
				|ИСПОЛЬЗОВАТЬ ИМЕЮЩИЙСЯ ДОГОВОР?'"), РежимДиалогаВопрос.ДаНет, 0);
				Возврат;
			КонецЕсли;
		КонецЕсли; 
		
	КонецЕсли;
	
КонецПроцедуры
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот