Показать вопрос перед удалением строки таблицы значений управляемой формы 1с 8.3

1. VadimTer 15.08.21 17:34 Сейчас в теме
Перед удалением строки таблицы значений или табличной части управляемой формы в 1с 8.3 нам необходимо задать вопрос о необходимости данной операции.
Данную операцию необходимо выполнять в обработчике ПередУдалением(Элемент, Отказ):

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


Если в данной процедуре не задать значение "Отказ = Истина", то при попытки удаления строки, данная строка удалится, в любом случае, не дождавшись ответа на вопрос.
Надо также отметить, что обработчик ПередУдалением(Элемент, Отказ) вызывается именно при действиях пользователя. Но программно мы можем обойти этот обработчик, чтобы удалить строку как результат положительного ответа на вопрос об удалении.
Создаем следующую процедуру результата ответа на вопрос:

&НаКлиенте
Процедура РезультатОтветаНаВопросОбУдаленииСтроки(Результат, Параметры) Экспорт

	 Если Результат = КодВозвратаДиалога.Да Тогда
		 
		 ИдентификаторСтроки = Параметры.ИдентификаторУдаляемойСтроки; 
		   УдалениеВариантаПеревода(ИдентификаторСтроки);	
	 
	 КонецЕсли;

КонецПроцедуры // ()

Далее действия по удалению строки выполняем на сервере:

&НаСервере
Процедура УдалениеВариантаПеревода(ИдентификаторСтроки)

	НайденнаяУдаляемаяСтрока = ТаблицаЗначений.НайтиПоИдентификатору(ИдентификаторСтроки);
	ТаблицаЗначений.Удалить(НайденнаяУдаляемаяСтрока);  //ТаблицаЗначений имеет тип "ДанныеФормыКоллекция"
      
		
КонецПроцедуры // УдалениеВариантаПеревода()
Показать


После представленного серверного вызова при положительном ответе нужная строка будет удалена из таблицы значений
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. spacecraft 15.08.21 18:16 Сейчас в теме
(1) зачем такие сложности?
Можно проще
&НаКлиенте
Процедура ТаблицаЗначенийПередУдалением(Элемент, Отказ)
	Отказ = Истина;
	ПараметрыОповещения = Новый Структура("Элемент", Элемент.ТекущиеДанные);
	ОписаниеЗавершения = Новый ОписаниеОповещения("ПоказатьВопросЗавершение", ЭтаФорма, ПараметрыОповещения);
	ПоказатьВопрос(ОписаниеЗавершения, "Вы действительно хотите удалить строку?", РежимДиалогаВопрос.ДаНет,,,"Вопрос об удалении строки");
КонецПроцедуры

&НаКлиенте 
Процедура ПоказатьВопросЗавершение(Результат, ДопПараметры) Экспорт
	Если Результат = КодВозвратаДиалога.Да Тогда
		ТаблицаЗначений.Удалить(ДопПараметры.Элемент);
	КонецЕсли;
КонецПроцедуры
Показать
6. VadimTer 16.08.21 00:57 Сейчас в теме
(1) Лучше будет использовать более универсальный вариант, когда необходимо выполнить удаление нескольких выделенных строк:

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



&НаКлиенте
Процедура РезультатОтветаНаВопросОбУдаленииСтроки(Результат, Параметры) Экспорт

	Если Результат = КодВозвратаДиалога.Да Тогда
		
		МассивИдентификаторовВыделенныхСтрокДляУдаления = Параметры.МассивИдентификаторовВыделенныхСтрокДляУдаления;
				
		Для каждого Идентификатор Из МассивИдентификаторовВыделенныхСтрокДляУдаления Цикл
		
НайденнаяУдаляемаяСтрока = ТаблицаЗначений.НайтиПоИдентификатору(Идентификатор);		
			
			ТаблицаЗначений.Удалить(НайденнаяУдаляемаяСтрока); 
			
		КонецЦикла;
					
	КонецЕсли;

КонецПроцедуры 
Показать
into; user591389_aska_rabota; Andy_NTG; +3 Ответить
8. s.sintsov 248 12.04.23 15:12 Сейчас в теме
(6) У вас визуализация выделенных строк слетает перед выдачей вопроса, и на большом количестве строк данный механизм очень сильно тормозит работу, т.к. в цикле каждый раз позиционирует текущую строку. Ниже (7) чуть доработал ваше решение...
12. arabesca 07.02.24 17:32 Сейчас в теме
(6) немного улучшил:

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

&НаКлиенте
Процедура РезультатОтветаНаВопросОбУдаленииСтроки(Результат, Параметры) Экспорт
	
	Если Результат = КодВозвратаДиалога.Да Тогда
		СтрокиДляУдаления = Новый Массив;
		Для каждого Идентификатор Из Параметры.ВыделенныеСтроки Цикл
			НайденнаяУдаляемаяСтрока = СписокДокументов.НайтиПоИдентификатору(Идентификатор);
			СтрокиДляУдаления.Добавить(НайденнаяУдаляемаяСтрока);
		КонецЦикла;
		
		Для каждого УдаляемаяСтрока Из СтрокиДляУдаления Цикл
			СписокДокументов.Удалить(УдаляемаяСтрока); 
		КонецЦикла;
	КонецЕсли;
	
КонецПроцедуры
Показать
3. Alex_E 2355 15.08.21 18:23 Сейчас в теме
Что это было? Вопрос? Ответ? А у нас в квартире газ?
4. kasper076 105 15.08.21 18:40 Сейчас в теме
(3) Если бы чел создал публикацию, на него та же наехали бы. А так это был пример кода.
5. Alex_E 2355 15.08.21 20:10 Сейчас в теме
(4) Ааааа, ну тады понятно........))))))))))
kasper076; +1 Ответить
7. пользователь 12.04.23 14:46
Сообщение было скрыто модератором.
...
9. пользователь 12.04.23 15:28
Сообщение было скрыто модератором.
...
10. пользователь 12.04.23 19:17
Сообщение было скрыто модератором.
...
11. пользователь 12.04.23 20:05
Сообщение было скрыто модератором.
...
13. soldatkin 11 15.03.24 11:22 Сейчас в теме
Оставьте свое сообщение

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