Заполнение "пустых" строк табличной части

Данный алгоритм предназначен для заполнения строк табличной части элементами по условию пустоты. Если в табличной части существуют "пустые записи" ( в данном примере строки в колонках которых значение не заполнено), то они заполнятся при выборе из формы. Например строки с номерами 2, 5, 12 не заполнены. При пользовательском выборе элементов, значения вставятся соответственно в 2, 5, 12. А не в конец списка. С точки зрения клиент-сервер, алгоритм не совсем оптимизирован, но достаточно универсален.

&НаКлиенте
Процедура Подбор(Команда)
	
	ПараметрыФормы = Новый Структура("МножественныйВыбор, ЗакрыватьПриВыборе",Истина,Ложь);
	ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора",ПараметрыФормы,Элементы.ТаблицаЗначений);
	// реквизиты: 
	//Таблица значение - ТаблицаЗначений ( Одна колонка "Материал" )
	//Команда - " Подбор "
	
КонецПроцедуры

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

&НаКлиенте
Процедура ТаблицаЗначенийОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
		
	МассивПустыхСтрок = ПоискПустыхСтрок(ТаблицаЗначений,ВыбранноеЗначение.Количество()); // передаем саму таблицу, а также Кол выбранных элементов для того, чтобы не искать все пустые строки, а лишь определенное кол
	
	Для Индекс = 0 По ВыбранноеЗначение.ВГраница() Цикл
		Если Индекс < МассивПустыхСтрок.Количество() Тогда // Если выбранных значений меньше, чем пустых строк, то ..., иначе, исключительный случай, когда все пустые строки заполнились  
			Строка = ТаблицаЗначений.Вставить(МассивПустыхСтрок[Индекс]); // Вставляем запись вместо пустой, вытесняя пустую запись вниз ( увеличиваем индекс пустой записи на 1, так как работает функция ВСТАВИТЬ() )
			Строка.Материал = ВыбранноеЗначение[Индекс]; // Заполняем реквизит табличной части выбранным значением 
			ТаблицаЗначений.Удалить(МассивПустыхСтрок[Индекс]+1); // Удаляем пустую запись, которая ниже добавленной на 1 
		Иначе
			Строка = ТаблицаЗначений.Добавить(); // Тот самый случай, когда кол выбранных записей больше, чем пустых строк. В этом случаи  добавляем записи в конец табличной части
			Строка.Материал = ВыбранноеЗначение[Индекс];
		КонецЕсли;
	КонецЦикла;
	
	
КонецПроцедуры
0

См. также

Расчет суммы в строке табличной части

ИнициализироватьСвойстваТабличныхЧастей (БСП)

ПолучитьНаборыЗначенийДоступаТабличнойЧасти (БСП)

Универсальная процедура проверки на дубли строк в табличной части документа

Раскраска строки табличной части документа (обычные формы) по условию

ПоказатьФормуЗагрузки (БСП)

ПутьКТабличнойЧасти (БСП)

ПоказатьФормуЗаполненияСсылок (БСП)

СкопироватьСтрокиВБуферОбмена (БСП)

Модератору