Что такое шаблон и как вывести в документ список записей с заголовком на каждой странице?

#1
Не получается вставить данные в шаблон документа. В шапку вставляется а в таблицу нет. Таблица сложная, с нумерацией по строкам и столбцам и сложными заголовками. Кроме того она длинная и переносится со страницы на страницу частями а шаблон выдаёт одну. Причём готовый документ должен точно соответствовать представленному стандарту.
Нужно понимание пошаговых действий при создании собственного шаблона и чем вообще шаблон отличается от собственно готового документа.

1513607812671.png
 

Vladimir

Администратор
Команда форума
#2
Начну с конца, так как это самый главный вопрос, остальные - лишь технические детали.

чем вообще шаблон отличается от собственно готового документа
Во всех самых распространённых офисных пакетах есть понятие шаблона. На самом деле программа (MS Office, Open/Libre Office и др.) не создаёт документ как таковой. Документ создаётся на базе шаблона. Базовый шаблон для пустого документа в MS называется Normal (dot, dotx, dotm, xlt, xltx, ...), в котором заданы исходные стили и настройки, определяющие общий вид документа. Текста в этом шаблоне нет, поэтому создаваемый документ изначально пуст, но имеет уже предопределённый размер шрифта, границы, табуляции, отступы, межстрочный интервал и прочее. Если в Normal добавить какое либо содержание или изменить настройки, то все новые документы, которые будут создаваться на его основе - будут содержать внесённую в него информацию.
Рядовой пользователь с этим внутренним механизмом обычно не сталкивается и понятие шаблона для него ничего не говорит.
Но мы в своём конструкторе решили его использовать. Замечу, что идея создания документа на базе подготовленного шаблона была нами впервые применена более 20 лет назад.
Вот несколько причин, почему шаблон удобнее обычного документа:
- документ создаётся как реплика (копия) шаблона в памяти и изначально не представляет из себя копии на физическом носителе;
- при необходимости полученный документ в памяти можно распечатать и не сохранять на диске, т.е. не происходит создания кучи документов, которые потом приходится удалять;
- при работе по сети шаблон пересылается на клиентский компьютер, где происходит создание любого числа документов, не загружая при этом сетевой трафик;
- шаблон невозможно случайно переписать или удалить - созданный документ по умолчанию имеет расширение .doc/.docx/.xls/xlsx/..., а кроме того, шаблоны обычно хранятся в служебных папках, доступа к которым обычному пользователю не требуется.
При работе в файловой системе, если открыть контекстное меню на имени файла шаблона, то по умолчанию система предлагает создание на его основе документа (по двойному клику), и лишь вторым пунктом идёт команда изменения самого шаблона, что дополнительно предотвращает нарушение структуры исходного образца.
Файлы шаблонов.png

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

Vladimir

Администратор
Команда форума
#3
Не получается вставить данные в шаблон документа. В шапку вставляется а в таблицу нет.
Шаблон документа для объекта позволяет выводить только данные одной, текущей записи.
Для вывода списка записей требуется использовать форму (связи или итогов). При создании шаблона, программа смотрит, есть ли на форме детализация записи? Если она есть, то создаётся шаблон со структурой, предназначенной для вывода данных одной записи (как в объекте). Но если в форме убрано отображение детализации, то при создании шаблона формируется специальная внутренняя структура, предназначенная для вывода списка записей. Данная структура характеризуется наличием специальных тегов, которые определяют начало и окончание блока, дублируемого для каждой записи (http://runabase.ru/help/pattern.html#mainlist):
Код:
[ИмяФормы...]
дублируемый блок с полями каждой записи основного объекта
[...ИмяФормы]
Блоком может быть несколько символов, строка, несколько строк, таблица, страница или несколько страниц, что позволяет выводить пакеты документов для всего списка записей.
Теги можно внести вручную, а автоматическое их создание при отсутствии детализации - лишь удобство в работе. Также при автоматическом формировании структуры, в дублируемый блок подставляются только отображаемые в списке записей поля. Если необходимо добавить другие поля данного или подчинённого объекта - их надо прописывать вручную.

Пример проекта с шаблоном документа для формы связи - в приложении.
 

Вложения

Vladimir

Администратор
Команда форума
#4
Кроме того она длинная и переносится со страницы на страницу частями а шаблон выдаёт одну. Причём готовый документ должен точно соответствовать представленному стандарту.
Чтобы заголовок таблицы повторялся на каждой последующей странице, необходимо нужным строкам в свойствах таблицы задать повтор как заголовка.
Выделяем строки, которые должны повторяться и через контекстное меню на выделении выбираем "Свойства таблицы".
Свойства таблицы.png
На второй вкладке "Строка" ставим галочку для свойства "Повторять как заголовок на каждой странице".
Повторять как заголовок на каждой странице.png
Теперь при формировании длинных списков, таблица будет иметь одинаковый заголовок на всех страницах.
 
#5
Что такое шаблон теперь понятно!
А вот последовательность действий при конкретной задаче так и неясна. Когда нажимаем создать шаблон то формируется список с надписями. А рядом у нас есть документ который надо вставить в программу. Что из них является шаблоном и что во что вставлять?
 

Vladimir

Администратор
Команда форума
#6
Шаблон документа можно сделать вручную, с нуля - на базе автоматически создаваемого в конструкторе. Для этого надо создать в нём всю структуру с оформлением и расставить поля, куда будет помещена информация из базы данных.
Создание шаблона в окне редактора шаблонов.png

При автоматическом создании шаблона, в него добавляются все поля объекта (формы), на базе которого создаётся шаблон. Добавляются не только поля самого объекта, но и поля всех ссылочных объектов. Т.е. выстраивается иерархия всех полей, которые можно получить на базе данного объекта. При сложных структурах иногда получаются шаблоны на несколько страниц.

Но, при наличии уже существующего документа, гораздо удобнее использовать его в качестве основы для создания шаблона. Для этого необходимо нужный документ сохранить как шаблон.
Перед этим можно создать шаблон в конструкторе для нужного объекта/формы, так как при этом будет создан и каталог для объекта/формы. Этот шаблон мы будем использовать как список с образцами полей (чтобы не набирать их вручную).
Сохраняемый документ как шаблон, надо поместить в туже самую папку, где предварительно автоматически создали шаблон с полями.
Сохранить документ Word как шаблон.png

Теперь в нужные места подготавливаемого шаблона, копируем требуемые поля из образца. Это значительно ускоряет работу и минимизирует число ошибок. После переноса всех необходимых полей, образец можно удалить с диска.
 
#7
Попробуем двинутся дальше на основе конкретной задачи.
Имеется форма связи с группами и дочерний объект с учениками причисленными к группе. Необходим документ установленного образца с составом выбранной группы.
Имеется два шаблона, копия необходимого списка в формате шаблона и автоматически созданный документ.
Далее берём данные с квадратными скобками и вставляем в нужные места шапки документа. Всё работает.
Переходим к таблице учеников. Предположительно, таблица в документе для переделки не годится для работы так как подставленные данные должны быть увязаны с структурой данных в программе. Поэтому наверное просто делаем свою точно такую же на основе макета представленного в автоматически созданном документе.
И вот тут первое препятствие, таблица очень длинная.
1513669807688.png

И она по определению не влезет в документ. Именно поэтому в документе который необходимо приготовить эта таблица разделена на несколько частей каждая из которых на своей странице и является продолжением предыдущей.
А в документе который приготовлен программой мы видим что всё просто не помещается.
1513670099189.png

Соответственно, для начала нужно привести в соответствие таблицу в списке с переносами по страницам и исходный макет в шаблоне.
С чего начать?
 

Vladimir

Администратор
Команда форума
#8
Поэтому наверное просто делаем свою точно такую же на основе макета представленного в автоматически созданном документе.
Вот как раз в данном случае лучше вручную оформить таблицу, не используя пример в образце.
В таблице оставить шапку и первую строку с данными, и разделить их командой "Макет"-"Разделить таблицу". Между шапкой и строкой с данными вставить начальный тэг [Ученик...], а после строки с данными - конечный тэг [...Ученик].
После этого в строке с данными заменить старое содержимое на имена полей, которые можно взять в шаблоне с образцами. Если каких-либо полей там нет, то их надо прописать вручную. В образце формируется таблица со всеми видимыми полями дочернего списка, а в данном случае, вероятно, нужны только определённые поля.
 
#9
В таблице оставил шапку и первую строку с данными.
1513675391310.png

Где взять эту команду "Макет"-"Разделить таблицу"? Команду применить только к первой части таблицы или ко всем?
 

Vladimir

Администратор
Команда форума
#11
Надо выделить строку, которая будет отделяться (или поставить в неё курсор) и в меню для таблицы "Макет" выбрать операцию "Разделить таблицу".
Разбить таблицу на две части.png
 

Vladimir

Администратор
Команда форума
#12
В разных Office-ах видно разный перевод.
В одном случае - "Разбить ...", а в другом - "Разделить ...".
 
#13
Разбил первую часть таблицы. Остальные части остались неизменны.
Следует повторить операцию для каждой части?
Или в данном случае это фактически разные таблицы и надо делать по другому?
 

Vladimir

Администратор
Команда форума
#14
Извиняюсь за непонимание - после получения (в личку) примера шаблона всё стало ясно.

В результате разбиения таблицы надо получить только две части:
- первая: которая останется в качестве шапки;
- вторая послужит для создания дублируемого блока, в который будут помещаться данные из базы.

Каждую вторую часть таблицы, в которую будут помещаться данные, надо обернуть тэгами.

Число таблиц в документе не ограничено, поэтому при необходимости заполнения данных по частям (как в приведённом примере), создаётся столько таблиц, сколько надо.
 

Вложения

Vladimir

Администратор
Команда форума
#16
Ещё по поводу оформления. Таблицы можно разнести по страницам, вставив перед каждой разрыв страницы.
И для удобства восприятия - в начале каждой таблицы продублировать ФИО - но это уже по согласию с заказчиком.
 
#17
Таблицы сам догадался разнести, а по ФИО буду уточнять у заказчика.
Теперь вот мелкие доделки надо решить. Например в оригинале документа должно быть "Населённый пункт" а я для простоты в программе установил "Н пункт".
Теперь или прописывать в программе полное название что неудобно для пользования, или вставлять строки в константы.
 

Vladimir

Администратор
Команда форума
#18
Как обозначены поля в структуре документа - совершенно не важно для документа. Программа лишь обрабатывает информацию в тексте, которая заключена в квадратные скобки. А весь остальной текст за его пределами остаётся неизменным.
Т.е. в программе поле можно обозначить как "Н пункт", а в документе расписать "Населённый пункт". Есть смысл поля делать максимально краткими, чтобы они не занимали полезное пространство в окне программы, а шаблонах уже полно расписывать все сокращения и обозначения.
 

Vladimir

Администратор
Команда форума
#20
Принцип формирования документа: программа открывает шаблон, ищет в нём контексты обозначенные квадратными скобками и, если они соответствуют константам или полям объекта, то производит их замену на данные из базы. Несколько больше работы производится с функциями и списками, но это уже технические детали при общем принципе. Если контекст не соответствует данным из программы, он остаётся неизменным, что позволяет находить в сформированном документе ошибки именования полей.
Всё, что находится за пределами обозначенных полей - для программы не существует. Соответственно она на всё остальное не влияет и изменить не может. Там разработчик может помещать любую информацию, которая и составляет костяк документа, а также обозначать вставляемые данные как ему удобно и понятно.
Собственно говоря потому шаблон и называется шаблоном, что общая структура и информация документа не меняется, а лишь производится корректировка исходной заготовки. Задача разработчика - определить неизменную часть документа, и то, что может меняться в ходе получения результата. А дальше уже дело техники, т.е. программы.

Как уже упоминалось ранее - одно из достоинств шаблона, это отсутствие копии документа на физическом носителе, когда документ сформирован и может быть распечатан (основная задача Office-ного приложения), а его хранение не требуется. И даже если требуется, нет никакой необходимости его сохранять - можно в любой момент времени найти информацию в базе данных при помощи фильтра и ещё раз получить готовый к печати документ. Плюсы такого подхода: диск не забивается, нужный документ получается в пару кликов.

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