вторник, 14 ноября 2017 г.

1С 7.7: вывод прайс-листа в 2 и более колонок

Задача: В 1С 7.7 экономить бумагу, печатая прай-лист в несколько колонок.

Решение: Весь прайс с группами, элементами и даже нумерацией строк выгружаем в таблицу значений (в примере генерится таблица на 500 элементов). Высота первой и последующих страниц задается отдельно..
Текст обработки под катом.

p.s. чёт валялось в черновиках с 2016


Перем таб; // печатная форма
Перем тз; // таблица значений, которую надо вывести в несколько колонок

// _режим 0 с новой строки, 1 - присоединить, группы и товары выводим разными секциями
Процедура ВывестиСекцию(_ном, _режим = 0)

 тз.ПолучитьСтрокуПоНомеру(_ном);
 
 Если тз.инфо="элемент" Тогда
  сч = тз.сч;
  тмц = тз.тмц;
  цена = тз.цена;
  ИмяСекции = "тмц"; // имя секции для простого товара
 ИначеЕсли тз.инфо="группа" Тогда  
  группа = тз.тмц;
  ИмяСекции = "группа"; // имя секции для группы
 КонецЕсли;
 
 Если _режим = 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 По КоличествоКолонок Цикл
     таб.ПрисоединитьСекцию("шапка|база");
    КонецЦикла;
   КонецЦикла;
   
  КонецЕсли;
  
 КонецЦикла;

  таб.Показать(); 
 
КонецПроцедуры

Комментариев нет: