gifts2017

Как присоединить области с разным количеством строк? Способ формирования печатной формы под тип ценников, но с различными по высоте областями.

Опубликовал Сергей Марченко (MarSeN) в раздел Программирование - Практика программирования

Когда нужно присоединять к таблице области с разным количеством строк, первое, что приходит на ум, сформировать промежуточную ТЗ, в которой подготовить данные для вывода в Таблицу, и потом уже из нее выводить данные. Но есть и другой способ.

Задача.

Вывести в печатную форму, на подобии печати ценников, мини-прайсы. Т.е. некий набор номенклатуры с ценами.

Для тех кто не в курсе как печатаются ценники (на примере УТ11) выводятся фиксированные блоки поочередно присоединяя их, пока они по размеру входят в выводимую область. Как только присоединение не возможно, данные выводятся на «новой строке» Таблицы. Проверка осуществляется ч/з проверить присоединение и проверить вывод

Проблема заключается в том, что количество строк в каждом мини-прайсе различна, и заранее определить фиксированную область в макете для их присоединения (методом присоединить) не представляется возможным.

Решение, приведенное выше, конечно, рабочее и может  применяться (даже применяется) на практике.  Но к моему глубокому сожалению, для меня не приемлемо по моим внутренним убеждениям (люблю, чтоб код был простым и красивым). Поэтому у меня придумался другой подход.

 

Решение

Если коротко, то алгоритм следующий:

  1. Создаем «подставной» табличный документ
  2. Получаем из макета области для формирования мини-прайса (в примере Шапка, строка, подвал)
  3. В цикле по сгруппированным данным (по данным шапки)
    1. Очищаем подставной макет
    2. Выводим в него шапку
    3. Выводим все строки (цикл по строкам)
    4. Выводим подвал
    5. Получаем область из подставной табличной части, в которую вывели данные.
    6. Далее работаем с этой областью так же, как  как если бы мы получили ее из макета целиком (проверяем на вывод и выводим)

Алгоритм не сложный, и думаю что не я первый, кто пользуется таким способом.

 

PS: Возможно, данная реализация не самая красивая и есть еще варианты. Предлагаю обсудить в комментах.

Ниже небольшая выдержка из кода обработки, прикрепленной для скачивания (демо пример в которой на ряду со «сборной» областью выводится фиксированная область, типа ценника)

 

    ТабличныйДокумент   = Новый ТабличныйДокумент;
   
ВременнаяОбласть    = Новый ТабличныйДокумент;

   
ФиксОбласть = Макет.ПолучитьОбласть("ФиксХ|У");
   
ФиксОбласть.Параметры.Текст = ТекстФиксированногоМакета;

   
Х_Шапка = Макет.ПолучитьОбласть("Х_Шапка|У");
   
Х_Строка = Макет.ПолучитьОбласть("Х_Строка|У");
   
Х_Подвал = Макет.ПолучитьОбласть("Х_Подвал|У");

   
ПерваяКолонка = Истина;
    Если
ВыводитьФиксированнуюОбласть Тогда
       
Область = ФиксОбласть;
       
ВывестиОбласть(ТабличныйДокумент, Область, ПерваяКолонка);
    КонецЕсли;
    Для
х = 1 по СтрокиТаблицы.Количество() Цикл

       
СтрокаТаблицы = СтрокиТаблицы[х-1];
       
ВременнаяОбласть.Очистить();
       
Х_Шапка.параметры.Наименование = СтрокаТаблицы.Наименование;
       
ВременнаяОбласть.Вывести(Х_Шапка);
        Для Каждого
строкаТ из СтрокаТаблицы.Строки Цикл
           
ЗаполнитьЗначенияСвойств(Х_Строка.Параметры, строкаТ);
           
ВременнаяОбласть.Вывести(Х_Строка);
        КонецЦикла;
       
ВременнаяОбласть.Вывести(Х_Подвал);
       
Область = ВременнаяОбласть.ПолучитьОбласть("R1C1:R"+ВременнаяОбласть.ВысотаТаблицы+"C"+ВременнаяОбласть.ШиринаТаблицы);

       
ВывестиОбласть(ТабличныйДокумент, Область, ПерваяКолонка);

        Если
ВыводитьФиксированнуюОбласть Тогда
           
Область = ФиксОбласть;
           
ВывестиОбласть(ТабличныйДокумент, Область, ПерваяКолонка);
        КонецЕсли;

    КонецЦикла;

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Пример
.epf 8,48Kb
22.10.13
40
.epf 8,48Kb 40 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Евгений Пономаренко (Evgen.Ponomarenko) 22.10.13 10:29
Тема весьма актуальна, только-только решал аналогичную задачу используя ТЗ.
2. Макас (makas) 22.10.13 11:14
3. Сергей Марченко (MarSeN) 22.10.13 11:17
(1) Evgen.Ponomarenko, (2) makas,
Спасибо! Надеюсь пригодится на практике.
4. Илья Парамонов (Crush) 23.10.13 11:12
Спасибо! Возьму на заметку
5. Владимир Марченко (RimidalV) 23.10.13 11:27
Актуальная тема, постоянно натыкаюсь на эти грабли. Молодец.
6. Евгений (Algiz) 23.10.13 22:31
Спасибо, возьму на заметку
7. Сергей Курышов (sudmorsh) 26.10.13 11:48
Очень интересно Спасибо! Надеюсь пригодится на практике
9. Евгений ___ (Evgeniy_begin_progger) 28.02.15 23:41
(1) Evgen.Ponomarenko, кинь на почту, плз KrasevE@yandex.ru
10. Антон Булычев (HystriX) 27.04.15 12:56
Если уж так любите, чтобы код был красивым, зачем используете конкатенацию при получении области? Есть же вариант метода с простым указанием четырех параметров. Вместо этого собираете строку, на это тратится лишнее время и жрется память. Причем этот вариант не будет работать, если строк будет больше 1000, формат по умолчанию группирует разряды чисел по три, получите вместо "R1000" строку "R1 000" и вылезет ошибка. Тогда уж нужно делать Формат(..., "ЧГ=0"). Про этот нюанс вообще любят забывать очень многие разработчики.

Если по существу публикации, неплохой альтернативный метод решения задачи.
11. Сергей Марченко (MarSeN) 08.05.15 13:47
(10)
"R1 000" - косяк. Не обратил внимание.
Писал пример под идею, просто для статьи и не причесывал.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа