Block( { Const('DocForm', String, Global, DCL.GetRegString('HKCU', AppRegKey('MAIN\Настройка описи'), 'Форма описи', '1')), } Const('DocForm', String, Global, '1'), Const('RNDForm', Integer, Global, (DocForm = '2')), Var('TopBands', Memo, Global), Var('BufString', String, Global), Var('BufInt', Integer, Global), Var('BufMemo', Memo, Global), Const('NPP', Integer, Global, 0), {множественные настройки печати} Const('UseBottomBand', Integer, Global, (DCL.GetRegString('HKCU', AppRegKey('MAIN\Настройка описи'), 'Нижний колонтитул', '1') <> '0')), Const('UseTotalPages', Integer, Global, (DCL.GetRegString('HKCU', AppRegKey('MAIN\Настройка описи'), 'Общие число документов и число листов прописью', '0') <> '0')), Const('UseCustomsMarksBand', Integer, Global, (DCL.GetRegString('HKCU', AppRegKey('MAIN\Настройка описи'), 'Отметки таможни', '0') <> '0')), Const('FullTopBand', Integer, Global, (DCL.GetRegString('HKCU', AppRegKey('MAIN\Настройка описи'), 'Верхний колонтитул полностью', '0') = '1')), Const('PrintCopySuffix', String, Global, DCL.GetRegString('HKCU', AppRegKey('MAIN\Настройка описи'), 'Допечатывать "-копия"', '0')), Const('PrintCopySuffix1', String, Global, DCL.GetRegString('HKCU', AppRegKey('MAIN\Настройка описи'), 'Допечатывать "-оригинал"', '0')), Const('PrintPartHeaders', String, Global, DCL.GetRegString('HKCU', AppRegKey('MAIN\Настройка описи'), 'Печатать заголовки разделов в описи по форме 2010', '0')), Const('PrintPagesInfo', Integer, Global, (DCL.GetRegString('HKCU', AppRegKey('MAIN\Настройка описи'), 'Печатать номера страниц', '0') = '1')), { Const('SimpleNumMode', Integer, Global, (DCL.GetRegString('HKCU', AppRegKey('MAIN\Настройка описи'), 'В описи по форме 2010 на печати нумерация всегда сквозная', '1') = '1')), } Const('SimpleNumMode', Integer, Global, 1), {Первый лист начинаем с блока номеров листов - по настройке} If(PrintPagesInfo, DL.Roll(D.Instance(smpDL)+'.Pages_Info')), {Основной заголовок таблицы} smpDL.SDP('Header_1'), smpDL.SFP('Номер ДТ', 'Caption', DCL.GetNDCaption(DCL.GetFieldVal(PRIM, 'ND'))), smpDL.SFP('Декларант', 'Caption', GetDocListFirmNameAndAddress()), smpDL.Update(), DL.Roll(D.Instance(smpDL)+'.Header_1'), {Подзаголовок таблицы - номера колонок} DL.Roll(D.Instance(smpDL)+'.Header_2'), {Подготовка блока подписей, пока не присоединяем, просто формируем и оцениваем высоту} smpDL.SDP('Footer'), ClearPage(smpDL), FillPage(smpDL, PRIM), smpDL.SFP('ФИО', 'Caption', DCL.GetFIO(PRIM, 1)), If(IsTransitDocList, Block( {Перевозчик} smpDL.SFP('Перевозчик', 'Caption', GetMemoVal(PRIM, 'G502', 1)), {ФИО представителя перевозчика} smpDL.SFP('G50DFullName', 'Caption', GetGTDFirmNameAndAddress('50D', 2)), smpDL.SFP('Декларант', 'Caption', GetDocListFirmNameAndAddress()), smpDL.SFP('Дата подписи перевозчика', 'Caption', DCL.GetFieldValFmt(PRIM, 'G542', 'dd.mm.yyyy')), smpDL.SFP('Дата представления', 'Caption', DCL.GetFieldValFmt(PRIM, 'G542', 'dd.mm.yyyy')) )), smpDL.Update(), {Оценка высоты штатного блока подписей, он по настройке будет появляться на каждой странице} Var('iFooterHeight', Integer, Global), Let(@iFooterHeight, smpDL.Height()), {Оценка высоты финального блока подписей, который пойдет на последнюю страницу, его состав зависит от настроек} Const('iFinalFooterHeight', Integer, Global, iFooterHeight), If(UseTotalPages, Block( {учтем высоту блока <Общее кол. документов и листов>} Const('Footer2Name', String, Global, 'Footer_2_V'), Let(@Footer2Name, Footer2Name + If(DocForm = '3', '2', '1') ), smpDL.SDP(Footer2Name), Let(@iFinalFooterHeight, iFinalFooterHeight + smpDL.Height()) ) ), If(UseCustomsMarksBand, Block( {учтем высоту блока <Штамп для таможни>} smpDL.SDP('CustomsMarks'), Let(@iFinalFooterHeight, iFinalFooterHeight + smpDL.Height()) ) ), {Функция интеллектуально добавит текущий банд smpDL, см. внутри комментарии} Func('RollTableRow', Local, Internal, , Block( {нужно решить, будет ли данная строка последней в таблице} Const('IsLast', Integer, Local, 0), If(Part = PartsCount, {последний раздел} If(Not(BufInt), {записей больше нет} If(Value('Global.PrintAdditionalEmptyRows' + Part) = 0, Let(@IsLast, 1) ) ) ), Const('BandName', String, Local, smpDL.DPN(smpDL.HDPS())), {оценим высоту строки + высоту подписи под таблицей, если строка последняя в таблице, или + высоту нижнего колонтитула, если строка последняя на странице} Var('iTestHeight', Integer, Global), Let(@iTestHeight, smpDL.Height() + If(IsLast, iFinalFooterHeight, If(UseBottomBand, iFooterHeight, 0) ) ), {начнем с нового листа, если оцененная высота превышает вместимость страницы} If(DL.Space() < iTestHeight, Block( If(UseBottomBand, DL.Roll(D.Instance(smpDL) + '.Footer')), DL.RollBreak() ) ), {готовимся к добавлению строки} DL.PrepareRoll(D.Instance(smpDL) + '.' + BandName), If(DL.IsNewPage(), Block( {ожидаем переход на новую страницу, нужно определить верхний колонтитул} Let(@TopBands, ""), {номера страниц - по настройке} If(PrintPagesInfo, Let(@TopBands, ConvertToMemo(D.Instance(smpDL) + '.Pages_Info')) ), {полный заголовок таблицы - по настройке} If(FullTopBand, AddToMemo(@TopBands, D.Instance(smpDL) + '.Header_1') ), {подзаголовок таблицы (номера столбцов) - безусловно} AddToMemo(@TopBands, D.Instance(smpDL) + '.Header_2'), DL.SetTopBands(TopBands) ) ), {готово, добавляем} DL.CommitRoll(D.Instance(smpDL) + '.' + BandName) ), 1 ), {Сформируем базовый критерий поиска записи в таблице документов} Const('DocNPP', Integer, Global, DCL.GetFieldVal(PRIM, 'NPP')), If(DocNPP = 0, Let(@DocNPP, 1)), Const('DocCriteriaBase', String, Global, If(DocNPP = 1, '(NPPH <= 1 OR NPPH IS NULL)', 'NPPH=' + DocNPP)), Const('OnlyThirdPartRegKey', String, Global, 'В описи-2010 только 3 раздел'), If(Pos('_INT', PPDName), Let(@OnlyThirdPartRegKey, 'Во внутренней описи только 3 раздел') ), Const('StartPart', Integer, Global, If(DCL.GetRegString('HKCU', AppRegKey('MAIN\ПЕЧАТЬ'), OnlyThirdPartRegKey, '0') = '1', 3, 1)), Const('PartsCount', Integer, Global, If(RNDForm * PrintPartHeaders, 4, 3)), Const('Part', Integer, Global, StartPart), DimArray('PrintAdditionalEmptyRows', Integer, StartPart, PartsCount), While(Part <= PartsCount, Block( Let('Global.PrintAdditionalEmptyRows' + Part, DCL.GetFieldVal(PRIM, 'EmptyLines' + If(Part = 4, 3, Part))), Let(@Part, Part + 1) ) ), If(Not(PrintPartHeaders) * (StartPart = 1), Block( Let(@Part, 1), While(Part <= PartsCount, Block( If(Part < PartsCount, Block( Let('Global.PrintAdditionalEmptyRows' + PartsCount, Value('Global.PrintAdditionalEmptyRows' + PartsCount) + Value('Global.PrintAdditionalEmptyRows' + Part) ), Let('Global.PrintAdditionalEmptyRows' + Part, 0) ) ), Let(@Part, Part + 1) ) ) ) ), Var('DocCriteria', String, Global), Let(@Part, StartPart), While(Part <= PartsCount, Block( Let(@DocCriteria, DocCriteriaBase + ' AND PART = ' + Part), Let(@BufInt, DCL.FindFirst(DOP, DocCriteria)), {заголовок раздела - по настройке} If(PrintPartHeaders, Block( smpDL.SDP('Part_' + If(Part = 4, 3, Part)), If(Part = 4, Block( smpDL.SFP('T1', 'Caption', 'Документы, оформленные таможенным органом'), smpDL.SFP('T1', 'FontBold', 1), smpDL.Update() ) ), {добавление записи} RollTableRow() ) ), {проход по записям раздела} smpDL.SDP('Table_Data'), While(BufInt, Block( ClearPage(smpDL), FillPage(smpDL, DOP), If(SimpleNumMode, Block( Let(@NPP, NPP + 1), smpDL.SFP('№ п/п', 'Caption', NPP) ) ), Let(@BufMemo, ConvertToMemo(DCL.GetFieldVal(DOP, 'DOC_VID'))), If(IsTransitDocList, Block( Var('BufDocNumMemo', Memo, Local), Let(@BufDocNumMemo, ConvertToMemo(DCL.GetFieldVal(DOP, 'DOC_NUM'))), AddStrToSnake(@BufDocNumMemo, Supress('от ',DCL.GetFieldVal(DOP, 'DOC_DATE'))), smpDL.SFP('Номер и дата документа', 'Caption', BufDocNumMemo) ), Block( AddStrToSnake(@BufMemo, DCL.GetFieldVal(DOP, 'DOC_NUM')), AddStrToSnake(@BufMemo, Supress('от ',DCL.GetFieldVal(DOP, 'DOC_DATE'))) )), If(BufMemo = "", Let(@BufMemo, " ")), If(DCL.GetFieldVal(DOP, 'DOC_STATE') = 'К', If(PrintCopySuffix = '1', AddStrToSnake(@BufMemo, '-копия')), If(PrintCopySuffix1 = '1', AddStrToSnake(@BufMemo, '-оригинал')) ), smpDL.SFP('Документ', 'Caption', BufMemo), Use('doclistprim.ppu'), smpDL.Update(), smpDL.Recalc(), MakeTableLines(smpDL, 'L', 1, 7, 'L8'), {важно определить BufInt до RollTableRow} Let(@BufInt, DCL.FindNext(DOP, DocCriteria)), {добавление записи} RollTableRow() ) ), {While BufInt} {добавление пустых строк} ClearPage(smpDL), smpDL.Update(), smpDL.Recalc(), MakeTableLines(smpDL, 'L', 1, 7, 'L8'), While(Value('Global.PrintAdditionalEmptyRows' + Part), Block( Let('Global.PrintAdditionalEmptyRows' + Part, Value('Global.PrintAdditionalEmptyRows' + Part) - 1), RollTableRow() ) ), Let(@Part, Part + 1) ) ), {While Part <= PartsCount} {Подпись под таблицей - основной блок} DL.Roll(D.Instance(smpDL)+'.Footer'), {Подпись под таблицей - количество документов и листов} If(UseTotalPages, Block( smpDL.SDP(Footer2Name), ClearPage(smpDL), Use('doclist-totalinf.ppu'), smpDL.Update(), DL.Roll(D.Instance(smpDL) + '.' + Footer2Name) ) ), {Подпись под таблицей - штамп для таможни} If(UseCustomsMarksBand, DL.Roll(D.Instance(smpDL) + '.CustomsMarks') ) )