Вводные
Требования описаны в первой части статьи //infostart.ru/1c/articles/1307929/
Обработку цен, остатков выделяю в отдельный поток описанный в //infostart.ru/1c/articles/1256276/
Вариант решения
Дополнения по структуре данных обработки
По причине того что структура групп в исходных данных реализована в виде нескольких колонок, после загрузки для каждой позиции рассчитал и записал идентификатор группы.
Функция ПолучитьМассивКолонокГрупп()
МассивКолонокГрупп = Новый Массив;
МассивКолонокГрупп.Добавить("Категория");
МассивКолонокГрупп.Добавить("Подкатегория1");
МассивКолонокГрупп.Добавить("Подкатегория2");
МассивКолонокГрупп.Добавить("Подкатегория3");
МассивКолонокГрупп.Добавить("Подкатегория4");
Возврат МассивКолонокГрупп;
КонецФункции
&НаСервере
Процедура ЗаполнитьИдентификаторГруппы(ТабЗначений)
МассивКолонокГрупп = ПолучитьМассивКолонокГрупп();
Для Каждого СтрТЗ Из ТабЗначений Цикл
CчСтрок = 0;
Для Каждого СтрМ Из МассивКолонокГрупп Цикл
Если НЕ ПустаяСтрока(СтрТЗ[СтрМ]) Тогда
Индекс = СтрТЗ[СтрМ];
Иначе
СтрТЗ.ИдентификаторГрупы = Индекс + "_" + Формат((CчСтрок-1), "ЧН=0; ЧГ=0");
Прервать;
КонецЕсли;
CчСтрок = CчСтрок + 1;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Для работы с номенклатурой создал Таблицу значений "ТаблицаНоменклатура" в которой добавил основные реквизиты, остальные данные преобразовал в список значений из структур (исходная функция с массивом, но реквизит формы с типом массив не создать), на мой взгляд при добавлении колонок будет большая нагрузка.
Функция ТаблицаЗначенийВМассив(ТаблицаЗначений) Экспорт
Массив = Новый СписокЗначений();
СтруктураСтрокой = "";
НужнаЗапятая = Ложь;
Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
Если НужнаЗапятая Тогда
СтруктураСтрокой = СтруктураСтрокой + ",";
КонецЕсли;
СтруктураСтрокой = СтруктураСтрокой + Колонка.Имя;
НужнаЗапятая = Истина;
КонецЦикла;
Для Каждого Строка Из ТаблицаЗначений Цикл
НоваяСтрока = Новый Структура(СтруктураСтрокой);
ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
Массив.Добавить(НоваяСтрока);
КонецЦикла;
Возврат Массив;
КонецФункции
Для состыковки полей и доп. реквизитов добавил таблицу значений "Колонки", данные из которой записываю в РС "зн_СоответствиеКолонкаДополнительныйРеквизит"
Создание номенклатуры, номенклатуры поставщика
Отображаю список номенклатуры выбранной группы.
Перед загрузкой, при клике на позицию можно просмотреть основные данные и доп. реквизиты.
Код формирования таблиц с реквизитами
&НаКлиенте
Процедура ТаблицаНоменклатураПриАктивизацииСтроки(Элемент)
ТекущиеДанные = Элементы.ТаблицаНоменклатура.ТекущиеДанные;
ТаблицаРеквизитыНоменклатуры.Очистить();
ТаблицаДополнительныеРеквизитыНоменклатуры.Очистить();
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
МассивКолонокГрупп = ПолучитьМассивКолонокГрупп();
МассивКолонокГрупп.Добавить("ИдентификаторГрупы");
СтруктураДанные = МассивТоваров[ТаблицаНоменклатура.Индекс(ТаблицаНоменклатура.НайтиПоИдентификатору(Элементы.ТаблицаНоменклатура.ТекущаяСтрока))];
Для Каждого СтрК Из СтруктураДанные.Значение Цикл
Если ПустаяСтрока(СтрК.Значение) Тогда
Продолжить;
КонецЕсли;
Если МассивКолонокГрупп.Найти(СтрК.Ключ) <> Неопределено Тогда
Продолжить;
КонецЕсли;
нСтроки = Колонки.НайтиСтроки(Новый Структура("НаименованиеКолонки", СтрК.Ключ));
Если ЗначениеЗаполнено(нСтроки[0].ДополнительныйРеквизит) Тогда
СтрР = ТаблицаДополнительныеРеквизитыНоменклатуры.Добавить();
СтрР.Наименование = СтрК.Ключ;
СтрР.Значение = СтрК.Значение;
СтрР.ДополнительныйРеквизит = нСтроки[0].ДополнительныйРеквизит;
Иначе
СтрР = ТаблицаРеквизитыНоменклатуры.Добавить();
СтрР.Наименование = СтрК.Ключ;
СтрР.Значение = СтрК.Значение;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Пользователь выбирает нужные позиции и нажимает кнопку загрузить.
Код загрузки номенклатуры и доп. реквизитов
&НаСервере
Процедура ЗагрузитьНоменклатуруНаСервере()
Для Каждого СтрН Из ТаблицаНоменклатура Цикл
Если СтрН.Загрузить
И НЕ (ЗначениеЗаполнено(СтрН.Номенклатура)
ИЛИ ЗначениеЗаполнено(СтрН.НоменклатураПоставщика))
Тогда
СтруктураДанные = МассивТоваров[ТаблицаНоменклатура.Индекс(СтрН)].Значение;
обНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
обНоменклатура.Артикул = СтруктураДанные.Артикул;
обНоменклатура.Родитель = ПолучитьРодитель(СтруктураДанные.ИдентификаторГрупы);
обНоменклатура.КатегорияНоменклатуры = ПолучитьКатегорияНоменклатуры(СтруктураДанные.ИдентификаторГрупы);
обНоменклатура.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Запас;
обНоменклатура.СтранаПроисхождения = ПолучитьСтранаПроисхождения(СтруктураДанные.Страна_производитель);
обНоменклатура.Комментарий = СтруктураДанные.Описание;
обНоменклатура.Вес = СтрЗаменить(СтруктураДанные.Вес_Кг, ",", ".");
обНоменклатура.ЕдиницаИзмерения = ПолучитьЕдиницаИзмерения(СтруктураДанные.ЕдиницаИзмерения);
обНоменклатура.СпособПополнения = Перечисления.СпособыПополненияЗапасов.Закупка;
обНоменклатура.НаправлениеДеятельности = Справочники.НаправленияДеятельности.ОсновноеНаправление;
обНоменклатура.МетодОценки = Перечисления.МетодОценкиЗапасов.FIFO;
обНоменклатура.Наименование = СтруктураДанные.НазваниеТовара;
обНоменклатура.НаименованиеПолное = СтруктураДанные.НазваниеТовара;
обНоменклатура.СчетУчетаЗатрат = ПланыСчетов.Управленческий.СебестоимостьПродаж;
обНоменклатура.СчетУчетаЗапасов = ПланыСчетов.Управленческий.ТоварыПродукция;
Для Каждого СтрКолонки Из Колонки Цикл
Если ЗначениеЗаполнено(СтрКолонки.ДополнительныйРеквизит)
И Не ПустаяСтрока(СтруктураДанные[СтрКолонки.НаименованиеКолонки])
Тогда
СтрокаДанные = СтруктураДанные[СтрКолонки.НаименованиеКолонки];
СтрДР = обНоменклатура.ДополнительныеРеквизиты.Добавить();
СтрДР.Свойство = СтрКолонки.ДополнительныйРеквизит;
Если СтрДР.Свойство.ТипЗначения = Новый ОписаниеТипов("Строка") Тогда
СтрДР.Значение = СтрокаДанные;
ИначеЕсли СтрДР.Свойство.ТипЗначения = Новый ОписаниеТипов("Строка") Тогда
СтрДР.Значение = Число(Формат(СтрокаДанные, "ЧН=0; ЧГ="));
ИначеЕсли СтрДР.Свойство.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.ЗначенияСвойствОбъектов") Тогда
СтрДР.Значение = ПолучитьЗначениеДопРеквизита(СтрДР.Свойство, СтрокаДанные);
Иначе
ВызватьИсключение "Не известный тип доп реквизита " + СтрДР.Свойство;
КонецЕсли;
КонецЕсли;
КонецЦикла;
обНоменклатура.Записать();
обНоменклатураПоставщика = Справочники.НоменклатураПоставщиков.СоздатьЭлемент();
обНоменклатураПоставщика.Родитель = ПолучитьРодительНоменклатураПоставщика(СтруктураДанные.ИдентификаторГрупы);
обНоменклатураПоставщика.Номенклатура = обНоменклатура.Ссылка;
обНоменклатураПоставщика.Наименование = СтруктураДанные.НазваниеТовара;
обНоменклатураПоставщика.Артикул = СтруктураДанные.Код;
обНоменклатураПоставщика.Владелец = Поставщик;
обНоменклатураПоставщика.Записать();
СтрН.Номенклатура = обНоменклатура.Ссылка;
СтрН.НоменклатураПоставщика = обНоменклатураПоставщика.Ссылка;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Итог
Относительно просто написать конвейер для обработки данных по номенклатуре, с возможностью расширения.
После обкатки планирую каркас опубликовать на GitHub, с возможностью подключать свои модули по получению данных и изменению данных в целевой конфигурации.
Благодарю за внимание.