Хотелось сделать решение с простой загрузкой результата запроса в одно действие, но оказалось, что надо подчищать колонки с лишними субконто. Поэтому пришлось сделать 4 таблицы с разным количеством субконто. Вот что из этого вышло.
Запрос:
ВЫБРАТЬ
ХозрасчетныйОстатки.Счет КАК СчетКт,
тВидыСубконто1.ВидСубконто КАК ВидСубконтоКт1,
тВидыСубконто2.ВидСубконто КАК ВидСубконтоКт2,
тВидыСубконто3.ВидСубконто КАК ВидСубконтоКт3,
&Счет000 КАК СчетДт,
ХозрасчетныйОстатки.Субконто1 КАК СубконтоКт1,
ХозрасчетныйОстатки.Субконто2 КАК СубконтоКт2,
ХозрасчетныйОстатки.Субконто3 КАК СубконтоКт3,
ХозрасчетныйОстатки.Организация,
ХозрасчетныйОстатки.СуммаОстаток КАК Сумма,
ХозрасчетныйОстатки.КоличествоОстаток,
1 ПолеДляВсех
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата2016, Счет В ИЕРАРХИИ (&СписокСчетов), , ) КАК ХозрасчетныйОстатки
ЛЕВОЕ СОЕДИНЕНИЕ ПланСчетов.Хозрасчетный.ВидыСубконто КАК тВидыСубконто1
ПО ХозрасчетныйОстатки.Счет = тВидыСубконто1.Ссылка
И (1 = тВидыСубконто1.НомерСтроки)
ЛЕВОЕ СОЕДИНЕНИЕ ПланСчетов.Хозрасчетный.ВидыСубконто КАК тВидыСубконто2
ПО ХозрасчетныйОстатки.Счет = тВидыСубконто2.Ссылка
И (2 = тВидыСубконто2.НомерСтроки)
ЛЕВОЕ СОЕДИНЕНИЕ ПланСчетов.Хозрасчетный.ВидыСубконто КАК тВидыСубконто3
ПО ХозрасчетныйОстатки.Счет = тВидыСубконто3.Ссылка
И (3 = тВидыСубконто3.НомерСтроки)
А вот обработка его результата:
тзПров = РезЗапроса.Выгрузить(); // выгружается в исходную ТЗ
/// *** Наборы строк с 0,1,2,3 видами субконто
масс0Сбк = тзПров.НайтиСтроки(Новый Структура("ВидСубконтоКт1", Null));
масс1Сбк = тзПров.НайтиСтроки(Новый Структура("ВидСубконтоКт2", Null));
масс2Сбк = тзПров.НайтиСтроки(Новый Структура("ВидСубконтоКт3", Null));
масс3Сбк = тзПров.НайтиСтроки(Новый Структура("ПолеДляВсех", 1)); // Все строки в массив
/// ** Чистка строк с несоответствующим количеством субконто.
Для каждого стр из масс0Сбк цикл
масс1Сбк.Удалить(масс1Сбк.Найти(стр));
масс2Сбк.Удалить(масс2Сбк.Найти(стр));
масс3Сбк.Удалить(масс3Сбк.Найти(стр))
КонецЦикла;
Для каждого стр из масс1Сбк цикл
масс2Сбк.Удалить(масс2Сбк.Найти(стр));
масс3Сбк.Удалить(масс3Сбк.Найти(стр))
КонецЦикла;
Для каждого стр из масс2Сбк цикл
масс3Сбк.Удалить(масс3Сбк.Найти(стр))
КонецЦикла;
/// *** Формирование таблиц значений, которые загружаются в проводки документов и удаление лишних колонок
тз0Сбк = тзПров.Скопировать(масс0Сбк);
тз0Сбк.Колонки.Удалить("СубконтоКт1");
тз0Сбк.Колонки.Удалить("СубконтоКт2");
тз0Сбк.Колонки.Удалить("СубконтоКт3");
тз0Сбк.Колонки.Удалить("ВидСубконтоКт1");
тз0Сбк.Колонки.Удалить("ВидСубконтоКт2");
тз0Сбк.Колонки.Удалить("ВидСубконтоКт3");
//
тз1Сбк = тзПров.Скопировать(масс1Сбк);
тз1Сбк.Колонки.Удалить("СубконтоКт2");
тз1Сбк.Колонки.Удалить("СубконтоКт3");
тз1Сбк.Колонки.Удалить("ВидСубконтоКт2");
тз1Сбк.Колонки.Удалить("ВидСубконтоКт3");
//
тз2Сбк = тзПров.Скопировать(масс2Сбк);
тз2Сбк.Колонки.Удалить("СубконтоКт3");
тз2Сбк.Колонки.Удалить("ВидСубконтоКт3");
//
тз3Сбк = тзПров.Скопировать(масс3Сбк);
// Для отладки
//тз0Сбк.ВыбратьСтроку();
//тз1Сбк.ВыбратьСтроку();
//тз2Сбк.ВыбратьСтроку();
//тз3Сбк.ВыбратьСтроку();
/// *** Формирование документов
ОбДок = Документы.ОперацияБух.СоздатьДокумент();
ОбДок.Дата = Запрос.Параметры.Дата2016-1;
ОбДок.Движения.Хозрасчетный.Загрузить(тз0Сбк);
ОбДок.ПолучитьФорму().Открыть();
//
ОбДок = Документы.ОперацияБух.СоздатьДокумент();
ОбДок.Дата = Запрос.Параметры.Дата2016-1;
ОбДок.Движения.Хозрасчетный.Загрузить(тз1Сбк);
ОбДок.ПолучитьФорму().Открыть();
//
ОбДок = Документы.ОперацияБух.СоздатьДокумент();
ОбДок.Дата = Запрос.Параметры.Дата2016-1;
ОбДок.Движения.Хозрасчетный.Загрузить(тз2Сбк);
ОбДок.ПолучитьФорму().Открыть();
//
ОбДок = Документы.ОперацияБух.СоздатьДокумент();
ОбДок.Дата = Запрос.Параметры.Дата2016-1;
ОбДок.Движения.Хозрасчетный.Загрузить(тз3Сбк);
ОбДок.ПолучитьФорму().Открыть();
Более компактного варианта свертки остатков по бух.регистрам придумать не получилось. Кто-нибудь может предложить?