Block( Use(SystemDir+'docdrv.ppu'), If(IsVTT,Let(@AktType,1)), Const('CustomName',String,Global,DCL.GetRegString('HKCU','Software\CTM\DCL\MAIN\USER','CustomCode','')), If(Length(CustomName), Let(@CustomName,DCL.GetNSIInfo('KTAM1','CODE',CustomName,'NAMT','(DATAS IS NULL OR DATAS>=DATE())')) ), {Поручение на досмотр =_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_ } smpAKT.SDP('Поручение 689-р'), CleanCaptions(smpAKT), Const('Import',Integer,Global,1), Let(@BufString,UCase(DCL.GetFieldVal(PRIM,'G011'))), If(BufString='ЭК',Let(@Import,0)), Const('Nomer',String,Global,Left(DCL.GetND(DCL.GetFieldVal(PRIM,'ND')),16)), smpAKT.SFP('№ Поручения','Caption',Nomer), If(Length(CustomName),smpAKT.SFP('T2','Caption',CustomName)), Var('ts',Memo,Global), Var('sdoc',Memo,Global), Use('getdkd.ppu'), smpAKT.SFP('ТC','Caption',ts), smpAKT.SFP('Документы','Caption',sdoc), Const('sGrRus',String,Global,If(Import,'8','2')), Let(@BufString, Trim( If(AppId='DCL', SupressCRLFInMemo(GetMemoVal(PRIM, 'G0' +sGrRus +'2', 0)), SupressCRLF(DCL.GetFieldVal(PRIM, 'G0' +sGrRus +'2')) ) +' '+ Supress('код ОКПО ',DCL.GetFieldVal(PRIM, 'G0' +sGrRus +'1'))+' '+ Supress('ИНН ',DCL.GetFieldVal(PRIM, 'M0' +sGrRus +'1')) ) ), smpAKT.SFP('Фирма','Caption',BufString), smpAKT.SFP('Страна','Caption',DCL.GetFieldVal(PRIM,'G15')), smpAKT.SFP('Мест','Caption',DCL.GetFieldVal(PRIM,'G06')), smpAKT.SFP('Нетто','Caption',Supress(Zero(DCL.GetFieldVal(ITOGI,'SumG38'),'%g'),' кг')), smpAKT.SFP('Брутто','Caption',Supress(Zero(DCL.GetFieldVal(ITOGI,'SumG35'),'%g'),' кг')), smpAKT.SFP('Место назначения','Caption',DCL.GetFieldVal(PRIM,'G17B')), smpAKT.SFP('Место досмотра','Caption',DCL.GetFieldVal(PRIM,'G30')), smpAKT.Update(), smpAKT.Recalc(), AKT.Roll(D.Instance(smpAKT)+'.Поручение 689-р'), AKT.RollBreak(), {Акт досмотрa =_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_ } { Вся работа: 1 - подготовим страницу лицевой стороны первого листа; она одинакова для любого товара и пойдёт в чистовик по необходимости не один раз 2 - печатаем НЕавтотранспортные товары (общая линованая форма оборота) 3 - печатаем автотранспортные товары (специальные формы оборота) 4 - печатаем пустой экземпляр линованного доплиста } smpAKT.SDP('АТД ПК1166 стр 1'), CleanCaptions(smpAKT), smpAKT.SFP('№ Акта','Caption',Nomer), If(Length(CustomName), smpAKT.SFP('Таможня', 'Caption', CustomName)), smpAKT.SFP('Грузоотправитель', 'Caption', Trim( If(AppId='DCL', SupressCRLFInMemo(GetMemoVal(PRIM, 'G022', 0)), SupressCRLF(DCL.GetFieldVal(PRIM, 'G022')) ) + ' ' + Supress('ОКПО ', DCL.GetFieldVal(PRIM, 'G021'), ' ') + Supress('ИНН ', DCL.GetFieldVal(PRIM, 'M021')) + If(AktType=2, ts, '') )), Let(@BufString,DCL.GetFieldVal(PRIM,If(Import,'G15','G17B'))), smpAKT.SFP('Страна','Caption',BufString), smpAKT.SFP('Грузополучатель','Caption', Convert(Trim( JoinDelim(', ', If(AppId='DCL', SupressCRLFInMemo(GetMemoVal(PRIM, 'G0' + sGrRus + '2', 0)), SupressCRLF(GetFieldVal(PRIM, 'G0' + sGrRus + '2')) ), Supress('ОГРН ',DCL.GetFieldVal(PRIM, 'G0' + sGrRus + '0')), Supress('ИНН ',DCL.GetFieldVal(PRIM, 'M0' + sGrRus + '1')) ) ),Memo ) ), smpAKT.SFP('Документы','Caption',sdoc), smpAKT.SFP('Место досмотра','Caption', JoinDelim(' ', DCL.GetFieldVal(PRIM,'G271'), Supress('от ', DCL.GetFieldVal(PRIM,'G2711')), DCL.GetFieldVal(PRIM,'G27ADD'), DCL.GetFieldVal(PRIM,'G2712') )), smpAKT.SFP('Мест','Caption',DCL.GetFieldVal(PRIM,'G06')), smpAKT.SFP('Брутто по документам','Caption',Zero(DCL.GetFieldVal(ITOGI,'SumG35'),'%g')), smpAKT.SFP('ТС','Caption',ts), smpAKT.Update(), smpAKT.Recalc(), { Дать имя последней, только что напечатанной странице чистовика } { Func('NameLastPage', Local, Internal, Block( Param('SheetNumber', Integer, 0), Param('BackOfSheet', Integer, 1) ), AKT.HRDP(AKT.DPC() - 1, 'Акт досмотра, лист ' + SheetNumber + Supress(' (', If(BackOfSheet, 'обратная сторона', 'лицевая сторона'),')') ), ), } {) компенсация закавыченной скобки для Bracket Matching в текстовом редакторе } { Страница оборота начнётся не сразу по RollBreak, а на следующем за ним Roll } Const('BeginWithPage', Integer, Local, AKT.CurrPage()), Const('NextPage', Integer, Local, False), Func('CheckNextPage', Local, Internal, , Let(@NextPage, AKT.IsNewPage() * (AKT.CurrPage() > BeginWithPage)), ), { Считаем листы, отмечаем переход на оборот } Var('SheetNumber', Integer, Local), Var('BackOfSheet', Integer, Local), Func('CountSheet', Local, Internal, , Block( Let(@BackOfSheet, Not(BackOfSheet)), If(BackOfSheet=False, Let(@SheetNumber, SheetNumber + 1)) ),), { Установить колонтитулы доп. листа } Func('SetInterleafBands', Local, Internal, , Block( If(SheetNumber > 1, Block( AKT.SetBottomBands(D.Instance(smpAKT)+'.АТД ПК1166 доп низ'), If(BackOfSheet=True, AKT.SetTopBands(""), Block( smpAkt.SDP('АТД ПК1166 доп верх'), smpAKT.SFP('Лист', 'Caption', SheetNumber), smpAKT.Update(), AKT.SetTopBands(D.Instance(smpAKT)+'.АТД ПК1166 доп верх') ) ) )) ),), { Определить форму автотранспортного оборота; вернёт пусто, если не автотр. } Const('TnvedCodes', Memo, Local, "8701"+"8702"+"8703"+"8704"+"8711"+"8716"), Func('CarFormID', Local, Internal, Block( Param('TnvedCode', String, 0), If(Length(TnvedCode) > 4, Let(@TnvedCode, Copy(TnvedCode, 1, 4))), Var('Result', String, Local) ), Let(@Result, If(GetIndexOfString(@TnvedCodes, TnvedCode) < 0, '', TnvedCode ) ), Result ), { Печатаем первый раз готовую первую страницу в любом случае } AKT.Roll(D.Instance(smpAKT)+'.АТД ПК1166 стр 1'), Const('Face1NotPrinted', Integer, Local, False), { Подготовим доплист } smpAkt.SDP('АТД ПК1166 доп верх'), CleanCaptions(smpAKT), smpAKT.SFP('№ Акта','Caption',Nomer), smpAKT.Update(), Const('Printed', Integer, Local, False), { признак, что в прошедшем цикле что-то печаталось, чтобы добавить линовку или ещё что } { Если найдутся товары с НЕавтотранспортными кодами, то сейчас они будут перечислены на обороте и линованных доплистах, и предварены лицевой стороной первого листа } AKT.RollBreak(), AKT.SetTopBands(""), AKT.SetBottomBands(D.Instance(smpAKT)+'.АТД ПК1166 обр 1'), Let(@SheetNumber, 1), Let(@BackOfSheet, False), { после RollBreak до Roll мы всё ещё на разорванной странице } Let(@Printed, False), DCL.MoveFirst(DOP), While(Not(DCL.IsEOF(DOP)), Block( If(CarFormID(DCL.GetFieldVal(DOP,'G33')) = '', Block( { не автомобильный } { перечисление товаров } Let(@Printed, True), SmpAkt.SDP('WareInfo'), Let(@BufMemo,""), AddStrToSnake(@BufMemo,SupressCRLF(DCL.GetFieldVal(DOP,'G312'))+' '), AddStrToSnake(@BufMemo,DCL.GetFieldVal(DOP,'AddToG312')+' '), AddStrToSnake(@BufMemo,Supress('Товарные знаки:',DCL.GetFieldVal(DOP,'G317TVZ'))+' '), Let(@BufString,Zero(DCL.GetFieldVal(DOP,'FIZ_KOL'),'%g')), AddStrToSnake(@BufMemo,BufString+' '+DCL.GetFieldVal(DOP,'FIZ_NAME')+' '), Let(@BufString,Zero(DCL.GetFieldVal(DOP,'DOP_KOL'),'%g')), AddStrToSnake(@BufMemo,BufString+' '+DCL.GetFieldVal(DOP,'DOP_NAME')+' '), If(IsVTT, AddStrToSnake(@BufMemo,DCL.GetFieldVal(DOP,'G311')+' '+DCL.GetFieldVal(DOP,'UPAK')+' '), AddStrToSnake(@BufMemo,Zero(DCL.GetFieldVal(DOP,'G311'),'%d')+' '+DCL.GetFieldVal(DOP,'UPAK')+' ') ), AddStrToSnake(@BufMemo,DCL.GetFieldVal(DOP,'MARKS')), smpAKT.SFP('WareString', 'Caption', bufMemo), smpAKT.Update(), smpAKT.Recalc(), AKT.PrepareRoll(D.Instance(smpAKT)+'.WareInfo'), CheckNextPage(), if(NextPage, Block( Let(@NextPage, False), { все товары не поместились на обороте осн. листа АТД, переходим к доп. листам } CountSheet(), SetInterleafBands() )), AKT.CommitRoll(D.Instance(smpAKT)+'.WareInfo') )), DCL.MoveNext(DOP) )), { долиновать лист до конца } Func('LineSpace', Local, Internal, Block( Const('Result', Integer, Local, False), Const('NewPageStarted', Integer, Local, False) ), Block( smpAkt.SDP('Линия'), While((Akt.Space() > smpAkt.Height()), Block( Akt.PrepareRoll(D.Instance(smpAKT) + '.Линия'), Let(@NewPageStarted, Akt.IsNewPage()), If(Result=False, Let(@Result, NewPageStarted)), If(NewPageStarted, Block( CountSheet(), SetInterleafBands() )), Akt.CommitRoll(D.Instance(smpAKT) + '.Линия') )) ), Result ), If(Printed, Block( Let(@Face1NotPrinted, True), LineSpace(), AKT.RollBreak() { конец оборота первого листа или доп. листа общей формы } )), { Очень вспомогательная функция: используется только в контексте цикла ниже. Сестра FirstValuedStr. Первый параметр - образец нулевого значения, любое количество остальных параметров - имена полей в известном запросе. Вернёт строчное значение - значение того из полей, которое не пустое и не нулевое. Valued('', 'GTDAVTO.NAMEMRKCAR', 'CARDTS.NAMEMRKCAR') Valued('0', 'PROBEG', 'CARDTS.WORK') } Func('Valued', Local, Internal, Block( Param('ZeroValue', String, 0), Const('i', Integer, Local, 1), Const('Count', Integer, Local, ParamCount() - i), Const('Loop', Integer, Local, If(i < Count, True, False)), Const('Result', String, Local, '') ), Block( While(Loop, Block( Let(@Result, Convert(GetParam(i), String)), Let(@Result, DCL.GetFieldVal(CARDTS, Result)), If(Result <> '', If(Result <> ZeroValue, Let(@Loop, False) )), Let(@i, i + 1), If(i = Count, Let(@Loop, False)) )) ), Result ), { Если найдутся товары с автотранспортными кодами, то теперь пойдут для них листы с оборотом специальной формы } { Чтобы сидеть на двух стульях - выполнять этот код и в dcl и в vtt, добавим немножко ветвлений всвязи с тем, что в vtt нет информации об автомобиле и обращение к ней надо здесь пропускать. } Const('CarDataSrcId', Integer, Local, If(IsVtt, DOP, CARDTS)), { не используем инф. об авто в vtt } Const('BackName', String, Local, ''), AKT.SetTopBands(""), AKT.SetBottomBands(""), { сбросим чужие колонтитулы } DCL.MoveFirst(CarDataSrcId), While(Not(DCL.IsEOF(CarDataSrcId)), Block( Let(@BackName, CarFormID(DCL.GetFieldVal(CarDataSrcId,'G33'))), If(BackName <> '', Block( { осн. лист с автомобильным оборотом } If(BackName = '8702', { если под кодом 8702 скрывается не автобус, то пойдёт он на форму оборота 8703 (автомобиль) } If(IsVtt, If(Pos('АВТОБУС', UpCase(DCL.GetFieldVal(DOP,'G312'))) = 0, Let(@BackName, '8703') ), If(Not(Convert((DCL.GetFieldVal(CARDTS, 'CARDTS.TIPTS') = '40'), Integer) + Convert((DCL.GetFieldVal(CARDTS, 'CARDTS.KATEGTS') = 'D'), Integer) ), Let(@BackName, '8703') ) ) ), { лицо осн. листа может быть уже раз напечатано } If(Face1NotPrinted, Block( AKT.Roll(D.Instance(smpAKT)+'.АТД ПК1166 стр 1'), AKT.RollBreak() )), Let(@Face1NotPrinted, True), { далее каждый раз печатаем здесь лицо } { авторанспортный оборот листа определённой формы } smpAkt.SDP('АТД ПК1166 обр ' + BackName), {При первом проходе запоминаем исходное состояние надписи к объему и мощности, иначе потом ее неоткуда взять (bug 9908)} If(sVolAndPowerBaseCaption='',Let(@sVolAndPowerBaseCaption,smpAkt.GFP('Объём и мощн надпись', 'Caption'))), CleanCaptions(smpAKT), { не используем инф. об авто в vtt } If(IsVtt = 0, Block( smpAkt.SFP('Марка', 'Caption', Valued('', 'GTDAVTO.NAMEMRKCAR', 'CARDTS.NAMEMRKCAR') ), smpAkt.SFP('Модель', 'Caption', Valued('', 'GTDAVTO.MODEL', 'CARDTS.MODEL') ), smpAkt.SFP('Марка модель', 'Caption', JoinDelim(',', Valued('', 'GTDAVTO.NAMEMRKCAR', 'CARDTS.NAMEMRKCAR'), Valued('', 'GTDAVTO.MODEL', 'CARDTS.MODEL') )), smpAkt.SFP('Год выпуска', 'Caption', DCL.GetFieldVal(CARDTS, 'GOD')), smpAkt.SFP('VIN', 'Caption', Valued('', 'ID', 'VIN')), Let(@BufString, Valued('', 'GTDAVTO.MODDVIG', 'CARDTS.MODDVIG')), smpAkt.SFP('Модель двигателя', 'Caption', BufString), smpAkt.SFP('Номер двигателя', 'Caption', If((Length(BufString)>0) * ((Pos(BackName, '8703,8711') > 0)), BufString + ' - ', '') + Valued('', 'NDV', 'NUMDVIG') ), Let(@BufString, Valued('', 'NKUZ', 'KUZOV')), If(DCL.Like(BufString, '*#*') = 0, Block( Let(@BufString, Valued('', 'NSH', 'SHASSI')), smpAkt.SFP('Номер рамы надпись', 'Enable', True) ), smpAkt.SFP('Номер рамы надпись', 'Enable', False) ), smpAkt.SFP('Номер кузова или рамы', 'Caption', BufString), smpAkt.SFP('Цвет', 'Caption', Valued('', 'GTDAVTO.ZVET', 'NCV')), smpAkt.SFP('Тип двигателя', 'Caption', Valued('', 'GTDAVTO.NAMEDV', 'CARDTS.NAMEDV')), Let(@BufString, Valued('0', 'OBEM', 'OBDVIG')), smpAkt.SFP('Объём двигателя', 'Caption', BufString), Let(@BufString2, ''), Let(@BufString1, DCL.GetFieldVal(CARDTS, 'POWERLS')), If(BufString1 <> '0', Block( Let(@BufString, BufString + ' / ' + BufString1), Let(@BufString2, smpAkt.GFP('Объём и мощн надпись', 'CaptionHP')) )), Let(@BufString1, DCL.GetFieldVal(CARDTS, 'POWERKW')), If(BufString1 <> '0', Block( Let(@BufString, BufString + ' / ' + BufString1), Let(@BufString2, BufString2 + smpAkt.GFP('Объём и мощн надпись', 'CaptionKWT')) )), If(Length(BufString2) > 0, smpAkt.SFP('Объём и мощн надпись', 'Caption', sVolAndPowerBaseCaption + smpAkt.GFP('Объём и мощн надпись', 'CaptionPowerPre') + BufString2), smpAkt.SFP('Объём и мощн надпись', 'Caption', sVolAndPowerBaseCaption) ), smpAkt.SFP('Объём и мощн', 'Caption', BufString), Let(@BufString, Valued('0', 'PROBEG', 'WORK')), { дополнить пробег нулями слева до 6 знаков } If(Length(BufString) < 6, Let(@BufString, Copy('00000', 1, 6 - Length(BufString)) + BufString )), smpAkt.SFP('Пробег', 'Caption', BufString), smpAkt.SFP('Количество мест', 'Caption', DCL.GetFieldVal(CARDTS, 'CARDTS.MEST')), smpAkt.SFP('Рег. знак', 'Caption', '') )), smpAKT.Update(), AKT.Roll(D.Instance(smpAKT)+'.АТД ПК1166 обр ' + BackName), AKT.RollBreak(), { после последнего RollBreak до очередного Roll мы фактически всё ещё на оборванной страницы, то есть на обороте первого листа } Let(@SheetNumber, 1), Let(@BackOfSheet, True) )), DCL.MoveNext(CarDataSrcId) )), { Всегда допечатываем один пустой экземпляр доплиста для ручного заполнения } LineSpace(), { оборот } AKT.RollBreak(), LineSpace(), DCL.SetStatus('Печать'), AKT.HSDP(0) )