Задача: В 1С 7.7 экономить бумагу, печатая прай-лист в несколько колонок.
Решение: Весь прайс с группами, элементами и даже нумерацией строк выгружаем в таблицу значений (в примере генерится таблица на 500 элементов). Высота первой и последующих страниц задается отдельно..
Текст обработки под катом.
p.s. чёт валялось в черновиках с 2016
Решение: Весь прайс с группами, элементами и даже нумерацией строк выгружаем в таблицу значений (в примере генерится таблица на 500 элементов). Высота первой и последующих страниц задается отдельно..
Текст обработки под катом.
p.s. чёт валялось в черновиках с 2016
Перем таб;
печатная форма
//
Перем тз;
//
таблица значений, которую надо вывести в несколько колонок
//
Процедура ВывестиСекцию(_ном, _режим = 0) тз.ПолучитьСтрокуПоНомеру(_ном); Если тз.инфо="элемент" Тогда сч = тз.сч; тмц = тз.тмц; цена = тз.цена; ИмяСекции = "тмц";
_режим 0 с новой строки, 1 - присоединить, группы и товары выводим разными секциями
//
ИначеЕсли тз.инфо="группа" Тогда группа = тз.тмц; ИмяСекции = "группа";
имя секции для простого товара
//
КонецЕсли; Если _режим = 0 Тогда таб.ВывестиСекцию(ИмяСекции+"|база"); Иначе таб.ПрисоединитьСекцию(ИмяСекции+"|база"); КонецЕсли; КонецПроцедуры // Процедура Сформировать() // виртуальная таблица товаров/групп тз = СоздатьОбъект("ТаблицаЗначений"); тз.НоваяКолонка("сч", "Число"); тз.НоваяКолонка("инфо","Строка"); тз.НоваяКолонка("тмц", "Строка"); тз.НоваяКолонка("цена","Число"); // заполняем 500 строками сч = 0; //отдельный счетчик товаров, нужен, т.к. строки с группами пропускаем Для поз = 1 По 500 Цикл тз.НоваяСтрока(); Если поз%70=0 Тогда // каждые 70 элементов будет группа тз.инфо = "группа"; тз.тмц = "группа"+Строка(поз); Иначе тз.инфо = "элемент"; сч = сч + 1; // нумерация только для элементов тз.сч = сч; тз.тмц = "товар"+Строка(поз); тз.цена = поз*1.05; КонецЕсли; КонецЦикла; // общие переменные ном = 0; // счетчик строк таблицы СтрокВТаблице = тз.КоличествоСтрок(); КоличествоКолонок = 2; // 3-4-5 ... сколько надо СтрокНа1Странице = 60; // СтрокНа2Странице = 70; // на всех страницах кроме первой ТекущаяСтраница = 1; СтрокНаСтранице = СтрокНа1Странице; // печатная форма таб = СоздатьОбъект("Таблица"); таб.ИсходнаяТаблица("Таблица"); таб.ВывестиСекцию("заголовок"); таб.ВывестиСекцию("шапка|база"); Для сч = 2 По КоличествоКолонок Цикл таб.ПрисоединитьСекцию("шапка|база"); КонецЦикла; //
имя секции для группы
перебор строк таблицы
Пока ном < СтрокВТаблице Цикл ном=ном+1; ВывестиСекцию(ном, 0); // 0 - с новой строки Для К=2 По КоличествоКолонок Цикл СтрокаТаблицыВСледующейКолонке = ном + СтрокНаСтранице * (К - 1); Если СтрокаТаблицыВСледующейКолонке<=СтрокВТаблице Тогда
// если существует строка в следующей колонке
ВывестиСекцию(СтрокаТаблицыВСледующейКолонке, 1); // 1- присоединить КонецЕсли; КонецЦикла; Если (ТекущаяСтраница=1) И ( ном=СтрокНа1Странице ) Тогда // если закончилась 1-й колонка 1-й страницы НачатьНовуюСтраницу = 1; // установим флаг начала новой страницы СтрокНаСтранице = СтрокНа2Странице; // запомним, что со 2-й страницы количество строк будет другим ном = СтрокНа1Странице*КоличествоКолонок; // и спозиционируемся в конец первого листа ИначеЕсли (ТекущаяСтраница>1) И //(вся первая страница + все полные полные предыдущие страницы + 1 колонка последней страницы) (ном=СтрокНа1Странице*КоличествоКолонок+КоличествоКолонок*СтрокНа2Странице*(ТекущаяСтраница-2)+СтрокНа2Странице) // закончилась 1-я колонка любой другой страницы Тогда НачатьНовуюСтраницу = 1; // установим флаг начала новой страницы ном = СтрокНа1Странице*КоличествоКолонок+КоличествоКолонок*СтрокНа2Странице*(ТекущаяСтраница-1);
// позиционируемся на последней строке текущей страницы
Иначе НачатьНовуюСтраницу = 0; КонецЕсли; Если (НачатьНовуюСтраницу = 1) И (СтрокаТаблицыВСледующейКолонке<=СтрокВТаблице) Тогда // не просто новую, а когда еще есть строки для новой страницы таб.НоваяСтраница(); ТекущаяСтраница = ТекущаяСтраница + 1; // шапку дублируем на каждой странице Для сч = 1 По КоличествоКолонок Цикл таб.ВывестиСекцию("шапка|база"); Для сч = 2 По КоличествоКолонок Цикл таб.ПрисоединитьСекцию("шапка|база"); КонецЦикла; КонецЦикла; КонецЕсли; КонецЦикла; таб.Показать(); КонецПроцедуры
Комментариев нет:
Отправить комментарий