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