По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Нужно использовать горизонтальные и вертикальные области в макете.
Из исходной таблицы скопировать в новые отдельные таблицы колонки Клиенты и Товары. после этого Циклом проходим по Товарам (Это наши строки ), а во вложенном цикле по Клиентам. Области получать при помощи "Область = Макет.ПолучитьОбласть("Строка|Контрагент"));
выводить первую часть строки Вывести(Область) остальные части - ТабличныйДокумент.Присоединить(Область)
Из исходной таблицы скопировать в новые отдельные таблицы колонки Клиенты и Товары. после этого Циклом проходим по Товарам (Это наши строки ), а во вложенном цикле по Клиентам. Области получать при помощи "Область = Макет.ПолучитьОбласть("Строка|Контрагент"));
выводить первую часть строки Вывести(Область) остальные части - ТабличныйДокумент.Присоединить(Область)
//****************************************
// Заголовок - заголовок таблицы и окна таблицы
// КолонкиПоНазваниям = 1 - в шапке выводятся представления колонок, 0 = идентификаторы колонок
// ИтогиПоКолонкам = -1 по всем числовым колонкам, "Колонка1,Колонка2"- по указанным колонкам, иначе не выводить
// ИтогиПоЦенам = 0 - колонки, начинающиеся с Цена суммироваться не будут, 1 - как и все остальные колонки
// РазделительРазрядов - разделитель разрядов в числовых значениях, по умолчанию пробел
// ФорматЧисловыхЗначений - форматная строка для чисел
// Таб - Таблица, в которую выводится результат. Если не задан - создается новая таблица
Функция ПечатьТЗ(Знач ТЗ, Заголовок = "",КолонкиПоНазваниям = 1, Знач ИтогиПоКолонкам = -1,
ИтогиПоЦенам = 0, ФорматЧисловыхЗначений = "", РазделительРазрядов = " ",
Таб = "",ВыводСетки=0,ВыводЗаголовков=0,ВыводНулевойТаблицы=1,ВыводЗаголовковПодвал=0) Экспорт
ТипДанных = ТипЗначенияСтр(ТЗ);
Если НЕ(ТипДанных = "ТаблицаЗначений") Тогда
Если ТипДанных <> "Документ" Тогда
Заголовок = ?(ПустаяСтрока(Заголовок) = 1, "", Заголовок+РазделительСтрок)+ "значения списка";
ТТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.Выгрузить(ТТЗ);
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТТЗ.Выгрузить(ТЗ); ТЗ.УстановитьПараметрыКолонки(1,,,,"список");
Иначе
Заголовок = ?(ПустаяСтрока(Заголовок) = 1, "", Заголовок+РазделительСтрок)+ ТЗ.ПредставлениеВида()+ " №"+СокрЛП(ТЗ.НомерДок)+" от "+ТЗ.ДатаДок;
// комментарий
Если Метаданные.ОбщийРеквизитДокумента("Комментарий").Выбран() = 1 Тогда
Если ПустаяСтрока(ТЗ.Комментарий) = 0 Тогда
СтрЗаголовок = СтрЗаголовок + РазделительСтрок + ТЗ.Комментарий;
КонецЕсли;
КонецЕсли;
// автор
Если Метаданные.ОбщийРеквизитДокумента("Автор").Выбран() = 1 Тогда
Если ПустаяСтрока(ТЗ.Автор) = 0 Тогда
СтрЗаголовок = СтрЗаголовок + РазделительСтрок + ТЗ.Автор;
КонецЕсли;
КонецЕсли;
ТТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.ВыгрузитьТабличнуюЧасть(ТТЗ);
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТТЗ.Выгрузить(ТЗ);
ТЗ.УдалитьКолонку("НомерСтрокиДокумента");
КонецЕсли;
КонецЕсли;
МаксШирина = 85; // максимальная ширина колонки
МаксШиринаЗаголовок = 20; // максимальная ширина колонки, обусловленная шириной заголовка
КоэффициентШрифт = 1.0; // коэффициент пропорциональности зависимости ширины ячейки от количества символов в содержимом
СписокИтоги = СоздатьОбъект("СписокЗначений"); // список названий колонок с итогами
СпШирина = СоздатьОбъект("СписокЗначений"); // список ширин колонок по таблице
СпШирина.ДобавитьЗначение(5); // Ширина колонки "Номер строки"
// выбрать в список названия колонок по которым нужно выводить итоги
Если ПустаяСтрока(ИтогиПоКолонкам) = 0 Тогда
Если Найти(ИтогиПоКолонкам, " ") <> 0 Тогда
ИтогиПоКолонкам = СтрЗаменить(ИтогиПоКолонкам, " ", "");
КонецЕсли;
Для сч = 1 по ТЗ.КоличествоКолонок() Цикл
ТипКолонки = "";
ИмяКолонки = ТЗ.ПолучитьПараметрыКолонки(Сч, ТипКолонки);
Если (ИмяКолонки = "НомерСтроки") ИЛИ (ИмяКолонки = "НомерСтрокиДокумента") Тогда Продолжить; КонецЕсли;
Если ИтогиПоЦенам = 0 Тогда
Если Найти(ВРЕГ(ИмяКолонки), "ЦЕНА") = 1 Тогда Продолжить; КонецЕсли;
КонецЕсли;
Если ИтогиПоКолонкам = -1 Тогда // все числовые типизированные колонки
Если (ТипКолонки = "Число")ИЛИ(ТипКолонки = "Number") Тогда
СписокИтоги.ДобавитьЗначение(ИмяКолонки);
КонецЕсли;
ИначеЕсли Найти(","+ИтогиПоКолонкам+",", ","+ИмяКолонки+",") <> 0 Тогда // колонки в строковом виде,разделенные запятыми
СписокИтоги.ДобавитьЗначение(ИмяКолонки);
ИначеЕсли Найти(","+ИтогиПоКолонкам+",", ","+Сч+",") <> 0 Тогда // колонки по номерам разделенные запятыми
СписокИтоги.ДобавитьЗначение(ИмяКолонки);
КонецЕсли;
КонецЦикла;
КонецЕсли;
//[*]progadmin, 26.06.2015, ДОБАВЛЕНО НЕТИПОВОЕ
// Если Таб = "" Тогда
// Таб = СоздатьОбъект("Таблица");
// КонецЕсли;
//
// Таб.ИсходнаяТаблица("ПечатьТЗ");
// -------------
Если Таб = "" Тогда
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("ПечатьТЗ");
КонецЕсли;
//[*]_progadmin, 26.06.2015, ДОБАВЛЕНО НЕТИПОВОЕ
//[+]progadmin, 26.06.2015, ДОБАВЛЕНО НЕТИПОВОЕ
СчетчикВысотаТаблицы = 0;
//[+]_progadmin, 26.06.2015, ДОБАВЛЕНО НЕТИПОВОЕ
Если СокрЛП(Заголовок) <> "" Тогда
СчетчикВысотаТаблицы = СчетчикВысотаТаблицы + 1;
Таб.ВывестиСекцию("Шапка");
Выс = Таб.ВысотаТаблицы();
Обл = Таб.Область("R1C1:R"+Выс+"C1");
Обл.Полужирный(1);
КонецЕсли;
// заголовки таблицы
Таб.ВывестиСекцию("Строка|Общая");
Выс = Таб.ВысотаТаблицы();
Для сч = 1 по ТЗ.КоличествоКолонок() Цикл
Если КолонкиПоНазваниям = 0 Тогда
ИмяРек = ТЗ.ПолучитьПараметрыКолонки(сч);
Иначе
ИмяРек = "";
Ном = "";
ТЗ.ПолучитьПараметрыКолонки(сч,,,,ИмяРек,);
КонецЕсли;
Таб.ПрисоединитьСекцию("Строка|Столбец");
Обл = Таб.Область("R"+Выс+"C"+(Сч+1)); // ячейка в которую поместили данные
Обл.ГоризонтальноеПоложение(3); // заголовки отцентрировать и установить признак переноса
Обл.ВертикальноеПоложение(3);
Обл.Контроль(4);
Обл.Полужирный(1);
Ширина = СтрДлина(ИмяРек) * КоэффициентШрифт;
СпШирина.ДобавитьЗначение(Мин(Ширина, МаксШиринаЗаголовок));
КонецЦикла;
// вывести данные таблицы по строкам
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
Ном = ТЗ.НомерСтроки;
Таб.ВывестиСекцию("Строка|Общая");
Выс = Таб.ВысотаТаблицы();
Для сч = 1 по ТЗ.КоличествоКолонок() Цикл
ИмяРек = ТЗ.ПолучитьЗначение(Ном,сч);
ТипРек = ТипЗначения(ИмяРек);
Если ТипРек = 1 Тогда // Форматировать числовые значения - с разделителями или переданной форматной строкой
Если ПустаяСтрока(ФорматЧисловыхЗначений) = 0 Тогда
ИмяРек = СокрЛП(Формат(ИмяРек, ФорматЧисловыхЗначений));
ИначеЕсли РазделительРазрядов<>"" Тогда
Стр = СокрЛП(ИмяРек);
Длина = СтрДлина(Стр);
Поз = Найти(Стр, ".");
Точность = ?(Поз = 0, 0, Длина - Поз);
КоличествоРазделителей = Цел(Длина/3);
Длина = Длина + КоличествоРазделителей;
ИмяРек = СокрЛП(Формат(ИмяРек, "Ч0"+Длина+"."+Точность+","+РазделительРазрядов));
КонецЕсли;
ИначеЕсли ТипРек = 4 Тогда // форматировать даты стандартно, год полностью
ИмяРек = Формат(ИмяРек, "ДДДММГГГГ");
Иначе
ИмяРек = СокрЛП(ИмяРек);
КонецЕсли;
Таб.ПрисоединитьСекцию("Строка|Столбец");
Обл = Таб.Область("R"+Выс+"C"+(Сч+1)); // ячейка в которую поместили данные
Если ТипРек = 1 Тогда
Обл.ГоризонтальноеПоложение(2); // числа - вправо
ИначеЕсли (ТипРек = 2) ИЛИ (ТипРек = 11) ИЛИ (ТипРек = 12) Тогда // строки
Обл.Контроль(4)
КонецЕсли;
// Расчет ширины по содержимому ячейки
НачШирина = СпШирина.ПолучитьЗначение(Сч+1);
Ширина = СтрДлина(ИмяРек) * КоэффициентШрифт;
СпШирина.УстановитьЗначение(Сч+1, Макс(НачШирина,Ширина));
КонецЦикла;
КонецЦикла;
Если ПустоеЗначение(ВыводЗаголовковПодвал)=0 Тогда
//ЗАГОЛОВОК ТАБЛИЦЫ ВНИЗУ ТАБЛИЦЫ
// заголовки таблицы
Таб.ВывестиСекцию("Строка|Общая");
Выс = Таб.ВысотаТаблицы();
Для сч = 1 по ТЗ.КоличествоКолонок() Цикл
Если КолонкиПоНазваниям = 0 Тогда
ИмяРек = ТЗ.ПолучитьПараметрыКолонки(сч);
Иначе
ИмяРек = "";
Ном = "";
ТЗ.ПолучитьПараметрыКолонки(сч,,,,ИмяРек,);
КонецЕсли;
Таб.ПрисоединитьСекцию("Строка|Столбец");
Обл = Таб.Область("R"+Выс+"C"+(Сч+1)); // ячейка в которую поместили данные
Обл.ГоризонтальноеПоложение(3); // заголовки отцентрировать и установить признак переноса
Обл.ВертикальноеПоложение(3);
Обл.Контроль(4);
Обл.Полужирный(1);
//Ширина = СтрДлина(ИмяРек) * КоэффициентШрифт;
//СпШирина.ДобавитьЗначение(Мин(Ширина, МаксШиринаЗаголовок));
КонецЦикла;
СчетчикВысотаТаблицы = СчетчикВысотаТаблицы + 1;
КонецЕсли;
Если СписокИтоги.РазмерСписка()<>0 Тогда
// Слово ИТОГО разместим или под номером строки или под первой колонкой, если по ней нет итогов
ИтогВПервойКолонке = 1;
Ном = "";
Если ТЗ.КоличествоКолонок()> 0 Тогда
ИмяРек = ТЗ.ПолучитьПараметрыКолонки(1);
Если СписокИтоги.Принадлежит(ИмяРек) = 1 Тогда
ИтогВПервойКолонке = 0;
СпШирина.УстановитьЗначение(1, 9);
Ном = "Итого:";
КонецЕсли;
КонецЕсли;
Таб.ВывестиСекцию("Строка|Общая");
Выс = Таб.ВысотаТаблицы();
Обл = Таб.Область("R"+Выс+"C1");
Обл.Полужирный(1);
// Вывести итоговые колонки
Для сч = 1 по ТЗ.КоличествоКолонок() Цикл
ИмяКолонки = ТЗ.ПолучитьПараметрыКолонки(Сч);
Если СписокИтоги.Принадлежит(ИмяКолонки) = 1 Тогда
ИмяРек = ТЗ.Итог(ИмяКолонки);
Иначе
ИмяРек = "";
КонецЕсли;
Если ПустаяСтрока(ФорматЧисловыхЗначений) = 0 Тогда
Если "" <> ИмяРек Тогда
ИмяРек = СокрЛП(Формат(ИмяРек, ФорматЧисловыхЗначений));
КонецЕсли;
ИначеЕсли РазделительРазрядов<>"" Тогда
Стр = СокрЛП(ИмяРек);
Длина = СтрДлина(Стр);
Поз = Найти(Стр, ".");
Точность = ?(Поз = 0, 0, Длина - Поз);
КоличествоРазделителей = Цел(Длина/3);
Длина = Длина + КоличествоРазделителей;
ИмяРек = СокрЛП(Формат(ИмяРек, "Ч0"+Длина+"."+Точность+","+РазделительРазрядов));
КонецЕсли;
Если (Сч = 1)И(ИтогВПервойКолонке = 1) Тогда
ИмяРек = "ИТОГО: ";
КонецЕсли;
Таб.ПрисоединитьСекцию("Строка|Столбец");
Обл = Таб.Область("R"+Выс+"C"+(Сч+1)); // ячейка в которую поместили данные
Обл.ГоризонтальноеПоложение(2); // числа - вправо
Обл.Полужирный(1);
// Расчет ширины по содержимому ячейки
НачШирина = СпШирина.ПолучитьЗначение(Сч+1);
Ширина = СтрДлина(ИмяРек) * КоэффициентШрифт;
СпШирина.УстановитьЗначение(Сч+1, Макс(НачШирина,Ширина));
КонецЦикла;
СчетчикВысотаТаблицы = СчетчикВысотаТаблицы + 1;
КонецЕсли;
// форматируем ширину столбцов таблицы в соответствии с содержимым
Для сч = 1 по СпШирина.РазмерСписка() Цикл
Обл = Таб.Область("R1C"+Сч);
Ширина = Мин(МаксШирина, 1+СпШирина.ПолучитьЗначение(Сч));
Обл.ШиринаСтолбца(Ширина);
КонецЦикла;
//[+]progadmin, 26.06.2015, ДОБАВЛЕНО НЕТИПОВОЕ
Если ВыводНулевойТаблицы = 0 Тогда
Если (Таб.ВысотаТаблицы() - СчетчикВысотаТаблицы) = 1 Тогда Возврат 1; КонецЕсли;
КонецЕсли;
//[+]_progadmin, 26.06.2015, ДОБАВЛЕНО НЕТИПОВОЕ
Таб.Опции(ВыводСетки,ВыводЗаголовков,2);
Таб.Показать(Заголовок);
Таб.ТолькоПросмотр(1);
КонецФункции //ПечатьТЗ()
Показать
Этот вариант печати ТЗ у меня - основной. Обработка и простенький макет из двух секций у меня включен во все мои конфигурации. Печать - и как отладочная и простые отчеты.
Более продвинутый вариант, то что вам нужно смотри у меня в профайле, искать по "NotaBene" - у себя использую более продвинутый вариант с мелкми плюшками, но опубликованное - то что вам нужно. у меня эта разработка - основная, яне морочусь написанием вывода всяческих отчетов, кропаемых на быструю руку - подсовываю в обработку и ок.
Более продвинутый вариант, то что вам нужно смотри у меня в профайле, искать по "NotaBene" - у себя использую более продвинутый вариант с мелкми плюшками, но опубликованное - то что вам нужно. у меня эта разработка - основная, яне морочусь написанием вывода всяческих отчетов, кропаемых на быструю руку - подсовываю в обработку и ок.
Внимание! Тема сдана в архив
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот