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