понедельник, 23 мая 2022 г.

1C УдалитьПустыеСтрокиТЧ()

Удивительно, но некоторые пользователи не обращают внимание на пустую строку, оставленную в документе. Для одного документа процедура решается перебором перед записью, но у меня народ косячит исправно в большинстве ТЧ, поэтому было решено описать более-менее универсальную процедуру:


// Процедура - Удалить пустые строки ТЧ
//
// Параметры:
//	ДокументОбъект - ЛюбойДокумент - 
//  СтруктураТЧ	 - структура - представление ключа - имя тч
//			     - значение ключа -  массив имен полей для проверки на пустоту
//
&НаСервере
Процедура УдалитьПустыеСтрокиТЧ(ДокументОбъект,СтруктураТЧ) Экспорт
	Для каждого ТЧ из СтруктураТЧ Цикл
		ИмяТЧ=ТЧ.Ключ;
		Если ДокументОбъект.метаданные().ТабличныеЧасти.найти(ИмяТЧ)=Неопределено Тогда
			Сообщить(СтрШаблон("ТЧ с именем ""%1"" в документе ""%2"" не найдена!",ТЧ.Ключ,ТипЗнч(ДокументОбъект)));
			Продолжить;
		КонецЕсли;
		ТЧДок=ДокументОбъект[ИмяТЧ];
		МассивИменРеквизитов=ТЧ.Значение;
		Если МассивИменРеквизитов.Количество()=0 ИЛИ ТЧДок.Количество()=0 Тогда
			Продолжить;
		КонецЕсли;
		
		Для каждого ИмяРеквизита из МассивИменРеквизитов Цикл
			Если ДокументОбъект.метаданные().ТабличныеЧасти[ИмяТЧ].Реквизиты.найти(ИмяРеквизита)=Неопределено Тогда
				Сообщить(СтрШаблон("Реквизит с именем ""%1"" в ТЧ ""%2"" документа ""%3"" не найден!",ТЧ.Ключ,ИмяРеквизита,ТипЗнч(ДокументОбъект)));
				Продолжить;
			КонецЕсли;
			МаксИндексТЧ=ТЧДок.Количество()-1;
			Пока МаксИндексТЧ >= 0 Цикл
				Если НЕ ЗначениеЗаполнено(ТЧДок[МаксИндексТЧ][ИмяРеквизита]) Тогда
					ТЧДок.Удалить(ТЧДок[МаксИндексТЧ]);
				КонецЕсли;
				МаксИндексТЧ=МаксИндексТЧ-1;
			КонецЦикла;
		КонецЦикла;
	КонецЦикла;
КонецПроцедуры

И вызываем ПередЗаписью:


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

Вариант перебора не по индексу ТЧ не подходит, так как изменяется размерность для цикла и возможны пропуски. Средний вариант был через НайтиСтроки() с пустыми ("" или 0) значениями или значениями типа ПустаяСсылка(), но он не поддерживает несколько поисковых значений, это решается повторным перебором, а вот определение пустой ссылки по составному типу данных вызывает затруднение. Короче остальные варианты слишком громоздки.

Комментариев нет:

Отправить комментарий