Я примерно такое делал через ИТЗ и его метод Группировать (пусть даже автору ИТЗ этот метод не нравится, а я от него балдею

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