Редактирование функции и шаблона на примере шаблона "ценники"
В процессе работы с программой пользователи зачастую сталкиваются с тем, что в связи со спецификой их деятельности, либо еще по какой-то другой причине необходимо внести определенные изменения в существующий шаблон печатной формы. Программный комплекс Гедымин создан таким образом, чтобы дать пользователю максимальную свободу во внесении подобных правок. В качестве примера мы возьмем ситуацию в которой пользователь столкнулся с необходимостью добавить на обратной стороне бланка Ценники дату и номер приходной накладной, по которой был получен данный товар.
Для того, чтобы добавить данные колонки нам нужно узнать название этих полей в документе. Для этого мы через Исследователь открываем форму просмотра документа Приходная накладная, и нажав клавишу F10 вызываем Мастер установок. Здесь мы переключаемся на закладку Колонки и видим таблицу из двух столбцов. Левый -- название колонки, правый -- поле. Сверившись, мы выясняем, что Дата -- это DOCUMENTDATE, а Номер -- NUMBER. Закрываем окно мастера установок.
Далее, для правки шаблона необходимо открыть редактор скрипт-объектов. Для этого в списке интересующих нас документов (в нашем случае это приходные накладные) мы нажимаем на значек принтера и выбираем пункт Редактор скрипт-объектов. Откроется окно редактора, где мы будем вносить все необходимые изменения. Для начала, в левой части редактора у нас открыто окно Проводник (если оно не открылось автоматически, мы можем открыть его самостоятельно, выбрав пункт Проводник в меню Окно). В проводнике мы выбираем интересующий нас пункт -- Ценники -- и открываем его двойным щелчком. В открывшемся окне, мы переключаемся на закладку Основная функция, и, чуть ниже, -- на закладку Скрипт. Просматривая исходный код выясняем, что в нем уже фигурирует поле DOCUMENTDATE, но вот поля NUMBER нет. Следовательно, мы добавляем поле NUMBER, везде вслед за полем DOCUMENTDATE по его образу и подобию. Следует учесть, это то, что свойство AsDateTime работает с типом дата, который не очень подойдет полю NUMBER, поэтому это свойство мы заменим на AsString. В общей сложности мы должны добавить в текст функции поле NUMBER шесть раз. В конечном счете, после внесения всех правок мы должны прийти к следующему виду функции:
function RetailInv_rp_AddwBill_Order147050326_88538865(OwnerForm, CountOnQuantity) set gdcInvDocument = OwnerForm.gdcObject if gdcInvDocument.IsEmpty then call Exception.Raise("Exception", "Пустой набор данных") end if BaseQueryList.Clear set CustomerSQL = BaseQueryList.Query(BaseQueryList.Add("CustomerSQL", 0)) CustomerSQL.SQL = _ "select * from GD_V_company where id = " + Cstr(IBLogin.Companykey) CustomerSQL.Open id = gdcBaseManager.GetIDByRUIDString("147006033_63934951") set t = BaseQueryList.Query(BaseQueryList.Add("T", 0)) t.SQL = "SELECT gr.lb, gr.rb from " & _ "gd_goodgroup gr " & _ "where gr.id= " + CStr(id) t.Open set q1 = BaseQueryList.Query(BaseQueryList.Add("GDCINVDOCUMENTLINE", 0)) q1.SQL = " SELECT " + _ " Z.DOCUMENTDATE, INVLINE.QUANTITY, Z.NUMBER, " + _ " G.NAME AS GOODNAME, " + _ " G.ALIAS AS GOODALIAS, " + _ " V.NAME, " + _ " CARD.USR$INV_COSTRETAILNCU AS TO_USR$INV_COSTRETAILNCU " + _ " FROM GD_DOCUMENT Z " + _ " LEFT JOIN USR$INV_ADDWBILLLINE INVLINE ON ( Z.ID = INVLINE.DOCUMENTKEY ) " + _ " LEFT JOIN INV_CARD CARD ON ( CARD.ID = INVLINE.FROMCARDKEY ) " + _ " LEFT JOIN GD_GOOD G ON ( G.ID = CARD.GOODKEY ) " + _ " LEFT JOIN GD_GOODGROUP gg on g.GROUPKEY = GG.ID " + _ " LEFT JOIN GD_VALUE V ON ( G.VALUEKEY = V.ID ) " + _ " LEFT JOIN AC_ACCOUNT CARD_USR$INV_ACCOUNTKEY ON ( CARD.USR$INV_ACCOUNTKEY = CARD_USR$INV_ACCOUNTKEY.ID ) " + _ " LEFT JOIN GD_DOCUMENT CARD_USR$INV_ADDLINEKEY ON ( CARD.USR$INV_ADDLINEKEY = CARD_USR$INV_ADDLINEKEY.ID ) " + _ " LEFT JOIN GD_CONTACT CARD_USR$INV_PROVIDER ON ( CARD.USR$INV_PROVIDER = CARD_USR$INV_PROVIDER.ID ) " + _ " WHERE not (GG.LB >= :lb AND GG.RB <= :rb) and Z.PARENT = " + gdcInvDocument.FieldByName("id").AsString q1.ParamByName("LB").AsInteger=t.FieldByName("lb").Asinteger q1.ParamByName("rB").AsInteger=t.FieldByName("rb").Asinteger q1.Open set q11 = BaseQueryList.Query(BaseQueryList.Add("GDCINVDOCUMENTLINE1", 1)) call q11.AddField("DOCUMENTDATE", "ftDate", 0, 0) call q11.AddField("NUMBER", "ftString", 20,0) call q11.AddField("GOODNAME", "ftString", 60, 0) call q11.AddField("GOODALIAS", "ftString", 20, 0) call q11.AddField("NAME", "ftString", 20, 0) call q11.AddField("TO_USR$INV_COSTRETAILNCU", "ftBCD", 0, 0) q11.Open while not q1.EOF if CountOnQuantity then for i = 0 to Int(q1.FieldByName("quantity").AsCurrency) - 1 q11.Append q11.FieldByName("documentdate").AsDateTime = _ q1.FieldByName("documentdate").AsDateTime q11.FieldByName("NUMBER").AsString=_ q1.FieldByName("NUMBER").AsString q11.FieldByName("goodname").AsString = _ q1.FieldByName("goodname").AsString q11.FieldByName("goodalias").AsString = _ q1.FieldByName("goodalias").AsString q11.FieldByName("name").AsString = _ q1.FieldByName("name").AsString q11.FieldByName("TO_USR$INV_COSTRETAILNCU").AsCurrency = _ q1.FieldByName("TO_USR$INV_COSTRETAILNCU").AsCurrency q11.Post next else q11.Append q11.FieldByName("documentdate").AsDateTime = _ q1.FieldByName("documentdate").AsDateTime q11.FieldByName("NUMBER").AsString=_ q1.FieldByName("NUMBER").AsString q11.FieldByName("goodname").AsString = _ q1.FieldByName("goodname").AsString q11.FieldByName("goodalias").AsString = _ q1.FieldByName("goodalias").AsString q11.FieldByName("name").AsString = _ q1.FieldByName("name").AsString q11.FieldByName("TO_USR$INV_COSTRETAILNCU").AsCurrency = _ q1.FieldByName("TO_USR$INV_COSTRETAILNCU").AsCurrency q11.Post end if q1.Next wend set RetailInv_rp_AddwBill_Order147050326_88538865 = BaseQueryList end function
Закончив с функцией, переходим к закладке Шаблон. При открытии закладки, на ее панели инструментов присутствуют четыре кнопки. Нас интересует -- Редактировать шаблон.
Итак, перед нами шаблон печатной формы ценники. Прежде всего, поскольку мы хотим, чтобы данные по номеру и дате накладной печатались на обороте ценника, то нам необходимо добавить вторую страницу. Что мы и делаем, щелкнув правым кликом по закладке Стр. 1 и выбрав пункт добавить страницу. Теперь переключаемся на эту вторую страницу, и в инспекторе объектов указываем в строке Colums значение 3. Таким образом, мы разбиваем лист на три колонки. Перед тем, как внести непосредственно данные нужно добавить Master Data, нажав в правой части на кнопку Вставить секцию и выбрав появившемся окне соответствующий пункт. Далее, нам нужно сориентироваться по размерам ценника, чтобы его лицевая и обратная сторона совпадали между собой. Для этого на первом листе мы выделяем ценник целиком, копируем его и вставляем на вторую страницу. Теперь, у нас есть размеры ценника, но нет его заполнения. Поэтому, мы удаляем все его внутренние поля и вместо них добавляем свои. Для добавления поля, мы нажимаем в левой части окна на кнопку Вставить прямоугольник с текстом и выбираем, куда его вставить. Поле будет вставляться от положения курсора вниз и вправо. Как только мы его вставим, у нас открывается редактор текста, чтобы указать заполнение поля. Чтобы в шаблоне выводились соответствующие значения, нам нужно нажать кнопку Вставка поля БД. Открывается окно для выбора поля. В левой части этого окна мы выбираем группу -- GDCINVDOCUMENTLINE -- а в правой поле -- соответственно DOCUMENTDATE и NUMBER. Выбрав поля, нажимаем кнопку ОК в верхней части окна и возвращаемся в режим Дизайнер. Здесь, зацепив мышкой за уголок поля мы растягиваем его до нужных нам размеров. Для того, чтобы добиться более эстетического вида мы можем внести нужные нам данные в разных полях и разместить их в шаблоне так, как нам нужно.
Осталось сохранить изменения и выйти из шаблона. Есть, однако проблема, которая возникает при неполном заполнении листа и связана с тем, что обратная сторона заполняется при печати зеркально лицевой. В данном случае, поскольку ценники все равно заполняются с обратной стороны одинаковыми данными проблему можно решить убрав на второй транице разделения на колонки и заполнив ее одинаковыми ячейками целиком.