Объединение ячеек в печатной форме

1. user2078314 05.05.25 18:08 Сейчас в теме
Всем доброго дня.
Помогите пожалуйста поправить мой код. Заранее Спасибо!))) Если коротко, то есть Изделие в котором может быть несколько Упаковок. И надо чтобы чтобы Изделие было одной большой ячейкой.
На фото видно как сейчас и чего я пытаюсь добиться.


Запрос = Новый Запрос;
	Запрос.Текст =
	"….
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	ВременныйИтог.Изделие КАК Изделие,
	|	ВременныйИтог.СтатусИзделия КАК СтатусИзделия,
	|	ВЫБОР
	|		КОГДА ВременныйИтог.КоличествоТО = 0
	|			ТОГДА ВременныйИтог.КоличествоЛО - СУММА(ВременныйИтог.КоличествоТО)
	|		ИНАЧЕ ВременныйИтог.КоличествоТО
	|	КОНЕЦ КАК КоличествоЛО,
	|	ВременныйИтог.Упаковка КАК Упаковка,
	|	ВременныйИтог.СтатусУпаковки КАК СтатусУпаковки,
	|	ВременныйИтог.ТочкаОбеспечения КАК ТочкаОбеспечения,
	|	ВременныйИтог.КоличествоТО КАК КоличествоТО
	|ИЗ
	|	ВременныйИтог КАК ВременныйИтог
	|
	|СГРУППИРОВАТЬ ПО
	|	ВременныйИтог.Изделие,
	|	ВременныйИтог.СтатусИзделия,
	|	ВременныйИтог.Упаковка,
	|	ВременныйИтог.СтатусУпаковки,
	|	ВременныйИтог.ТочкаОбеспечения,
	|	ВременныйИтог.КоличествоТО,
	|	ВременныйИтог.КоличествоЛО
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	втНеОбеспеченныйЗаказ.Изделие,
	|	втНеОбеспеченныйЗаказ.СтатусУпаковки,
	|	втНеОбеспеченныйЗаказ.Разница,
	|	втНеОбеспеченныйЗаказ.Упаковка,
	|	втНеОбеспеченныйЗаказ.СтатусУпаковки,
	|	NULL,
	|	0
	|ИЗ
	|	втНеОбеспеченныйЗаказ КАК втНеОбеспеченныйЗаказ
	|ИТОГИ
	|	МАКСИМУМ(СтатусИзделия)
	|ПО
	|	Изделие";
	
	Запрос.УстановитьПараметр("РД", Объект.Ссылка);
	Результат = Запрос.Выполнить().Выбрать();
	
	ОбластьШапка = Макет.ПолучитьОбласть("Шапка");   
	ТаблицаДокумента.Вывести(ОбластьШапка);
	
	ТекущееИзделие = ""; 
	ТекущееВысота = 0;
	Пока Результат.Следующий() Цикл
		
		Если ТекущееИзделие <> Результат.Изделие Тогда
			// Выводим строку с изделием
			ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
			ОбластьСтрока.Параметры.Номенклатура = Результат.Изделие;
			ОбластьСтрока.Параметры.Статус = Результат.СтатусИзделия;
			ТаблицаДокумента.Вывести(ОбластьСтрока);
			
			ТекущееИзделие = Результат.Изделие;
		КонецЕсли;
		
		// Выводим строку с упаковкой
		ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
		ОбластьСтрока.Параметры.Упаковка = Результат.Упаковка;
		ОбластьСтрока.Параметры.КоличествоТЧ = Результат.КоличествоТО;
		ОбластьСтрока.Параметры.СтатусУпаковки = Результат.СтатусУпаковки;
		ОбластьСтрока.Параметры.ТочкаОбеспечения = Результат.ТочкаОбеспечения;
		ОбластьСтрока.Параметры.Количество = Результат.КоличествоЛО;
		ТаблицаДокумента.Вывести(ОбластьСтрока);
		
	КонецЦикла;
	
	Возврат ТаблицаДокумента;
Показать
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
12. user2078314 05.05.25 21:43 Сейчас в теме
(10) Спасибо большое! Получилось!

Запрос.УстановитьПараметр("РД", Объект.Ссылка);
	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	
	ОбластьШапка = Макет.ПолучитьОбласть("Шапка");   
	ТаблицаДокумента.Вывести(ОбластьШапка);
	
	Пока Выборка.Следующий() Цикл
		ВыборкаДетали = Выборка.Выбрать(ОбходРезультатаЗапроса.Прямой);
		ВысотаТаблицыДо = ТаблицаДокумента.ВысотаТаблицы;
		
		// Выводим строку с изделием
		ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
		ОбластьСтрока.Параметры.Номенклатура = Выборка.Изделие;
		ОбластьСтрока.Параметры.Статус = Выборка.СтатусИзделия;
		ОбластьСтрока.Параметры.Количество = Выборка.КоличествоЛО;
		ТаблицаДокумента.Вывести(ОбластьСтрока);
		
		Пока ВыборкаДетали.Следующий() Цикл 
			// Выводим строку с упаковкой
			ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
			ОбластьСтрока.Параметры.Упаковка = ВыборкаДетали.Упаковка;
			ОбластьСтрока.Параметры.КоличествоТЧ = ВыборкаДетали.КоличествоТО;
			ОбластьСтрока.Параметры.СтатусУпаковки = ВыборкаДетали.СтатусУпаковки;
			ОбластьСтрока.Параметры.ТочкаОбеспечения = ВыборкаДетали.ТочкаОбеспечения;
			ОбластьСтрока.Параметры.Количество = ВыборкаДетали.КоличествоЛО;
			ТаблицаДокумента.Вывести(ОбластьСтрока);
		КонецЦикла;
		
		ВысотаТаблицыПосле = ТаблицаДокумента.ВысотаТаблицы;
		// Объединяем ячейки с названием изделия
		Для ч = 1 По 2 Цикл
			Область = ТаблицаДокумента.Область(ВысотаТаблицыДо+1, ч, ВысотаТаблицыПосле, ч);
			Область.Объединить();
		КонецЦикла;
	КонецЦикла;
	
	Возврат ТаблицаДокумента;
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. miniogn 47 05.05.25 20:02 Сейчас в теме
(1) Есть, конечно, разные варианты. По мне, так попроще, будет вариант с объединением ячеек после вывода группировок. Типа так, как-то
Результат = Запрос.Выполнить();
ВыборкаЗаголовок = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаЗаголовок.Следующий() Цикл
	ВыборкаДетали = ВыборкаЗаголовок.Выбрать(ОбходРезультатаЗапроса.Прямой);
	ВысотаТаблицыДо = ТабДок.ВысотаТаблицы; //запомнить высоту таблицы
	Пока ВыборкаДетали.Следующий() Цикл
		// вывести строку
	КонецЦикла;
	ВысотаТаблицыПосле = ТабДок.ВысотаТаблицы;
	Для ч = 1 По 2 Цикл
		Область = ТабДок.Область(ВысотаТаблицыДо+1, ч, ВысотаТаблицыПосле, ч);
		Область.Объединить();
	КонецЦикла;
КонецЦикла;
Показать
4. user2078314 05.05.25 20:35 Сейчас в теме
(3) Я относительно новичок. Если не затруднит, можно подробнее?
Я добавила код после вывода группировок, отладчик его проходит, но в итоге печатная форма такая же, как и была.

Запрос.УстановитьПараметр("РД", Объект.Ссылка);
	Результат = Запрос.Выполнить().Выбрать();
	
	ОбластьШапка = Макет.ПолучитьОбласть("Шапка");   
	ТаблицаДокумента.Вывести(ОбластьШапка);
	
	ТекущееИзделие = ""; 
	
	Пока Результат.Следующий() Цикл
		
		Если ТекущееИзделие <> Результат.Изделие Тогда
			// Выводим строку с изделием
			ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
			ОбластьСтрока.Параметры.Номенклатура = Результат.Изделие;
			ОбластьСтрока.Параметры.Статус = Результат.СтатусИзделия; 
			ОбластьСтрока.Параметры.Упаковка = Результат.Упаковка;
			ОбластьСтрока.Параметры.КоличествоТЧ = Результат.КоличествоТО;
			ОбластьСтрока.Параметры.СтатусУпаковки = Результат.СтатусУпаковки;
			ОбластьСтрока.Параметры.ТочкаОбеспечения = Результат.ТочкаОбеспечения;
			ОбластьСтрока.Параметры.Количество = Результат.КоличествоЛО;
			ТаблицаДокумента.Вывести(ОбластьСтрока);
			
			ТекущееИзделие = Результат.Изделие;
		КонецЕсли;
		
		// Выводим строку с упаковкой
		ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
		ОбластьСтрока.Параметры.Упаковка = Результат.Упаковка;
		ОбластьСтрока.Параметры.КоличествоТЧ = Результат.КоличествоТО;
		ОбластьСтрока.Параметры.СтатусУпаковки = Результат.СтатусУпаковки;
		ОбластьСтрока.Параметры.ТочкаОбеспечения = Результат.ТочкаОбеспечения;
		ОбластьСтрока.Параметры.Количество = Результат.КоличествоЛО;
		ТаблицаДокумента.Вывести(ОбластьСтрока);
		
	КонецЦикла;
	

	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	
	Пока Выборка.Следующий() Цикл
		ВыборкаДетали = Выборка.Выбрать(ОбходРезультатаЗапроса.Прямой);
		ВысотаТаблицыДо = ТаблицаДокумента.ВысотаТаблицы; //запомнить высоту таблицы
		Пока ВыборкаДетали.Следующий() Цикл 
			// вывести строку  
			ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
			ОбластьСтрока.Параметры.Номенклатура = Выборка.Изделие;
		КонецЦикла;
		ВысотаТаблицыПосле = ТаблицаДокумента.ВысотаТаблицы;
		Для ч = 1 По 2 Цикл
			Область = ТаблицаДокумента.Область(ВысотаТаблицыДо+1, ч, ВысотаТаблицыПосле, ч);
			Область.Объединить();
		КонецЦикла;
	КонецЦикла;
	
	Возврат ТаблицаДокумента;
Показать
9. miniogn 47 05.05.25 21:11 Сейчас в теме
(4) Был показан пример с двухуровневым запросом. Само собой не заработает, если просто добавить новый код снизу.
Запрос уже и так вроде двухуровневый, но его обработка одноуровневая.
По этому или переделывать обработку результата на двухуровневую или обкладываться условиями "если тогда", для того что бы вовремя вызывать объединение. Выбери один вариант реализации.
Первый вариант с двумя уровнями по факту более удобен.
Для решения
1. Добейся что бы работало почти, как нужный вариант, но еще без объединений.
2. И затем уже ищи место куда вставить код объединения.
10. user2107191 05.05.25 21:14 Сейчас в теме
(4)
Я добавила код после вывода группировок, отладчик его проходит, но в итоге печатная форма такая же, как и была.
Ты тупо скопипастила код, даже не думая, что он означает. И не пытаясь понять. Чего ты ожидала?
Тебе дали пример кода, шаблон для решений, а не готовый код для твоей задачи.

В твоем запросе нет итогов, для обхода по группировкам. Поэтому предложенный шаблон и не работает. Тут либо тебе переделывать запрос для работы с группировками, либо проходить выборку запроса линейно, но данные в табдоке заполнять по условию - если первая упаковка для изделия - заполняем все ячейки, если вторая и дальше - заполняем только ячейки упаковки.
12. user2078314 05.05.25 21:43 Сейчас в теме
(10) Спасибо большое! Получилось!

Запрос.УстановитьПараметр("РД", Объект.Ссылка);
	Результат = Запрос.Выполнить();
	Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	
	ОбластьШапка = Макет.ПолучитьОбласть("Шапка");   
	ТаблицаДокумента.Вывести(ОбластьШапка);
	
	Пока Выборка.Следующий() Цикл
		ВыборкаДетали = Выборка.Выбрать(ОбходРезультатаЗапроса.Прямой);
		ВысотаТаблицыДо = ТаблицаДокумента.ВысотаТаблицы;
		
		// Выводим строку с изделием
		ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
		ОбластьСтрока.Параметры.Номенклатура = Выборка.Изделие;
		ОбластьСтрока.Параметры.Статус = Выборка.СтатусИзделия;
		ОбластьСтрока.Параметры.Количество = Выборка.КоличествоЛО;
		ТаблицаДокумента.Вывести(ОбластьСтрока);
		
		Пока ВыборкаДетали.Следующий() Цикл 
			// Выводим строку с упаковкой
			ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
			ОбластьСтрока.Параметры.Упаковка = ВыборкаДетали.Упаковка;
			ОбластьСтрока.Параметры.КоличествоТЧ = ВыборкаДетали.КоличествоТО;
			ОбластьСтрока.Параметры.СтатусУпаковки = ВыборкаДетали.СтатусУпаковки;
			ОбластьСтрока.Параметры.ТочкаОбеспечения = ВыборкаДетали.ТочкаОбеспечения;
			ОбластьСтрока.Параметры.Количество = ВыборкаДетали.КоличествоЛО;
			ТаблицаДокумента.Вывести(ОбластьСтрока);
		КонецЦикла;
		
		ВысотаТаблицыПосле = ТаблицаДокумента.ВысотаТаблицы;
		// Объединяем ячейки с названием изделия
		Для ч = 1 По 2 Цикл
			Область = ТаблицаДокумента.Область(ВысотаТаблицыДо+1, ч, ВысотаТаблицыПосле, ч);
			Область.Объединить();
		КонецЦикла;
	КонецЦикла;
	
	Возврат ТаблицаДокумента;
Показать
13. user2107191 05.05.25 21:52 Сейчас в теме
(12)
Получилось!
Спорим, не получилось? У тебя все равно данные изделия и данные первой упаковки в разных строках находятся. Я вот прям отсюда вижу.
14. user2078314 05.05.25 22:06 Сейчас в теме
(13) Это уже мелочи )))
Поправила. Еще раз спасибо!
2. user2107191 05.05.25 19:54 Сейчас в теме
Выводи за один проход.
В первой итерации по изделию заполняешь и его данные и данные упаковки.
В последующих итерациях по этому же изделию заполняешь только данные упаковки.
Перед тем как начать заполнять следующие изделия - объединяешь нужные ячейки предыдущего изделия.
5. user2078314 05.05.25 20:36 Сейчас в теме
(2) Спасибо за ответ. Честно, не поняла.
6. user2107191 05.05.25 20:40 Сейчас в теме
(5) Значит рано тебе еще в алгоритмы.
7. user2078314 05.05.25 20:53 Сейчас в теме
(6) согласна.
Но если есть более простое решение, то с удовольствием применю
8. user2107191 05.05.25 21:10 Сейчас в теме
(7) Ты не поверишь, но это было простое. Просто ты не умеешь разговаривать на языке.
11. user2144693 05.05.25 21:27 Сейчас в теме
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
|    ВременныйИтог.Изделие КАК Изделие,
|    ВременныйИтог.СтатусИзделия КАК СтатусИзделия,
|    ВЫБОР
|        КОГДА ВременныйИтог.КоличествоТО = 0
|        ТОГДА ВременныйИтог.КоличествоЛО - СУММА(ВременныйИтог.КоличествоТО)
|        ИНАЧЕ ВременныйИтог.КоличествоТО
|    КОНЕЦ КАК КоличествоЛО,
|    ВременныйИтог.Упаковка КАК Упаковка,
|    ВременныйИтог.СтатусУпаковки КАК СтатусУпаковки,
|    ВременныйИтог.ТочкаОбеспечения КАК ТочкаОбеспечения,
|    ВременныйИтог.КоличествоТО КАК КоличествоТО
|ИЗ
|    ВременныйИтог КАК ВременныйИтог
|
|СГРУППИРОВАТЬ ПО
|    ВременныйИтог.Изделие,
|    ВременныйИтог.СтатусИзделия,
|    ВременныйИтог.Упаковка,
|    ВременныйИтог.СтатусУпаковки,
|    ВременныйИтог.ТочкаОбеспечения,
|    ВременныйИтог.КоличествоТО,
|    ВременныйИтог.КоличествоЛО
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    втНеОбеспеченныйЗаказ.Изделие,
|    втНеОбеспеченныйЗаказ.СтатусУпаковки,
|    втНеОбеспеченныйЗаказ.Разница,
|    втНеОбеспеченныйЗаказ.Упаковка,
|    втНеОбеспеченныйЗаказ.СтатусУпаковки,
|    NULL,
|    0
|ИЗ
|    втНеОбеспеченныйЗаказ КАК втНеОбеспеченныйЗаказ
|ИТОГИ
|    МАКСИМУМ(СтатусИзделия)
|ПО
|    Изделие";

Запрос.УстановитьПараметр("РД", Объект.Ссылка);
Результат = Запрос.Выполнить().Выбрать();

ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТаблицаДокумента.Вывести(ОбластьШапка);

ТекущееИзделие = "";
НомерСтроки = 0;

Пока Результат.Следующий() Цикл
    
    Если ТекущееИзделие <> Результат.Изделие Тогда
        // Выводим строку с изделием (объединенная ячейка)
        ОбластьИзделие = Макет.ПолучитьОбласть("Изделие");  // Новая область для изделия
        ОбластьИзделие.Параметры.Номенклатура = Результат.Изделие;
        ОбластьИзделие.Параметры.Статус = Результат.СтатусИзделия;
        ТаблицаДокумента.Вывести(ОбластьИзделие);
        
        ТекущееИзделие = Результат.Изделие;
        НомерСтроки = 0;
    КонецЕсли;
    
    // Выводим строку с упаковкой (под изделием)
    ОбластьУпаковка = Макет.ПолучитьОбласть("Упаковка");  // Новая область для упаковки
    ОбластьУпаковка.Параметры.Упаковка = Результат.Упаковка;
    ОбластьУпаковка.Параметры.КоличествоТЧ = Результат.КоличествоТО;
    ОбластьУпаковка.Параметры.СтатусУпаковки = Результат.СтатусУпаковки;
    ОбластьУпаковка.Параметры.ТочкаОбеспечения = Результат.ТочкаОбеспечения;
    ОбластьУпаковка.Параметры.Количество = Результат.КоличествоЛО;
    ТаблицаДокумента.Вывести(ОбластьУпаковка);
    
    НомерСтроки = НомерСтроки + 1;
КонецЦикла;

Возврат ТаблицаДокумента;
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот