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