Добрый день!
Помогите понять в чем ошибка. делаю простенький отчетик. но вот требования к оформлению выдвинули особенные, надо объединить строки как на картинке.
Ну вроде при отладке цифры для объединения ставит верные, а такая ерунда получается, а когда добавила, чтобы поднять на одну позицию выше. те что на уровне товаров (номенклатураКоличество)...еще хлеще . что я не так делаю??
Код такой:
Помогите понять в чем ошибка. делаю простенький отчетик. но вот требования к оформлению выдвинули особенные, надо объединить строки как на картинке.
Ну вроде при отладке цифры для объединения ставит верные, а такая ерунда получается, а когда добавила, чтобы поднять на одну позицию выше. те что на уровне товаров (номенклатураКоличество)...еще хлеще . что я не так делаю??
Код такой:
Процедура КнопкаВыполнитьНажатие(Кнопка)
ТабДок = ЭлементыФормы.ТабДок;
Макет = ПолучитьМакет("Макет");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьДанные = Макет.ПолучитьОбласть("Данные");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ТабДок.Очистить();
НачалоЗаказа = 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");
Прикрепленные файлы:

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

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