Помогите с поиском ошибки в объединении

1. anita 39_25 (anita_39_25) 18.03.17 13:31 Сейчас в теме
Добрый день!
Помогите понять в чем ошибка. делаю простенький отчетик. но вот требования к оформлению выдвинули особенные, надо объединить строки как на картинке.
Ну вроде при отладке цифры для объединения ставит верные, а такая ерунда получается, а когда добавила, чтобы поднять на одну позицию выше. те что на уровне товаров (номенклатураКоличество)...еще хлеще . что я не так делаю??

Код такой:

Процедура КнопкаВыполнитьНажатие(Кнопка)
	
ТабДок = ЭлементыФормы.ТабДок;
Макет = ПолучитьМакет("Макет");
	
ОбластьШапка            = Макет.ПолучитьОбласть("Шапка");
ОбластьДанные 			= Макет.ПолучитьОбласть("Данные");
ОбластьПодвал           = Макет.ПолучитьОбласть("Подвал");
ОбластьЗаголовок        = Макет.ПолучитьОбласть("Заголовок");

ТабДок.Очистить();

НачалоЗаказа = 2;
НомерСтрокиТбл = 2;
НачалоНоменклатуры = 3;


ЗапросПоставщик = новый Запрос;


ЗапросПоставщик.УстановитьПараметр("ДатаНач", НачПериода);
ЗапросПоставщик.УстановитьПараметр("ДатаОконч", КонецДня(КонПериода));


ЗапросПоставщик.Текст = "ВЫБРАТЬ
                        |	ЗаказПоставщикуТовары.Номенклатура КАК Номенклатура,
                        |	ЗаказПоставщикуТовары.Количество,
                        |	ЗаказПоставщикуТовары.Сумма,
                        |	ЗаказПоставщикуТовары.ЕдиницаИзмерения КАК ЕдИзм,
                        |	ЗаказПоставщикуТовары.Ссылка.Комментарий КАК Примечание,
                        |	НАЧАЛОПЕРИОДА(ЗаказПоставщикуТовары.Ссылка.Дата, ДЕНЬ) КАК ДатаДок,
                        |	ЗаказПоставщику.Ссылка КАК Ссылка,
                        |	ЗаказПоставщику.НомерПоДаннымПоставщика КАК НомерСчета,
                        |	ЗаказПоставщику.ДатаПоДаннымПоставщика КАК Дата,
                        |	ЗаказПоставщику.Контрагент КАК Контрагент
                        |ИЗ
                        |	Документ.ЗаказПоставщику.Товары КАК ЗаказПоставщикуТовары
                        |		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПоставщику КАК ЗаказПоставщику
                        |		ПО ЗаказПоставщикуТовары.Ссылка = ЗаказПоставщику.Ссылка
                        |ГДЕ
                        |	ЗаказПоставщикуТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаОконч
                        |	И ЗаказПоставщикуТовары.Ссылка.Проведен
                        |
                        |УПОРЯДОЧИТЬ ПО
                        |	ДатаДок
                        |ИТОГИ ПО
                        |	Ссылка";

ВыборкаЗапросПоставщик1 = ЗапросПоставщик.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); // ур док
ТабДок.Вывести(ОбластьШапка);

Пока ВыборкаЗапросПоставщик1.Следующий() Цикл
	
	
	ОбластьСсылка=Макет.ПолучитьОбласть("Данные");
	ОбластьСсылка.Параметры.НомерСчета = ВыборкаЗапросПоставщик1.НомерСчета;
	ОбластьСсылка.Параметры.Дата = ВыборкаЗапросПоставщик1.Дата;
	ОбластьСсылка.Параметры.Контрагент = ВыборкаЗапросПоставщик1.Контрагент;
	ОбластьСсылка.Параметры.Примечание = ВыборкаЗапросПоставщик1.Примечание;

	ТабДок.Вывести(ОбластьСсылка, ВыборкаЗапросПоставщик1.Уровень());
	ВыборкаЗапросПоставщик2 = ВыборкаЗапросПоставщик1.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); // ур товаров
	
	НачалоЗаказа = НомерСтрокиТбл;		
	
	
	Пока ВыборкаЗапросПоставщик2.Следующий() Цикл
		//N = 0;
		
		ОбластьСсылка=Макет.ПолучитьОбласть("Данные");
		ОбластьСсылка.Параметры.НоменклатураКоличество = Строка(ВыборкаЗапросПоставщик2.Номенклатура) + " (" + Строка(ВыборкаЗапросПоставщик2.Количество) + " " + Строка(ВыборкаЗапросПоставщик2.ЕдИзм) + " )";
		ОбластьСсылка.Параметры.Сумма = ВыборкаЗапросПоставщик2.Сумма;	
		ТабДок.Вывести(ОбластьСсылка, ВыборкаЗапросПоставщик2.Уровень());
		
		НомерСтрокиТбл = НомерСтрокиТбл+1;
		
	
	КонецЦикла;
ТабДок.Вывести(ОбластьДанные);
// поднимаем первую строку номенклатура/количество и сумму на уровень документа

//ТабДок.Область("R" + Строка(НачалоНоменклатуры) + НомераКолонок.НоменклатураКоличество + ":R" + Строка(НачалоНоменклатуры+1) + НомераКолонок.НоменклатураКоличество).Объединить();
//ТабДок.Область("R" + Строка(НачалоНоменклатуры) + НомераКолонок.Сумма + ":R" + Строка(НачалоНоменклатуры+1) + НомераКолонок.Сумма).Объединить();

НачалоНоменклатуры =НачалоЗаказа; 

//объединяем строки
ТабДок.Область("R" + Строка(НачалоЗаказа) + НомераКолонок.НомерСчета + ":R" + Строка(НомерСтрокиТбл-1) + НомераКолонок.НомерСчета).Объединить();
ТабДок.Область("R" + Строка(НачалоЗаказа) + НомераКолонок.Дата + ":R" + Строка(НомерСтрокиТбл-1) + НомераКолонок.Дата).Объединить();
ТабДок.Область("R" + Строка(НачалоЗаказа) + НомераКолонок.Контрагент + ":R" + Строка(НомерСтрокиТбл-1) + НомераКолонок.Контрагент).Объединить();
ТабДок.Область("R" + Строка(НачалоЗаказа) + НомераКолонок.ДатаПоступления + ":R" + Строка(НомерСтрокиТбл-1) + НомераКолонок.ДатаПоступления).Объединить();
ТабДок.Область("R" + Строка(НачалоЗаказа) + НомераКолонок.Примечание + ":R" + Строка(НомерСтрокиТбл-1) + НомераКолонок.Примечание).Объединить();

//ТабДок.ЗакончитьАвтогруппировкуСтрок();

ТабДок.Показать();

	
	
КонецЦикла;



КонецПроцедуры
...Показать Скрыть

Процедура ВыбПериодНажатие(Элемент)
		НастройкаПериода = Новый НастройкаПериода;
	НастройкаПериода.РедактироватьКакИнтервал = Истина;
	НастройкаПериода.РедактироватьКакПериод = Истина;
	НастройкаПериода.ВариантНастройки = ВариантНастройкиПериода.Период;
	НастройкаПериода.УстановитьПериод(НачПериода, ?(КонПериода='0001-01-01', КонПериода, КонецДня(КонПериода)));
	Если НастройкаПериода.Редактировать() Тогда
		НачПериода = НастройкаПериода.ПолучитьДатуНачала();
		КонПериода = НастройкаПериода.ПолучитьДатуОкончания();
	КонецЕсли;

КонецПроцедуры
...Показать Скрыть

НомераКолонок = новый Структура;
НомераКолонок.Вставить("НомерСчета", "C1");
НомераКолонок.Вставить("Дата", "C2");
НомераКолонок.Вставить("Контрагент", "C3");
НомераКолонок.Вставить("НоменклатураКоличество", "C4");
НомераКолонок.Вставить("Сумма", "C5");
НомераКолонок.Вставить("ДатаПоступления", "C6");
НомераКолонок.Вставить("Примечание", "C7");
...Показать Скрыть
Прикрепленные файлы:
Ответы
2. Алёна Василенко (alyonchik) 20.03.17 12:38 Сейчас в теме
А может не писать ручками объединение? А в макете добавить "Номенклатура, количество и прочие колонки" как отдельную область.
И выводить эту область отдельно - не надо мучатся с объединением тогда и прочим
alex-l19041; +1 Ответить
3. Evgeniy Nikolaenko (DrBlack) 17 20.03.17 15:44 Сейчас в теме
но вот требования к оформлению выдвинули особенные
Советую вам игнорировать такие требования, если не могут выдвинуть весомые обоснования
делаю простенький отчетик
Уже не простенький, т.к. с задвигами от заказчика, сопровождать тоже теперь не удобно
что я не так делаю?
Идешь на поводу заказчика и не читаешь книжки

Лично бы я сделал отчет на СКД, но прикрепил именно ваш допиленный вариант.
Загляните внутрь, попытайтесь запомнить как должен выглядеть хороший код.
Прикрепленные файлы:
ВрумВрумВрум.epf
4. Сергей Долинин (ImHunter) 6 20.03.17 17:05 Сейчас в теме
Таки не понятно, что не так происходит. Может картинку покажете.

Насчет объединения - тоже не так давно вручную такой код писал. Сразу решил уйти от всяких RC при задании области.
Вот так получилось. Может как-то по мотивам у вас получится переделать.
Процедура ВывестиОДПУ(ТабДок, Макет, РодительскийОО)
	
	Если Ложь Тогда // фейк для СП
		ТабДок = Новый ТабличныйДокумент	;
		Макет = ПолучитьМакет("Макет1");
	КонецЕсли;
	// Узел, ПУ, коэффициент, СпособРасчета
	ДанныеОДПУ = ПолучитьДанныеПоОДПУ(РодительскийОО);
	СтрокаВывода = Макет.ПолучитьОбласть("СтрокаОДПУ");
	
	Для Каждого ТекСтрока Из ДанныеОДПУ Цикл 
		
		Если Истина Тогда // фейк
			ПУ = ТекСтрока.ПУ;
		Иначе 
			ПУ = Справочники.ПриборыУчета.ПустаяСсылка();
		КонецЕсли;
		
		Если Не ЗначениеЗаполнено(ПУ) Тогда 
			Продолжить;
		КонецЕсли;
		
		Если ТекСтрока.ЭтоСубабонент=Истина Тогда 
			Продолжить;
		КонецЕсли;
		
		Параметры = Новый Структура("Тип, Номер, Ктр, ЗонаРасчета");
		Параметры.Тип = ПУ.Тип;
		Параметры.Номер = ПУ.ЗаводскойНомер;
		Параметры.Ктр = ТекСтрока.коэффициент;
		Если ПУ.ЗоныРасчета.Количество()<=1 Тогда
			Параметры.ЗонаРасчета = Справочники.ЗоныРасчета.День;
			СтрокаВывода.Параметры.Заполнить(Параметры);
			КонОбласть = ТабДок.Вывести(СтрокаВывода);
		Иначе 
			НачОбласть = Неопределено;
			КонОбласть = Неопределено;
			Для Каждого з Из ПУ.ЗоныРасчета Цикл 
				Параметры.ЗонаРасчета = з.ЗонаРасчета;
				СтрокаВывода.Параметры.Заполнить(Параметры);
            	КонОбласть = ТабДок.Вывести(СтрокаВывода);
				Если НачОбласть=Неопределено Тогда 
					НачОбласть = КонОбласть;
				КонецЕсли;
			КонецЦикла;
			// объединяем тип, номер
			ТабДок.Область(НачОбласть.Верх, 1, КонОбласть.Низ, 5).Объединить();
			ТабДок.Область(НачОбласть.Верх, 6, КонОбласть.Низ, 8).Объединить();
			ТабДок.Область(НачОбласть.Верх, 9, КонОбласть.Низ, 11).Объединить();
			ТабДок.Область(НачОбласть.Верх, 17, КонОбласть.Низ, 20).Объединить();
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры
...Показать Скрыть
5. Petr Shnurov (shnurov) 22.03.17 02:28 Сейчас в теме
Мое решение: из макета берете область строка где есть все колонки и заполняете номенклатуру и сумму и помещаете в временный пустой табличный документ одновременно с этим считаете количество строк (можно и без временного табдок, но нужно тогда хранить верхнюю границу). Далее объединяете и обводите (чтоб лини были, можно также просто дорисовать линии которые пропадут после объединения) остальные колонки (№ счета, дата, поставщик и д.р.) и заполняете их данными. Далее выводите этот временный табдок в результирующий. Повторяете в цикле.

Примерный код, только у меня нет еще одного цикла внешнего цикла(который переберет строки) т.к. делал все на коленке просто чтоб проверить:

Табдок = Новый ТабличныйДокумент;
	ОбработкаОбъект=ЭтаФорма.РеквизитФормыВЗначение("Объект");
	
	//Получаем макет и области
        Макет=ОбработкаОбъект.ПолучитьМакет("Макет");	
	ОблШапка=Макет.ПолучитьОбласть("ОблШапка");	
	ОблСтрока=Макет.ПолучитьОбласть("ОблСтрока");	
	ТабДок.Вывести(ОблШапка);

	//Временный табдок
	ВТабдок=Новый ТабличныйДокумент;
	Сч=0;

	//Заполняем вложенные колонки и выводим в временный табдок
       Для Каждого Стр Из ТаблицаДанные Цикл
		ОблСтрока.Параметры.Разбиение1=Стр.Разбиение1;
		ОблСтрока.Параметры.Разбиение2=Стр.Разбиение2;
		ВТабдок.Вывести(ОблСтрока);
		Сч=Сч+1;
	КонецЦикла;

        //Обводим и заполняем  оставшиеся колокни
	Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная,1);
	ОблСтрока1=ВТабДок.Область(1,2,Сч,2);
	ОблСтрока1.Объединить();
	ОблСтрока1.Обвести(Линия,Линия,Линия,Линия);
	ОблСтрока1.Текст=Объект.Строка1;
	
	ОблЧисло1=ВТабДок.Область(1,5,Сч,5);
        ОблЧисло1.Объединить();
	ОблЧисло1.Обвести(Линия,Линия,Линия,Линия);
        ОблЧисло1.Текст=Объект.Число1;		
	
	Табдок.Вывести(ВТабдок);			
	
         Возврат Табдок;
...Показать Скрыть
Прикрепленные файлы: